Por lo general, me encuentro con gurús en SO y otros lugares (instructores, autores de libros, etc.) que dirían algo en la línea "This will cause alignment issues"
u otras cositas de bajo nivel.
Quiero aprender sobre todas estas cositas que son relevant
para la programación. Ahora, por lo general, cuando veo libros de bajo nivel (libros de arquitectura de computadoras, por ejemplo) son de nivel demasiado bajo y están dirigidos a personas cuyo área de interés principal es la arquitectura de computadoras y no el diseño de software.
¿Tiene recomendaciones para libros que pasan por cosas de bajo nivel que son relevantes para los programadores?
low-level
computer-architecture
Samaursa
fuente
fuente
Respuestas:
Un buen conjunto de libros precisamente para este propósito es la serie "Write Great Code" de Randall Hyde ( Vol.1 Vol. 2 ): descripción de la arquitectura de la máquina explícitamente desde la perspectiva de lo que necesita saber para escribir código eficiente en lenguajes de alto nivel .
fuente
Lamentablemente, no conozco un equivalente moderno a los microprocesadores: una visión del programador de R. Dewar. Lo más cercano que conozco es Organización y diseño de computadoras, cuarta edición: La interfaz de hardware / software de David A. Patterson y John L. Hennessy, pero no estoy seguro de que no lo consideren demasiado bajo; seguramente lo harás por su otra obra, Computer Architecture, un enfoque cuantitativo.
En línea, este http://www-uxsup.csx.cam.ac.uk/courses/Architecture/course.pdf quizás le brinde lo que desea.
fuente
Para las plataformas x86, tome una copia de los manuales del procesador Intel IA-32 e Intel 64 . El manual de referencia de optimización analiza muchos de estos problemas desde una perspectiva de bajo nivel para las CPU Intel x86. AMD también tiene manuales similares que cubren los mismos problemas.
La mayoría de las otras arquitecturas de CPU tienen manuales similares que discuten problemas de rendimiento. ( Por ejemplo, ARM y PowerPC .)
fuente
Encuentro que "Arquitectura de computadora: un enfoque cuantitativo" de Hennessy y Patterson ( enlace de Amazon ) es un enfoque muy sólido y sólido de la arquitectura de computadora, con bastantes estudios de casos que son directamente relevantes para la programación.
Se utiliza en diversos grados en varios cursos de arquitectura CS de pregrado y posgrado en los Estados Unidos.
También recibió una gran crítica en Ars Technica hace un tiempo.
fuente
Esto es lo que estoy usando en mi clase de Computer Systems ahora Computer Systems: A Programmer's Perspective (2nd Edition) y aunque la clase acaba de comenzar, lo he investigado y realmente me gusta.
Aquí está la descripción del libro:
fuente
Es mucho trabajo, pero la Pragmática del lenguaje de programación puede ser exactamente lo que estás buscando. El libro trata teóricamente sobre todo de análisis y compilación (que es un conocimiento esencial para aquellos que realmente quieren aprender programación) y en el proceso terminarás aprendiendo cómo los conceptos del lenguaje se traducen en lo que está sucediendo en un nivel bajo. Mejor aún, aprenderá esto para muchos idiomas a la vez y podrá comparar y contrastar inteligentemente cómo funcionan realmente los diferentes idiomas.
No puedo recomendarlo a menos que pueda dedicar varios meses a aprender el material. No es el tipo de cosas que simplemente hojea y de repente se ilumina. Pero si habla en serio, lo recomiendo encarecidamente.
fuente
Puede ser falso en biología, pero en informática, la "ontogenia recapitula la filogenia" casi casi. Una descripción histórica de las arquitecturas informáticas desde las primeras computadoras es una excelente manera de comprender el tema de la arquitectura informática desde la perspectiva de un programador; Los diseños de computadora son casi todos refinamientos de diseños anteriores.
Es decir, recomiendo estudiar diseños completos de sistemas más antiguos, en lugar de los libros teóricos de "arquitectura informática" que le dan en informática. Para comprender realmente el diseño de sistemas, y para hacer un gran trabajo al escribir software. La comprensión intuitiva de la arquitectura de los sistemas informáticos requiere el dominio de muchos conceptos. Creo que si comienzas de nuevo cuando las arquitecturas de computadora eran más manejables en tamaño y alcance, podrías lograr que tu padre escriba tu mejor código.
(La serie de libros de "escribir un código excelente" que otro tipo mencionó se ve genial, por cierto, y he editado mi pregunta para eliminar cualquier aspersión que había lanzado anteriormente sobre aprender de un libro, ¡porque se ve genial! )
Algunas cosas que enseñan arquitectura de computadora realmente bien:
Me gusta elegir máquinas de la década de 1980 como puntos de partida para explicar y demostrar cosas a las personas, porque fue cuando comencé a usar las computadoras. He utilizado la guía de referencia del programador Commodore 64 para mostrarle a la gente un lugar de salto donde el conocimiento de la programación y el conocimiento de la arquitectura de la computadora se encuentran. Con tal libro, y tal vez un emulador Commodore 64 que se ejecuta en su PC para que pueda probar cosas, aprenderá cómo se construyen realmente los sistemas informáticos en la encarnación clásica de la arquitectura de computadoras de la década de 1980. En mi opinión, un ejemplo concreto es un mejor lugar para comenzar, que una docena de modelos teóricos a los que les faltan los detalles del mundo real que hacen que las cosas funcionen. Si sabe qué es un registro, qué es una ALU, qué es un autobús y qué reloj es, y qué sistemas de señalización se utilizan en un diseño antiguo de la década de 1980, que le proporcionará los fundamentos que necesita saber para comprender algo reciente, como la "arquitectura de puente arenoso" de Intel. Históricamente, mire hacia atrás a los originales, por ejemplo, busque la arquitectura "Von neumann" en Wikipedia.
Avanzando desde mi primer punto unos años; Conozca la arquitectura original de PC de IBM, el lenguaje ensamblador 8086 y el bus ISA. A partir de esto, y sus limitaciones, la comprensión de lo que contiene una CPU "Intel COre i7", y lo que hacen los buses PCI y PCI-e y por qué los necesita, puede proceder de forma más natural. La arquitectura de PC hoy en día todavía tiene un poco de "resaca" del diseño original de PC de IBM. La forma en que se carga el programa inicial (sistema operativo) (arranque) en una PC 2011 todavía debe mucho a la herencia de la PC IBM original y su BIOS ROM, y su configuración CMOS en una PC original.
Utilice y modifique una compilación preconfigurada de Linux que funcione en algunos dispositivos integrados que no sean de PC, y aprenderá mucho sobre la arquitectura de computadoras integradas, no solo la arquitectura técnica, sino también por qué algunas de las características están ahí. Un buen ejemplo que está disponible barato es el TS-7200, que tiene una buena PC-104 (bus ISA, como en la PC original). Las computadoras PC-104 (bus ISA de 16 bits integrado que es compatible con los pines de las PC de la era PC / AT 80286 de IBM) son una excelente manera para que un diseñador que no sea de placa construya un sistema integrado, porque los módulos son apilables. ¿Quieres un extra de IO o periféricos? Solo apila algunos módulos. El TS-7200 tiene un núcleo no x86 (una CPU ARM9) que es capaz de ejecutar big-endian o little-endian. Si aún no se ha encontrado con el "endianness" en su viaje de aprendizaje de arquitectura, es un buen lugar para encontrarlo.
fuente
La mayoría de los libros sobre lenguaje ensamblador analizarán características de arquitectura relevantes, pero generalmente solo para la arquitectura a la que apunta el libro. Entonces obtendrá información sobre derrames de caché y técnicas de mapeo de páginas MMU, pero probablemente no sobre nada de endianness.
fuente