¿Por qué las máquinas virtuales deben ser "apilar máquinas" o "registrar máquinas", etc.?

46

(Esta es una pregunta extremadamente nueva).

He estado estudiando un poco sobre máquinas virtuales.

Resulta que muchos de ellos están diseñados de manera muy similar a las computadoras físicas o teóricas.

Leí que la JVM, por ejemplo, es una 'máquina de pila'. Lo que eso significa (y corríjame si me equivoco) es que almacena toda su 'memoria temporal' en una pila, y realiza operaciones en esta pila para todos sus códigos de operación.

Por ejemplo, el código fuente 2 + 3 se traducirá a un código de bytes similar a:

push 2
push 3
add

Mi pregunta es esta:

Las JVM probablemente se escriben utilizando C / C ++ y similares. Si es así, ¿por qué la JVM no ejecuta el siguiente código C: 2 + 3 ..? Quiero decir, ¿por qué necesita una pila o en los "registros" de otras máquinas virtuales, como en una computadora física?

La CPU física subyacente se encarga de todo esto. ¿Por qué los escritores de máquinas virtuales no ejecutan simplemente el bytecode interpretado con instrucciones "habituales" en el idioma con el que está programada la máquina virtual?

¿Por qué las máquinas virtuales necesitan emular hardware, cuando el hardware real ya hace esto por nosotros?

Una vez más, muy novato-ish preguntas. Gracias por tu ayuda

    
pregunta Aviv Cohn 08.06.2014 - 22:18

4 respuestas

50

Una máquina, virtual o no, necesita un modelo de cálculo que describa cómo se realiza el cálculo en ella. Por definición, tan pronto como se calcula, implementa algún modelo de cálculo. La pregunta entonces es: ¿Qué modelo debemos elegir para nuestra máquina virtual? Las máquinas físicas están limitadas por lo que puede hacerse de manera efectiva y eficiente en hardware. Pero, como usted observa, las máquinas virtuales no tienen tales restricciones, se definen en software que utiliza lenguajes de alto nivel arbitrario.

De hecho, hay máquinas virtuales que son de alto nivel, como usted describe. Se llaman lenguajes de programación . El estándar de C, por ejemplo, dedica la mayor parte de sus páginas a la definición de un modelo para la llamada "máquina abstracta de C" que describe cómo se comportan los programas de C, y por extensión (como regla de if-if) cómo un compilador (o intérprete) de C conforme a las normas. debería comportarse.

Por supuesto, generalmente no llamamos a eso una máquina virtual. Una máquina virtual suele entenderse como algo de nivel inferior, más cercano al hardware, que no debe programarse directamente, diseñado para ejecutarse de manera eficiente. Este sesgo de selección significa que algo que acepte código composible de alto nivel (como lo que usted describe) no se consideraría una VM porque se ejecuta código de alto nivel.

Pero para llegar al punto, aquí hay algunas razones para hacer que una VM (como en, algo dirigido por un compilador de bytecode) basado en el registro o similar. Apilar y registrar máquinas es extremadamente simple. Hay una secuencia de instrucciones, un estado y una semántica para cada instrucción (una función Estado - > Estado). Sin reducciones de árboles complejos, sin precedencia de operadores. Analizarlo, analizarlo y ejecutarlo es muy simple, ya que es un lenguaje mínimo (se compila el azúcar sintáctico) y está diseñado para ser leído por la máquina en lugar de ser leído por el hombre.

En contraste, analizar incluso los lenguajes tipo C más simples es bastante difícil, y su ejecución requiere análisis no locales como verificar y propagar tipos, resolver sobrecargas, mantener una tabla de símbolos, resolver identificadores de cadena , convirtiendo el texto lineal en un AST controlado por precedencia, y así sucesivamente. Se basa en conceptos que resultan naturales para los seres humanos, pero que deben ser cuidadosamente diseñados mediante ingeniería inversa por máquinas.

El bytecode JVM, por ejemplo, es emitido por javac . Prácticamente nunca necesita ser leído o escrito por humanos, por lo que es natural orientarlo hacia el consumo de las máquinas. Si lo optimizó para humanos, la JVM solo en cada inicio leería el código, lo analizaría, analizaría y luego lo convertiría en una representación intermedia que se asemejara a un modelo de máquina simplificado de todos modos . También podría cortar al intermediario.

    
respondido por el user7043 08.06.2014 - 22:50
19

