Aprendiendo arquitectura informática como programador [cerrado]

12

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 relevantpara 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?

Samaursa
fuente
44
¿Quieres "libros que pasan por cosas de bajo nivel" pero no quieres libros que sean demasiado "de bajo nivel"? La arquitectura de aprendizaje para algunos programadores puede ser extremadamente ventajosa. De forma análoga a un desarrollador web que comprende la pila TCP / IP. Nunca es tan útil hasta que REALMENTE lo necesite. \
Chris
1
@Chris: Lo que quise decir fue "bajo nivel para programadores" ... técnicamente podemos llegar tan lejos como la arquitectura de CPU completa, y sin duda será útil algún día, pero teniendo en cuenta que todos tenemos un tiempo limitado, un libro que enseña cosas de bajo nivel que todos los programadores deben saber serán perfectas.
Samaursa
En ese caso, cualquier libro introductorio lo llevará en la dirección correcta, donde lo tomará después de que sea su elección según la necesidad o el deseo.
Chris
Alguien que conduce un automóvil con transmisión automática se beneficia al saber qué es y cómo funciona mientras conduce. Creo que te conviertes en un mejor programador al aprender a programar al menos un poco, en lenguaje ensamblador, de la misma manera que creo que te conviertes en un mejor conductor cuando aprendes a "manejar el stick".
Warren P

Respuestas:

16

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 .

Kilian Foth
fuente
¿A qué idiomas de alto nivel se aplicaría esto? ¿Esto incluiría Python, JavaScript, C #, Scala por ejemplo?
Trabajo
@Job: no he leído los libros, pero diría que se aplicaría a cualquiera que pudiera / podría aprovechar cosas como el procesamiento de subprocesos múltiples y 64 bits. La ejecución de los idiomas que mencionó probablemente haría que ese conocimiento sea útil (especialmente si también es administrador de un servidor o ejecuta esos idiomas fuera de un entorno web).
Shauna
Hyde es un gurú del lenguaje ensamblador, por lo que para él "alto nivel" significa principalmente C. Pero su contenido es tan importante para los usuarios de idiomas aún más altos; Las cadenas, las llamadas a procedimientos, etc. realmente no son tan diferentes en el nivel de hardware, ya sea que se declaren en C o en Python.
Kilian Foth
Creo que cualquier lenguaje nativo compilado (C, C ++, Pascal, Objective-C) que también permita un poco de lenguaje ensamblador, se beneficiaría más de este libro. Sin embargo, las personas que usan Python y escriben extensiones para él en C, o incluso las personas que usan Java y no usan ningún método nativo, podrían pensar un poco más sobre el costo de lo que están haciendo, y cómo hacer su trabajo de manera eficiente dentro de la plataforma que están utilizando.
Warren P
Aunque todavía no he leído los libros, seleccionaré esta respuesta como correcta según las reseñas / resumen del libro.
Samaursa
6

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.

Un programador
fuente
El enlace al pdf está muerto.
ajay
5

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 .)

Greyfade
fuente
3

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.

Bitgarden
fuente
1
Si bien me gusta este libro, tengo las cuatro ediciones, está dirigido como arquitectos informáticos, no como programadores.
Programador
3

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:

Pocos estudiantes que estudian ciencias de la computación o ingeniería informática tendrán la oportunidad de construir un sistema informático. Por otro lado, la mayoría de los estudiantes deberán usar y programar computadoras casi a diario. Sistemas informáticos: la perspectiva de un programador presenta los conceptos importantes y duraderos que subyacen a los sistemas informáticos al mostrar cómo estas ideas afectan la corrección, el rendimiento y la utilidad de los programas de aplicación. El enfoque práctico del texto (que incluye un conjunto completo de laboratorios) ayuda a los estudiantes a comprender el funcionamiento "oculto" de un sistema informático moderno y los prepara para futuros cursos en temas de sistemas como compiladores, arquitectura informática, sistemas operativos, y redes.

Jetti
fuente
¡Ese es un libro asombroso!
Armando
2

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.

btilly
fuente
2

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:

  1. 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.

  2. 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.

  3. 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.

Warren P
fuente
0

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.

TMN
fuente