Aprendendo arquitetura de computadores como programador [fechado]

12

Normalmente, encontro gurus na SO e em outros lugares (instrutores, autores de livros etc.) que diriam algo "This will cause alignment issues"semelhante ou outros boatos de baixo nível.

Eu quero aprender sobre todos esses boatos que são relevantpara programação. Agora, normalmente, quando vejo livros de baixo nível (livros de arquitetura de computadores, por exemplo), eles são de nível muito baixo e voltados para pessoas cuja área de interesse principal é a arquitetura de computadores e não o design de software.

Você tem recomendações para livros que abordam assuntos de baixo nível que são relevantes para programadores?

Samaursa
fonte
4
Você quer "livros que passam por coisas de baixo nível", mas não quer livros que são "de baixo nível" demais? Aprender arquitetura para alguns programadores pode ser extremamente vantajoso. Análogo a um desenvolvedor da Web que entenda a pilha TCP / IP. Nunca é tão útil até que você realmente precise. \
Chris
1
@ Chris: O que eu quis dizer foi "baixo nível para programadores" ... tecnicamente, podemos ir até a arquitetura de CPU completa e, sem dúvida, será útil um dia, mas considerando que todos temos tempo limitado, um livro que ensina coisas de baixo nível que todos os programadores devem conhecer serão perfeitas.
Samaursa
Nesse caso, qualquer livro introdutório o levará na direção certa, para onde você o seguirá, depois de sua escolha, com base na necessidade ou no desejo.
23411 Chris
Alguém que dirige um carro com transmissão automática se beneficia de saber o que é e como funciona enquanto dirige. Eu acredito que você se torna um programador melhor aprendendo a programar pelo menos um pouco, em linguagem assembly, da mesma maneira que eu acho que você se torna um driver melhor quando aprende a "manobrar".
Warren P

Respostas:

16

Um bom conjunto de livros para esse fim é a série "Write Great Code" de Randall Hyde ( Vol.1 Vol. 2 ): descrição da arquitetura da máquina explicitamente da perspectiva do que você precisa saber para escrever código eficiente em linguagens de alto nível .

Kilian Foth
fonte
Em quais idiomas de alto nível isso se aplica? Isso incluiria Python, JavaScript, C #, Scala, por exemplo?
Job
@ Job - Eu não li os livros, mas eu diria que se aplicaria a qualquer um que poderia / poderia tirar proveito de coisas como multi-threading e processamento de 64 bits. A execução dos idiomas que você mencionou provavelmente tornaria esse conhecimento útil (especialmente se você também é um administrador de servidor ou executa esses idiomas fora de um ambiente da Web).
Shauna
Hyde é um guru da linguagem Assembly, então para ele "alto nível" significa principalmente C. Mas seu conteúdo é igualmente importante para usuários de idiomas ainda mais altos; Seqüências de caracteres, chamadas de procedimento etc. realmente não são tão diferentes no nível do hardware, sejam elas declaradas em C ou em Python.
Kilian Foth
Eu acho que qualquer linguagem compilada nativa (C, C ++, Pascal, Objective-C) que também permita um pouco de linguagem assembly, se beneficiaria mais com este livro. No entanto, pessoas que usam Python e escrevem extensões para ele em C, ou mesmo pessoas que usam java e não usam métodos nativos, poderiam pensar um pouco mais no custo do que estão fazendo e como fazer seu trabalho com eficiência na plataforma que estão usando.
Warren P
Embora ainda não tenha lido os livros, selecionarei esta resposta como correta com base nas resenhas / resumo do livro.
Samaursa
6

Infelizmente, não conheço um equivalente moderno de microprocessadores: uma visão de programador de R. Dewar. O mais próximo que conheço é Organização e Design de computadores, quarta edição: a interface de hardware / software de David A. Patterson e John L. Hennessy, mas não tenho certeza de que você não o considere muito baixo; você com certeza fará isso pela outra obra, Arquitetura de Computadores, uma abordagem quantitativa.

Online, este http://www-uxsup.csx.cam.ac.uk/courses/Architecture/course.pdf talvez dê o que você deseja.

AProgrammer
fonte
O link para o pdf está morto.
ajay
5

Para plataformas x86, pegue uma cópia dos manuais dos processadores IA-32 e Intel 64 da Intel . O manual de referência de otimização discute muitos desses problemas de uma perspectiva de baixo nível para as CPUs Intel x86. A AMD também possui manuais semelhantes que cobrem os mesmos problemas.

A maioria das outras arquiteturas de CPU possui manuais semelhantes que discutem problemas de desempenho. ( Por exemplo, ARM e PowerPC .)

greyfade
fonte
3

Considero "Arquitetura de Computadores: Uma Abordagem Quantitativa", de Hennessy e Patterson ( link da Amazon ), uma abordagem muito forte e sólida para a arquitetura de computadores, com alguns estudos de caso que são diretamente relevantes para a programação.

Ele é usado em vários níveis em vários cursos de arquitetura CS de nível de graduação e pós-graduação nos EUA.

Ele também recebeu uma ótima crítica sobre o Ars Technica há um tempo.

Bitgarden
fonte
1
Embora eu goste deste livro - possuo as quatro edições - ele é dirigido como arquiteto de computadores, não como programador.
AProgrammer
3

É isso que estou usando na minha classe Computer Systems agora, Computer Systems: A Programmer's Perspective (2ª Edição) e, enquanto a aula começou, eu olhei para ela e realmente gostei.

Aqui está a descrição do livro:

Poucos estudantes que estudam ciência da computação ou engenharia da computação terão a oportunidade de construir um sistema de computação. Por outro lado, a maioria dos estudantes precisará usar e programar computadores quase diariamente. Sistemas de computador: a perspectiva de um programador apresenta os conceitos importantes e duradouros subjacentes aos sistemas de computador, mostrando como essas idéias afetam a correção, o desempenho e a utilidade dos programas aplicativos. A abordagem prática do texto (incluindo um conjunto abrangente de laboratórios) ajuda os alunos a entender a operação "oculta" de um sistema de computador moderno e os prepara para cursos futuros em tópicos de sistemas como compiladores, arquitetura de computadores, sistemas operacionais, e networking.

Jetti
fonte
Esse é um livro incrível !!
Armando
2

É muito trabalhoso, mas a Pragmática da Linguagem de Programação pode ser exatamente o que você está procurando. Teoricamente, o livro trata principalmente de análise e compilação (que é um conhecimento essencial para quem realmente quer aprender programação) e, nesse processo, você aprenderá como os conceitos de linguagem se traduzem no que está acontecendo em um nível baixo. Melhor ainda, você aprenderá isso para vários idiomas ao mesmo tempo e poderá comparar e contrastar inteligentemente como os diferentes idiomas realmente funcionam.

Não posso recomendar a menos que você possa dedicar vários meses para realmente aprender o material. Não é o tipo de coisa que você apenas lê e é subitamente iluminado. Mas se você está falando sério, eu recomendo.

btilly
fonte
2

Pode ser falso na biologia, mas na ciência da computação "a ontogenia recapitula a filogenia" praticamente. Uma visão geral histórica das arquiteturas de computadores desde os primeiros computadores é uma ótima maneira de entender o assunto da arquitetura de computadores da perspectiva de um programador; os designs de computadores são quase todos os refinamentos dos designs anteriores.

Ou seja, eu recomendo estudar projetos completos de sistemas mais antigos, com base em livros teóricos de "arquitetura de computadores" que eles fornecem em ciência da computação. Realmente entender o design de sistemas e fazer um ótimo trabalho ao escrever software. A compreensão intuitiva da arquitetura de sistemas de computador exige o domínio de muitos conceitos. Eu acho que se você começar de novo quando as arquiteturas de computador forem mais gerenciáveis ​​em tamanho e escopo, poderá levar o pai a cumprir sua meta de escrever um código melhor.

(A propósito, essa série de livros "escreva código excelente" que outro cara mencionou parece ótima, e eu editei minha pergunta para remover qualquer aspersão que eu já havia lançado sobre aprender com um livro, porque parece ótimo! )

Algumas coisas que ensinam arquitetura de computadores muito bem:

  1. Eu gosto de escolher máquinas da década de 1980 como ponto de partida para explicar e demonstrar coisas às pessoas, porque foi quando comecei a usar computadores. Eu usei o guia de referência do programador do commodore 64, para mostrar às pessoas um ponto de partida onde o conhecimento de programação e o conhecimento da arquitetura de computadores se encontram. Com esse livro, e talvez um emulador de commodore 64 em execução no seu PC, para que você possa experimentar algumas coisas, você aprenderá sobre como os sistemas de computadores na encarnação clássica da arquitetura de computadores dos anos 80 são realmente construídos. Na minha opinião, um exemplo concreto é um lugar melhor para começar do que uma dúzia de modelos teóricos que estão perdendo os detalhes do mundo real que fazem as coisas funcionarem. Se você sabe o que é um registro, o que é uma ALU, o que é um ônibus e o que é um relógio, e quais sistemas de sinalização são usados ​​em um projeto antigo dos anos 80, que fornecerão os fundamentos que você precisa saber para entender algo recente, como a "arquitetura de ponte de areia" da Intel. Historicamente, analise os originais, por exemplo, consulte a arquitetura "Von neumann", na wikipedia.

  2. Avançando do meu primeiro ponto alguns anos; Aprenda sobre a arquitetura original do IBM PC, a linguagem de montagem 8086 e o ​​barramento ISA. A partir disso, e suas limitações, a compreensão do que uma CPU "Intel COre i7" contém e o que os barramentos PCI e PCI-e fazem e por que você precisa deles pode prosseguir com mais naturalidade. Hoje, a arquitetura do PC ainda tem um pouco de "ressaca" no design original do IBM PC. A maneira como o carregamento inicial do programa (sistema operacional) (inicialização) ocorre em um PC de 2011 ainda deve muito à herança do PC IBM original e seu BIOS ROM, e às configurações de CMOS em um PC original.

  3. Use e modifique uma compilação pré-configurada do Linux que funcione em algum dispositivo incorporado que não seja PC, e você aprenderá muito sobre a arquitetura de computadores incorporados, não apenas a arquitetura técnica, mas por que alguns dos recursos estão lá. Um bom exemplo disponível barato é o TS-7200, que possui um bom PC-104 (barramento ISA, como no PC original). Os computadores PC-104 (barramento ISA de 16 bits integrado que é compatível com pinos com os PCs da era IBM PC / AT 80286) são uma ótima maneira de um projetista que não seja de bordo criar um sistema incorporado, porque os módulos são empilháveis. Deseja IO ou periféricos extras? Apenas empilhe alguns módulos. O TS-7200 possui um núcleo não x86 (uma CPU ARM9) capaz de executar big-endian ou little-endian. Se você ainda não encontrou o "endianness" em sua jornada de aprendizado de arquitetura, esse é um bom lugar para encontrá-lo.

Warren P
fonte
0

A maioria dos livros sobre linguagem assembly discutirá recursos de arquitetura relevantes, mas geralmente apenas para a arquitetura que o livro está direcionando. Portanto, você obterá informações sobre derramamentos de cache e técnicas de mapeamento de página da MMU, mas provavelmente nada sobre endianness.

TMN
fonte