8

Por ejemplo, cuando compilo una aplicación C, ¿el archivo emitido se lee como binario o el OS interpreta la compilación? ¿El "lenguaje de máquina" es puro binario?¿Los programas compilados son realmente en binario verdadero?

EDITAR: Sí, todo en una computadora es puramente binario. Estoy preguntando si el procesador interpreta directamente el archivo generado por el compilador o el sistema operativo lo procesa primero.

+1

Lo que hace binaria "verdadero" o "puro"? –

Respuesta

16

Un programa compilado generalmente contiene un encabezado seguido de las instrucciones de la CPU (lo que se podría llamar "binario") + varios otros datos.

Cuando intenta decirle al sistema operativo que cargue su programa, el sistema operativo leerá el encabezado y se utiliza para verificar que el archivo ejecutable sea realmente un archivo ejecutable destinado para este sistema operativo y esta arquitectura. Es decir. para que no ejecute accidentalmente un programa Linux en Windows o similar.

El encabezado también contiene otros bits de información sobre dónde se ubican las instrucciones reales de la CPU en el archivo exeutable, donde se ubican los segmentos de datos (texto, cadenas, gráficos, etc.).

Una vez que el sistema operativo está contento de que el archivo ejecutable sea el que se supone que es, el sistema cargará los diferentes segmentos del archivo ejecutable en la memoria y le indicará a la CPU que comience a ejecutar el segmento de código "binario". Este código es "puro" en el sentido de que es un código de ensamblado de CPU directo.

Sin embargo, el sistema operativo puede interrumpir la CPU (por ejemplo, cambiar a otro programa o simplemente eliminar el programa de la memoria, etc.). Así que hay muchas cosas sucediendo alrededor de este programa en ejecución, y el SO tipo de "lo maneja" y se asegura de que se comporte como un buen chico, pero el código en sí cuando se está ejecutando es ejecutar instrucciones de CPU puro lo más rápido posible ... sin que el sistema operativo tenga que interpretar el código en el medio.

También tenga en cuenta que el programa en ejecución puede llamar al sistema operativo de varias maneras mientras se está ejecutando. Por ejemplo, para solicitar al sistema operativo que abra una ventana en la pantalla, abra una conexión de red, asigne memoria, etc. Todo lo que realmente está sucediendo es que la CPU solo salta a la ejecución del código en una ubicación diferente (es decir, salta de ejecutar el código en el ejecutable, ejecutar un código en el SO y luego salta de regreso).

Eso es todo en pocas palabras. Sin embargo, hay muchas otras formas de ejecutar programas. Hay máquinas virtuales, idiomas interpretados (como Java o Ruby, por ejemplo), etc. Y todos ejecutan programas de diferentes maneras de los lenguajes "binarios puros" tradicionales como C/C++, pero espero que esto les haya ayudado a entender cómo funciona un poco mejor.

+2

+1 no podría haberlo dicho mejor –

0

Aplicaciones como esta son generalmente compilados a código de máquina, instrucciones directamente ejecutadas por el procesador:

http://en.wikipedia.org/wiki/Machine_code

x86 ASM es uno de los más comunes. Piense en ello como su código compilado en un lenguaje de muy bajo nivel. Es una capa por encima de 1 y 0 que se envía directamente a lo largo del metal si eso es lo que quieres decir, y el sistema operativo aún tiene control sobre lo que se ejecuta. Pero sí, al final del día todo se reduce a binario: ¡todo lo que se haga en una PC servirá!

2

¿Qué quiere decir "verdadero binario"? Todos los datos en una computadora son 1s y 0s, aunque la CPU "interpreta" los códigos de operación según la disposición de las puertas y transistores internos. No hay un ideal platónico del lenguaje binario.

3

Creo que lo que realmente está preguntando es, ¿los programas compilados se ejecutan en bare metal (se ejecutan independientemente del sistema operativo). La muy corta respuesta es, no. Aunque el programa sí mismo ejecuta instrucciones nativas de la CPU, el OS es capaz de confinarlo y controlar su comportamiento. Además, durante la fase de carga, ciertos símbolos externos (dll) deben ser resueltos. Finalmente, la mayoría de los programas se basan en varias abstracciones del sistema operativo (acceso a memoria, por ejemplo, escribir su propia funcionalidad de intercambio es extremadamente difícil e inútil). En este sentido, ningún binario no es un código máquina autónomo de metal desnudo.

Sin embargo, son puro binario. Todo en una computadora es.

EDITAR

Otra forma de interpretar su pregunta es: se compilan los programas de instrucciones de la CPU en realidad nativos. La respuesta es sí (aparte de cargando el binario, que el sistema operativo tiene que ayudar). Los compiladores emiten el lenguaje ensamblador en el que cada línea se corresponde con exactamente una instrucción de CPU. Esto sigue siendo texto El ensamblado es compilado por un ensamblador en binario real.

0

También debería tener en cuenta que los idiomas interpretados tienen código de máquina virtual. (Todavía está en formato binario.) Se convierten en código de máquina mediante una máquina virtual, una clase de software. (También binario.)

0

Me pregunto por qué nadie mencionó el concepto de vinculador.

Básicamente, la salida del compilador es en realidad un archivo binario, pero hay una trampa para esto. Este archivo binario compilado a menudo se denomina archivo de objeto que contiene código de objeto. Ahora, no te confundas aquí. Código de objeto no es más que código de máquina o código binario como usted lo llama, pero solo una parte de él. El compilador normalmente genera múltiples tales archivos de objeto del origen de un único programa. Así que esencialmente, cada uno de estos archivos de objeto contiene una parte del código de máquina ejecutable completo para ese programa. Aquí es donde entra el enlazador. Básicamente vincula todos estos archivos de objeto en un ejecutable completo que la máquina puede ejecutar como un programa.

+0

http://en.wikipedia.org/wiki/Linker_(computing) –

Cuestiones relacionadas