compiler-construction vm-implementation

compiler construction - Intérpretes vs Compiladores vs Máquinas Virtuales



compiler-construction vm-implementation (3)

Máquinas reales vs máquinas virtuales

  • Máquina real es aquel cuyo código de máquina es ejecutado por hardware
  • Máquina virtual es aquella cuyo "código de máquina" es ejecutado por un intérprete.

Intérpretes vs compiladores

La respuesta está aquí

Tengo una pregunta sobre Intérpretes, Compiladores y VM.

Ahora sé las diferencias entre los intérpretes y los compiladores, pero ¿qué hay de diferente en las MÁQUINAS VIRTUALES de las 2 anteriores? ¿Cuáles son las ventajas y desventajas de una máquina virtual sobre los intérpretes y compiladores?

Muchas gracias


Inglés simple

El compilador transforma un idioma en otro. Por ejemplo, C # en IL, Java en código de byte, C ++ en código de máquina binario. Ninguna ejecución ocurre en la etapa de compilación.

El intérprete interpreta (ejecuta) una línea a la vez desde el archivo fuente. Tales como PHP, Perl, otros lenguajes de script

La máquina virtual puede referirse a varias cosas, las dos que conozco:

  • Máquina virtual relacionada con el hipervisor, como Hyper-V , Xen . Estos le permiten ejecutar varios sistemas operativos en una sola pieza de hardware
  • Tiempo de ejecución del software, como Java Virtual Machine , Common Language Runtime . Este software permite ejecutar un lenguaje intermedio independiente de la plataforma (código IL, código byte) y ejecutar instrucciones específicas de la máquina ( compilación justo a tiempo ). Por lo general, dicha máquina virtual es responsable de otras tareas satelitales: administración de recursos, limpieza de memoria, subprocesos, seguridad, etc.

No hay pros y contras. Los tres hacen diferentes trabajos que difícilmente se pueden comparar.

Los idiomas y las plataformas no vienen en ningún orden en particular, hay literalmente cientos de otras muestras.


Una máquina virtual no es exactamente una alternativa a los compiladores o intérpretes. Creo que estás pensando en un compilador JIT, que es la cantidad de máquinas virtuales que se implementan.

Una máquina virtual en sí misma es exactamente lo que dice el nombre: es una máquina (procesador) que en realidad no existe. Por ejemplo, la mayoría de los procesadores no tienen ninguna forma intrínseca de tratar con la asignación de memoria, o ningún conocimiento de los tipos. La Java VM, sin embargo, tiene una new instrucción que asigna una instancia de una determinada clase. Los diseñadores de la VM decidieron que este era un concepto suficientemente importante en el lenguaje para merecer su propio código de operación, que es la unidad fundamental de operación en la VM.

Las ventajas de crear su propio conjunto de instrucciones son generalmente para cerrar la brecha entre los largos tiempos de compilación / optimización y los intérpretes lentos. Cuando compilas una clase Java, por ejemplo, no tienes que hacer ninguna asignación de registro o alineación ni ninguna de esas cosas tradicionales del compilador. El JIT lo hará más adelante, pero solo para las partes del código que se ejecutan suficientes veces y se extienden a lo largo de la ejecución del programa. El conjunto de instrucciones de la JVM está lo suficientemente cerca de Java, por lo que la compilación inicial es rápida, y es simple y rápida de leer para la VM, a diferencia del código fuente de Java.

En cuanto a los intérpretes frente a los compiladores JIT, las compensaciones son generalmente en torno al rendimiento en tiempo de ejecución frente al tiempo de desarrollo. Un JIT tarda mucho más en desarrollarse, pero un intérprete es mucho más lento mientras se ejecuta. Sin embargo, en muchos casos, como las secuencias de comandos y los sitios web de tamaño pequeño a mediano, el programa no se ejecuta lo suficiente como para que realmente vea los beneficios de usar un JIT.

También debería mencionar software como VMware. Esta también es una máquina virtual, pero utiliza un conjunto de instrucciones que también se usa en hardware real. Es el mismo concepto básico que una máquina virtual de lenguaje, ya que pretende ser una máquina que no está físicamente presente, pero en la práctica es diferente y muy complicada.