Esta respuesta se centra en la JVM, pero en realidad se aplica a cualquier máquina virtual.

  

¿Por qué las máquinas virtuales necesitan emular hardware, cuando el hardware real ya hace esto por nosotros?

No lo hacen, pero hacen que la VM sea mucho más simple y portátil: una VM que emula hardware puede usar el mismo modelo computacional que cualquier CPU de hardware.

La JVM en particular se construyó teniendo en cuenta la portabilidad, de hecho, se construyó para que incluso pueda implementarse en hardware (puede ser difícil de creer hoy en día, pero el origen de Java estaba en el mundo integrado, específicamente, en los controladores para televisión interactiva).

Si tiene un objetivo como este, es deseable que la máquina virtual funcione lo más cerca posible de una máquina física, ya que la traducción al código de máquina real se vuelve más fácil y más rápida. Una vez que tenga los códigos de operación de la máquina virtual, en teoría, todo lo que tiene que hacer es traducirlos a los códigos de operación de la CPU en los que se ejecuta el programa. En la práctica no es exactamente así de simple.

  

Quiero decir, ¿por qué necesita una pila o en los "registros" de otras máquinas virtuales, como en una computadora física?

El uso de un modelo de máquina virtual basada en la pila tiene la ventaja de que se puede transferir fácilmente a las máquinas de registro y de pila, mientras que lo contrario no es necesariamente cierto. Una máquina virtual basada en un registro tendría que hacer suposiciones sobre el número de registros, el tamaño de los registros, etc. Con una máquina de pila, no son necesarias tales suposiciones.

  

La CPU física subyacente se encarga de todo esto. ¿Por qué los escritores de máquinas virtuales no ejecutan simplemente el bytecode interpretado con instrucciones "habituales" en el idioma con el que está programada la máquina virtual?

Bueno, eso es lo que hacen esas máquinas virtuales, interpretan el código de bytes. Incluso la JVM realmente hace eso, al menos antes de que JIT (justo a tiempo) actúe: interpreta los códigos de bytes y ejecuta las declaraciones en el lenguaje en el que se escribió la JVM (normalmente C o C ++, pero incluso hay una escrita en JavaScript, Doppio ). Tenga en cuenta, sin embargo, que incluso esas declaraciones fueron traducidas al código de máquina por un compilador y en realidad se parecen mucho a lo que produce el compilador de Java, es decir, utilizan registros y la pila para realizar su trabajo. Note el uso de v.s. "interpretado" los idiomas "compilados" se convierten en algo borroso en este momento.

    
respondido por el miraculixx 09.06.2014 - 00:57
9

¿Por qué las máquinas virtuales deben ser "apilar máquinas" o "registrar máquinas", etc.?

No lo hacen. Si necesita una máquina virtual, puede ser cualquier cosa.

Las máquinas virtuales existentes han aparecido como soluciones para situaciones como: Se me ha ocurrido una idea realmente brillante: ¡he inventado un nuevo lenguaje de programación! Pero tengo que generar código. (¡Qué tarea más aburrida!) Pero no quiero generar el código i8086 porque es feo, y no quiero generar un código 68k porque todos los demás están usando Intel. También está VAX, pero no tengo VAX, ni computadora ni libro VAX. Por lo tanto, generaré código para un procesador que no existe físicamente e implementaré ese procesador en el software. La especificación de esa máquina virtual hará un capítulo en mi tesis. En teoría, será posible compilarlo en código nativo de cualquier procesador, pero ese no será yo.

Por otra parte, la VM como una "2 + 3" probablemente no será utilizada en un futuro previsible porque implica una gran transformación antes de que se pueda ejecutar algo.

    
respondido por el 18446744073709551615 09.06.2014 - 13:09
-2

Para responder a la pregunta real que se hizo. El término "MÁQUINA virtual" significa que TODOS los software / hardware son simulados / emulados. Si usa el software / hardware subyacente para ejecutar las instrucciones, entonces no tiene una máquina virtual, tiene un compilador / intérprete.

    
respondido por el Kyrelel 30.10.2017 - 02:03

Lea otras preguntas en las etiquetas