¿Los ingenieros informáticos que programan el hardware (CPU, GPU, RAM, placa base, etc., etc.) usan lenguaje ensamblador?

Hay una cosa llamada lenguaje de descripción de hardware (HDL). Imagina que le das a un grupo de transistores lógicos una matriz de bytes. Le dice las instrucciones para ordenar la matriz como lo haría con su práctico compilador ASM. ¿Adivina qué pasa? No puede Porque no sabe qué es Assemby. Pero conoce a Verilog, un HDL notable, por ejemplo.

Esto no se debe a que Verilog pueda programar hardware, sino a que Verilog lo organiza en una función lógica específica. Y la diferencia va aquí.

Assembly es un lenguaje de programación de software que difiere de HDL. Al ensamblaje no le importa cómo conectaría este bloque lógico a otro para comprender este operador de ensamblaje. Para eso no se diseñó ningún lenguaje ensamblador. Dado el mismo código de ensamblaje x86, funcionaría en un 8086 y un Core i7, nada diferente. Pero su estructura representada por HDL sería enormemente diferente.

Dicho esto, solo cuando creaste algo con HDL, entonces comenzarías a tener su ensamblaje de trabajo.

Algo que tal vez no esté relacionado con la pregunta que me gustaría aclarar. Las placas base no son más que cables y ASIC personalizados, como BIOS, NIC, códec de audio, aparte del chipset y el zócalo (la mayoría de las placas base de grado del cliente). Entonces no hay programación aquí. Esto es lo mismo con RAM, CPU y GPU. Las CPU y GPU están programadas por software. Carga el programa desde la memoria y lo ejecuta sin cambios estructurales en el silicio. Los FPGA podrían cambiar sus puertas internamente para formar un bloque lógico. Eso es algo imposible (y sin propósito) para piezas de PC. Las RAM son aún más simples: grupos de nanocondensadores para DRAM o 6 transistores por celda para SRAM, dispuestos repetidamente en líneas. Nada especial.

Nota: no soy un profesional en esta área, pero eso es lo que sé al respecto. Podría haber un lugar inexacto, pero creo que las cosas no han cambiado mucho en 5 años.

Otros ya han dicho esto, y estoy de acuerdo: para la gran mayoría de las cosas, no.

Hay lugares donde el ensamblaje aún tiene sentido dentro de una computadora moderna una vez que se encuentra debajo del sistema operativo y las aplicaciones:

  • Microcontroladores integrados. Si hay un microcontrolador de $ 0.25 o $ 0.50 en el tablero (generalmente controlando algo mundano como un teclado o un interruptor de encendido), puede estar codificado en código de ensamblaje. Algunos de esos microcontroladores solo tienen espacio para ~ 1 KB o menos de código. (¡La MCU vinculada tiene espacio para 384 bytes de código!) A veces, estos controladores son parte de un SoC más grande.
  • Instrucciones especiales / registros / modos . Las CPU x86 modernas tienen algo llamado Modo de administración del sistema, que tiene instrucciones especiales y registros dedicados para manipular el estado de la máquina. Lo más probable es que aparezcan como ensamblaje en línea en el código fuente de su BIOS. Además, el código que maneja la activación / desactivación de estos modos puede estar en ensamblado.
  • Cambio de contexto / tiempo de ejecución de bajo nivel . Incluso fuera de los modos especiales, generalmente necesita un código de ensamblaje para configurar el entorno de tiempo de ejecución para idiomas de nivel superior y manejar tareas de interrupción. Aquí hay un ejemplo aleatorio que encontré con una búsqueda rápida.

El código de ensamblaje todavía aparece en todos los niveles, pero como porcentaje del código que se ejecuta en un sistema moderno, generalmente es minúsculo: de 100 a 1000 líneas de código en comparación con 100,000 a 1,000,000 o incluso 100,000,000 de líneas en otros lugares.

No. Fuera de la academia, no conozco a nadie que use lenguaje ensamblador. Tienen una gran cantidad de herramientas a su disposición para esto.

Las primeras computadoras fueron programadas por ingenieros, que codificaron directamente en lenguaje de máquina (1ra generación). Por supuesto, las computadoras eran simples y no tenían mucha memoria. El lenguaje ensamblador fue un gran paso adelante.

Cuando el lenguaje ensamblador (segunda generación) se hizo popular, todavía era lo suficientemente complejo como para que los técnicos informáticos sintieran que tenían seguridad laboral.

Cuando FORTRAN y COBOL, que representaban a la tercera generación, se hicieron cargo, se quejaron de que los programadores ya no tenían que saber cómo funcionaba la computadora. Era mucho más simple, y eso no podía ser bueno.

En la progresión de la informática, siempre ha sido hacia lenguajes de programación que son, por un lado, más sofisticados y, por otro, más sencillos de aprender. Nunca obtendrías ganancias si se necesitara alguien con un título en ingeniería para hacer el trabajo.

A veces tienes que hacerlo, pero muchas veces los idiomas normales son suficientes. Algunas tarjetas (GPU, tarjetas de captura, etc.) tienen un código de bytes, debe escribir en ese idioma (similar a un procesador RISC) y cargar ese código, establecer un puntero y ejecutarlo. He completado controladores en C, C ++ y he hecho algunos en Asm / C / C ++ mixtos. Solo depende de la herramienta adecuada para el trabajo.

Como se indica en todas las otras respuestas, generalmente no . Los últimos bastiones del ensamblaje real a nivel de máquina son arquitecturas incrustadas , donde se utiliza un microcontrolador (que no está equipado con un reloj de tiempo real de ningún tipo) para realizar operaciones que necesitan ser temporizadas al ciclo de reloj individual en Para ser exactos.
es decir, no hay necesidad de operar con ensamblaje (o cualquier otro RISC) a menos que esté “contando relojes” y no pueda estar seguro del número exacto de ciclos de instrucción que producirá un código compilado de lo contrario.

Por lo general, se necesita una pequeña cantidad de lenguaje ensamblador. Pero esto generalmente se escribe una vez, temprano en la vida del sistema, y ​​se comparte entre muchas instancias diferentes. Un ejemplo es el RTOS – Sistema operativo en tiempo real. El mismo RTOS se comparte en muchos proyectos. Incluso a nivel de hardware, la gran mayoría del código está escrito en lenguajes de nivel moderadamente alto como C.

En general, los únicos programadores que programan directamente al hardware en la computadora son los escritores de “controlador de dispositivo”, y hacen lo menos posible. Lo contrario sería un caos, ya que tendría que entender cómo esta GPU difiere de la otra GPU, etc. antes de poder escribir incluso el más simple de los programas. Lo que se hace es que se extrapola un conjunto común de características para un “tipo” de hardware dado y los fabricantes de ese “tipo” de hardware escriben un controlador de dispositivo que une la interfaz común con el sistema operativo en un lado y el específico implementación del dispositivo en el otro lado.

Piense en una computadora como un pastel de capas, la parte inferior del pastel es el hardware, encima de eso están los controladores de dispositivos, que están acorralados en el siguiente nivel por el kernel, luego capa por capa se construye hasta que pueda ejecutar el navegador que estás usando para leer mi respuesta. Pero el escritor del navegador no tiene idea de que está ejecutando la tarjeta gráfica de la marca X con el disco duro de la marca K y la tarjeta de sonido de la marca Z. Sin embargo, pueden leer y escribir en el disco duro, mostrar texto usando la tarjeta gráfica y reproducir videos de YouTube.