¿Código ensamblador versus código de máquina versus código objeto?

Resuelto mmcdole asked hace 15 años • 10 respuestas

¿Cuál es la diferencia entre código objeto, código máquina y código ensamblador?

¿Puedes dar un ejemplo visual de su diferencia?

mmcdole avatar Jan 22 '09 03:01 mmcdole
Aceptado

El código de máquina es código binario (1 y 0) que la CPU puede ejecutar directamente. Si abre un archivo de código de máquina en un editor de texto, verá basura, incluidos caracteres no imprimibles (no, no esos caracteres no imprimibles;)).

El código objeto es una parte del código de máquina que aún no está vinculada a un programa completo. Es el código de máquina de una biblioteca o módulo en particular que conformará el producto completo. También puede contener marcadores de posición o compensaciones que no se encuentran en el código de máquina de un programa completo. El vinculador utilizará estos marcadores de posición y compensaciones para conectar todo.

El código ensamblador es texto sin formato y (algo) código fuente legible por humanos que en su mayoría tiene un análogo directo 1:1 con instrucciones de máquina. Esto se logra utilizando mnemónicos para las instrucciones, registros u otros recursos reales. Los ejemplos incluyen JMPy MULTpara las instrucciones de salto y multiplicación de la CPU. A diferencia del código de máquina, la CPU no comprende el código ensamblador. El código ensamblador se convierte en código de máquina con el uso de un ensamblador o un compilador , aunque generalmente pensamos en compiladores asociados con lenguajes de programación de alto nivel que se abstraen aún más de las instrucciones de la CPU.


La creación de un programa completo implica escribir el código fuente del programa en lenguaje ensamblador o en un lenguaje de nivel superior como C++. El código fuente se ensambla (para código ensamblador) o se compila (para lenguajes de nivel superior) en código objeto, y los módulos individuales se vinculan entre sí para convertirse en el código de máquina para el programa final. En el caso de programas muy simples, es posible que el paso de vinculación no sea necesario. En otros casos, como en un IDE (entorno de desarrollo integrado), el vinculador y el compilador pueden invocarse juntos. En otros casos, se puede utilizar un complicado script de creación o un archivo de solución para indicarle al entorno cómo crear la aplicación final.

También hay lenguajes interpretados que se comportan de manera diferente. Los idiomas interpretados se basan en el código de máquina de un programa intérprete especial. En el nivel básico, un intérprete analiza el código fuente e inmediatamente convierte los comandos a nuevo código de máquina y los ejecuta. Los intérpretes modernos ahora son mucho más complicados: evalúan secciones enteras de código fuente a la vez, almacenan en caché y optimizan cuando es posible y manejan tareas complejas de administración de memoria.

Un último tipo de programa implica el uso de un entorno de ejecución o máquina virtual . En esta situación, primero se precompila un programa en un lenguaje intermedio de nivel inferior o código de bytes . Luego, la máquina virtual carga el código de bytes, que lo compila justo a tiempo en código nativo. La ventaja aquí es que la máquina virtual puede aprovechar las optimizaciones disponibles en el momento en que se ejecuta el programa y para ese entorno específico. Un compilador pertenece al desarrollador y, por lo tanto, debe producir código de máquina relativamente genérico (menos optimizado) que pueda ejecutarse en muchos lugares. Sin embargo, el entorno de ejecución o máquina virtual se encuentra en la computadora del usuario final y, por lo tanto, puede aprovechar todas las funciones proporcionadas por ese sistema.

Joel Coehoorn avatar Jan 21 '2009 20:01 Joel Coehoorn

Las otras respuestas dieron una buena descripción de la diferencia, pero usted también solicitó una imagen. Aquí hay un diagrama que muestra el viaje desde el código C hasta un ejecutable.

Graphics Noob avatar Jul 31 '2009 15:07 Graphics Noob