Estoy tratando de entender realmente cómo se convierte exactamente un lenguaje de alto nivel en código de máquina y luego se ejecuta por la CPU.
Entiendo que el código está compilado en código de máquina, que es el código de bajo nivel que puede usar una CPU. Si tengo una declaración de asignación, diga:
x = x + 5;
y = x - 3;
¿La CPU ejecuta cada línea una a la vez? Por lo tanto, primero ejecutará x = x + 5; instrucción y luego la siguiente instrucción que ejecutará la CPU es y = x- 3; Realmente estoy tratando de entender el proceso de ejecución y cómo el código que escribo es realmente ejecutado por la CPU.
computer-science
cpu
Frankie
fuente
fuente
Respuestas:
Las líneas de código no tienen nada que ver con cómo lo ejecuta la CPU. Recomiendo leer sobre ensamblador, porque eso le enseñará mucho sobre cómo el hardware realmente hace las cosas. También puede obtener la salida del ensamblador de muchos compiladores.
Ese código podría compilarse en algo como (en un lenguaje ensamblador inventado):
Sin embargo, si el compilador sabe que una variable no se usa nuevamente, es posible que no se emita la operación de almacenamiento.
Ahora, para que el depurador sepa qué código de máquina corresponde a una línea de fuente de programa, el compilador agrega anotaciones para mostrar qué línea corresponde a qué parte del código de máquina.
fuente
ADD Rx, Rx, $5
ySUB Ry, Rx, $3
(suponiendo que las variables x e y hayan sido mapeadas en registros). Está describiendo un enfoque RISC de carga / almacenamiento.Depende.
En los primeros días de máquinas realmente simples, sí, el código ejecutaba una línea a la vez. A medida que las máquinas se hicieron más grandes, más rápidas y más complejas, comenzó a ver tanto la capacidad de ejecutar múltiples instrucciones simultáneamente como las lecturas y escrituras de memoria que tomaban mucho más tiempo que las operaciones en los registros.
Los compiladores de optimización tenían que tener esto en cuenta, y las líneas que proporcionas podían ejecutarse "más o menos" en paralelo, con una parte del procesador trabajando en el cálculo de y, mientras que otra parte almacenaba el nuevo valor previamente calculado de x (y el cálculo de y estaba usando ese nuevo valor del registro).
El Control Data 6600 fue la primera máquina que conozco que hizo este tipo de cosas. La suma de enteros tomó 300 nseg, la referencia de memoria (lectura o escritura) tomó 1000 nseg, las multiplicaciones y las divisiones tomaron MUCHO más tiempo. Se podrían ejecutar hasta diez instrucciones en paralelo, dependiendo de las unidades funcionales que se requirieran. Los compiladores CDC 6600 FORTRAN fueron MUY buenos para programar todo esto.
fuente
x
es? De esta manera, ya ha ejecutado el código y lo tiene almacenado en caché.No, no existe un mapeo uno a uno entre líneas de código / instrucciones en idiomas de nivel superior e inferior. De hecho, ambas líneas anteriores se traducen en múltiples instrucciones de código de máquina , como
Los detalles reales de estas instrucciones varían entre plataformas.
Esta es la visión básica de las cosas. Sin embargo, para complicar aún más los problemas, las CPU modernas aplican técnicas como tuberías de ejecución , ejecución fuera de orden y múltiples núcleos , entre otros. Esto hace que la CPU haga varias cosas a la vez, por ejemplo, las tuberías procesan diferentes fases de instrucciones posteriores en paralelo dentro de la misma unidad de procesamiento, mientras que múltiples núcleos pueden procesar instrucciones independientes en paralelo.
fuente
Debería buscar grandes detalles en un libro para encontrar más detalles sobre cómo funciona, posiblemente también una clase de compilador.
Básicamente, su pregunta se centra en 2 aspectos diferentes.
1) ¿Cómo se traduce el código en código de máquina?
2) ¿Cuándo / cómo se calcula el código usando la paralelización?
La respuesta a 1) depende del idioma que use (aunque para su ejemplo es trivial, por lo que la salida sería la misma). La forma en que el compilador hace la traducción al código de máquina es una de las fuerzas del lenguaje. Además, hay varias preocupaciones que deben tenerse en cuenta en su ejemplo, el código debe cargar los datos en la memoria, almacenarlos, etc.
Finalmente, la paralelización es una característica que puede forzar desde el punto de vista de la programación, pero en pocas palabras, algunos procesadores pueden tratar de pensar que se puede ejecutar una parte del código al mismo tiempo, porque son independientes. En su caso, claramente, no es el caso, ya que necesita ejecutar las declaraciones secuencialmente, por lo que no, no se ejecutará al mismo tiempo.
fuente