Java tiene la JVM, ¿qué tiene C?

15

Sé que C tiene un compilador, pero ¿qué determina el rendimiento de la ejecución?

Por ejemplo, en un bloque if else, ¿qué sucede si el código solo tiene todos los ifs en lugar de if elses, lo que determina que se ejecuten todos los ifs? En Java sería la JVM, pero en C, ¿qué es el compilador de ejecución?

scerrecrow
fuente
16
Un matiz útil para aprender es que los idiomas son solo idiomas. Podría crear un compilador que tome código C y lo haga funcionar en la JVM, por ejemplo.
Telastyn
10
+1. Esta es una muy buena pregunta. No lo rechazaría por su ignorancia: es una maravilla que más estudiantes de Java no pregunten esto.
djechlin
También puede compilar Java al código de máquina y evitar la JVM ...
AK_
2
También: Lenguaje de programación! = Framework! = Runtime Library! = Compiler! = Just in Time Compiler! = Interperter
AK_

Respuestas:

17

En Java, la máquina virtual ejecuta su código, pero los compiladores de C generan código que ejecuta la máquina real . Para ser precisos, en ambos casos su programa termina convirtiéndose en código de máquina real, pero en el caso de Java hay un paso intermedio de compilación en código de bytes JVM.

De modo que JVM convierte los programas Java en instrucciones reales cuando los carga, mientras que el compilador ya convierte los programas C en instrucciones reales antes de ejecutarlos.

vrostu
fuente
20
Hay compiladores que toman Java y producen código de máquina. Por ejemplo Excelsior Jet . También hay intérpretes para C ( picoc ) que nunca generan código que ejecuta una máquina real. Los idiomas son idiomas. Las implementaciones son implementaciones. Confundir a los dos puede ser confuso para las personas.
6

Además del código de máquina, no existe un lenguaje de programación que se ejecute directamente en el hardware, en el sentido de que no puede alimentarlo con el texto fuente literal. Todas las implementaciones reales deben traducir el programa fuente al lenguaje de la "máquina".

Para algunas implementaciones, se traduce estáticamente. Generalmente llamamos a estas implementaciones "compiladas". Para otros, se traduce a alguna forma intermedia, que luego se traduce dinámicamente a medida que se ejecuta el programa. Generalmente llamamos a estas implementaciones "interpretadas". Hay un continuo de posibilidades entre estos, e incluso muchas CPU modernas hacen una traducción dinámica como parte de su núcleo de ejecución.

Incluso cuando su programa se compila estáticamente mucho antes de la ejecución, a menos que esté escribiendo firmware, es raro que el código compilado se ejecute directamente en el metal desnudo sin nada que lo soporte. El sistema operativo proporciona una máquina virtual para programas de espacio de usuario, a menudo brinda características tales como la ilusión de que tienes una CPU para ti. La ilusión de un espacio de memoria plana que podría ser más grande que la RAM física conectada a la máquina incluso se llama "memoria virtual".

Además de eso, incluso cuando está programando en C, ¡hay una máquina virtual en C! Tradicionalmente se conoce como "el tiempo de ejecución C" o CRT para abreviar.

Debido a que C se traduce principalmente directamente en el código de ensamblaje / máquina con mucha anticipación (en algunas plataformas, también puede haber algún código enhebrado , y eso puede considerarse parte de la máquina virtual), la máquina virtual generalmente solo tiene que manejar el inicio y apagar.

El inicio generalmente implica la configuración de la pila y el montón; el sistema operativo rara vez proporciona estos para usted, y el trabajo del lenguaje de programación es proporcionarlos al programador. En algunas plataformas puede haber alguna inicialización del manejo de la señal, configurando el subproceso "principal" en un entorno de subprocesos múltiples, ejecutando constructores globales en caso de que el programa se haya vinculado al código C ++, manejando bibliotecas vinculadas dinámicamente, o allí Es posible que se requiera algún procesamiento para configurar argc / argv y envp. Finalmente, CRT transfiere el control a main.

En cuanto al apagado, muchos sistemas operativos pueden matar un proceso sin limpieza, por lo que el apagado no necesita hacer mucho. Lo principal es procesar llamadas atexit () para el caso en que el programa salga limpiamente.

Seudónimo
fuente
2
El tiempo de ejecución C y la JVM son bestias completamente diferentes. El CRT es solo una biblioteca.
DeadMG
He editado la respuesta para aclarar las cosas un poco. Por cierto, JVM y VirtualBox también son bestias completamente diferentes.
Seudónimo
@ Seudónimo: en realidad no. Bueno, está bien, VirtualBox es un virtualizador, mientras que el JVM típico es un emulador, pero si reemplaza, por ejemplo, VirtualBox con QEmu en su oración, los dos son de hecho lo mismo.
Jörg W Mittag