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 relevant
para 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?
low-level
computer-architecture
Samaursa
fonte
fonte
Respostas:
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 .
fonte
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.
fonte
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 .)
fonte
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.
fonte
É 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:
fonte
É 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.
fonte
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:
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.
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.
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.
fonte
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.
fonte