2009-01-14 31 views

Respuesta

104

Una máquina virtual es un entorno de cómputo virtual con un conjunto específico de instrucciones bien definidas atómicas que se admiten independientemente de cualquier lenguaje específico y generalmente se considera un entorno aislado. La VM es análoga a un conjunto de instrucciones de una CPU específica y tiende a funcionar en un nivel más fundamental con bloques de construcción muy básicos de tales instrucciones (o códigos de bytes) que son independientes de la siguiente. Una instrucción se ejecuta de forma determinista solo en el estado actual de la máquina virtual y no depende de la información en ningún otro lugar de la secuencia de instrucciones en ese momento.

Por otro lado, un intérprete es más sofisticado ya que está diseñado para analizar una secuencia de sintaxis que es de un lenguaje específico y de una gramática específica que debe decodificarse en el contexto de los tokens circundantes. No puede ver cada byte o incluso cada línea aisladamente y saber exactamente qué hacer a continuación. Los tokens en el idioma no se pueden tomar de forma aislada como lo hacen en relación con las instrucciones (códigos de bytes) de una máquina virtual.

Un compilador de Java convierte el lenguaje Java en un flujo de código de bytes no diferente de un compilador de C convierte programas de lenguaje C en código de ensamblaje. Por otro lado, un intérprete realmente no convierte el programa en una forma intermedia bien definida, simplemente toma las acciones del programa como una cuestión del proceso de interpretación de la fuente.

Otra prueba de la diferencia entre una VM y un intérprete es si lo considera independiente del lenguaje. Lo que conocemos como Java VM no es realmente específico de Java. Puede crear un compilador de otros idiomas que resulte en códigos de bytes que se pueden ejecutar en la JVM. Por otro lado, no creo que realmente pensáramos en "compilar" algún otro idioma que no sea Python en Python para la interpretación del intérprete de Python.

Debido a la sofisticación del proceso de interpretación, este puede ser un proceso relativamente lento .... específicamente analizar e identificar los tokens de idioma, etc. y comprender el contexto de la fuente para poder llevar a cabo el proceso de ejecución dentro de el interprete. Para ayudar a acelerar dichos lenguajes interpretados, aquí es donde podemos definir formas intermedias de código fuente pre-analizado, pre-tokenizado, que se interpretan más fácilmente. Este tipo de forma binaria todavía se interpreta en el momento de la ejecución, apenas está comenzando desde una forma mucho menos legible para mejorar el rendimiento. Sin embargo, la lógica que ejecuta esa forma no es una máquina virtual, porque esos códigos aún no se pueden tomar de forma aislada; el contexto de los tokens circundantes sigue siendo importante, ahora están en una forma diferente más eficiente en cuanto a la computadora.

+4

Tenía la impresión de que Python generó código de bytes, pyc, o es a lo que te refieres con "ayudar a acelerar tales idiomas interpretados, aquí es donde podemos definir formas intermedias de código fuente pre-analizado y pre-tokenizado que es más fácilmente interpretado directamente ". –

+19

@InSciTek Jeff: De su respuesta no está claro si usted sabe que Python también usa una máquina virtual. – tzot

+3

@TZ - La implementación popular de Python es un compilador de Python con una máquina virtual secundaria. En el modo interactivo, es un poco híbrido con una interfaz de intérprete y un final de compilación. Sin embargo, esas son las opciones de implementación. Traté de describir la diferencia entre el concepto de VM e Intérprete –

7

No hay diferencia real entre ellos, la gente simplemente sigue las convenciones que los creadores han elegido.

+2

Te arrojaré un hueso aquí porque creo que este es probablemente el una respuesta real y que bajó votó por la falta de bits. – vikingben

+2

¡No es la mejor respuesta, pero la más correcta! – justinfay

53

Probablemente una de las razones para la terminología diferente es que uno normalmente piensa en alimentar el código fuente bruto interpretable de python interpreter y sin preocuparse por bytecode y todo eso.

En Java, tiene que compilar explícitamente en bytecode y luego ejecutar solo el bytecode, no el código fuente en la VM.

A pesar de que Python utiliza una máquina virtual bajo las sábanas, desde la perspectiva del usuario, uno puede ignorar este detalle la mayor parte del tiempo.

+0

Estoy de acuerdo. Esta diferencia en la terminología realmente se reduce a la experiencia del usuario final (desarrollador, es decir). No tiene nada que ver con diferencias técnicas reales, ya que la línea técnica es tan increíblemente borrosa que casi no existe. –

+0

+1: Y, más importante aún, ¿cuál es el punto? ¿Qué programa no puedes escribir debido a esta distinción? ¿Qué rastreo de pila te confunde? ¿Qué biblioteca no parece funcionar correctamente? –

+0

@S.Lott Porque siempre es bueno ganar argumentos con colegas. ;) – Qix

12

El término intérprete es un término heredado que se remonta a los lenguajes de scripts anteriores. Como los "lenguajes de scripting" han evolucionado hasta convertirse en lenguajes con todas las funciones y sus plataformas correspondientes se han vuelto más sofisticadas y aisladas, la distinción entre una máquina virtual y un intérprete (en el sentido de Python) es muy pequeña o inexistente.

El intérprete de Python todavía funciona de la misma manera que un script de shell, en el sentido de que se puede ejecutar sin un paso de compilación por separado. Más allá de eso, las diferencias entre el intérprete de Python (o Perl o Ruby) y la máquina virtual de Java son principalmente detalles de implementación. (Se podría argumentar que Java es más completamente aislado que Python, pero ambos proporcionan acceso a la arquitectura subyacente a través de una interfaz C nativa).

+1

hay shells que pueden ejecutar código java sin pasos de compilación separados (visibles por el usuario). –

+0

Dame el nombre: D –

3

No olvide que Python tiene compiladores JIT disponibles para x86, lo que confunde aún más el problema . (Ver psyco).

Una interpretación más estricta de un 'lenguaje interpretado' sólo se vuelve útil cuando se habla de los problemas de rendimiento de la máquina virtual, por ejemplo, en comparación con Python, Ruby era (es?) Considera que es más lenta, ya que es un lenguaje interpretado, a diferencia Python - en otras palabras, el contexto es todo.

+1

Eso está mal. Primero, no existe un "lenguaje interpretado". Si una implementación usa un compilador o un intérprete no es un rasgo del lenguaje sino de la implementación. En segundo lugar, de las aproximadamente 13 implementaciones de Ruby, exactamente 1 es un intérprete, todas las demás tienen compiladores. –

+2

En tercer lugar, Ruby no es lento. Ningún idioma es lento, porque la velocidad no es un rasgo del lenguaje, sino la implementación del lenguaje. De las aproximadamente 13 implementaciones de Ruby, algunas son más lentas que algunas de las 7 implementaciones de Python, algunas son más rápidas. –

+0

Creo que está comparando las implementaciones estándar aquí Jörg. CPython y Ruby (creo que la implementación oficial simplemente se llama Ruby). –

14

Intérprete, traduce el código fuente en un poco de representación intermedia eficiente (código) y ejecuta inmediatamente esto.

La máquina virtual, ejecuta explícitamente código precompilado almacenado creado por un compilador que es parte del sistema de intérprete.

Una característica muy importante de una máquina virtual es que el software que se ejecuta dentro está limitado a los recursos proporcionados por la máquina virtual. Precisamente, no puede salir de su mundo virtual. Piense en la ejecución segura de código remoto, Applets de Java.

En caso de pitón, si estamos manteniendo pyc archivos, como se ha mencionado en el comentario de esta entrada, entonces el mecanismo se convertiría en más como una máquina virtual, y este código de bytes se ejecuta más rápido - que todavía se interpretaría pero de una forma mucho más amigable con la computadora. Si miramos esto como un todo, PVM es el último paso del intérprete de Python.

La línea de fondo es, cuando se refiere a Python Interpreter, significa que lo estamos refiriendo como un todo, y cuando decimos PVM, eso significa que estamos hablando de una parte de Python Interpreter, un entorno de tiempo de ejecución. Similar a la de Java, nos referimos a diferentes partes differentyl, JRE, JVM, JDK, etc.

Para más información, entrada de Wikipedia: Interpreter y Virtual Machine. Sin embargo, otro here. Aquí puede encontrar el Comparison of application virtual machines. Ayuda a comprender la diferencia entre compiladores, intérpretes y máquinas virtuales.

112

En esta publicación, "máquina virtual" hace referencia a las máquinas virtuales de proceso, no a las máquinas virtuales de sistema como Qemu o Virtualbox. Una máquina virtual de proceso es , simplemente un programa que proporciona un entorno de programación general, un programa que se puede programar.

Java tiene un intérprete, así como una máquina virtual, y Python tiene una máquina virtual , así como un intérprete. La razón "máquina virtual" es un término común más en Java y "intérprete" es un término más común en Python que tiene mucho que ver con la diferencia entre los dos idiomas: tipado estático Pitón).En este contexto, "tipo" hace referencia a primitive data types - tipos que sugieren el tamaño de almacenamiento en memoria de los datos. La máquina virtual Java lo tiene fácil. Requiere que el programador especifique el tipo de datos primitivo de cada variable. Esto proporciona suficiente información para bytecode Java no solo para ser interpretada y ejecutada por la máquina virtual Java , sino incluso para ser compiled into machine instructions. La máquina virtual Python es más compleja en el sentido de que lleva a cabo la tarea adicional de detener antes de la ejecución de cada operación para determinar los tipos de datos primitivos para cada variable o estructura de datos involucrada en la operación . Python libera al programador de pensar en términos de tipos de datos primitivos , y permite que las operaciones se expresen en un nivel superior. El precio de esta libertad es el rendimiento. "Intérprete" es el término preferido para Python porque tiene que detenerse para inspeccionar los tipos de datos, y también porque la sintaxis relativamente concisa de de los lenguajes de tipo dinámico es una buena opción para las interfaces interactivas . No existe una barrera técnica para construir una interfaz interactiva de Java , pero tratar de escribir de forma interactiva cualquier código estáticamente sería tedioso, por lo que simplemente no se hace de esa manera.

En el mundo Java, la máquina virtual se roba el show porque se ejecuta programas escritas en un idioma que en realidad pueden ser compilados en instrucciones de máquina, y el resultado es la velocidad y la eficiencia de los recursos. Java bytecode se puede ejecutar por la máquina virtual Java con un rendimiento similar al de los programas compilados , en términos relativos. Esto se debe a la presencia de información de tipo de datos primitivos en el bytecode. La máquina virtual Java pone de Java en una categoría de su propia:

portátil interpretó estáticamente mecanografiada lenguaje

Lo siguiente más cercano es LLVM, pero LLVM opera a un nivel diferente:

interpretado portátil lenguaje ensamblador

El término "código de bytes" se utiliza tanto en Java y Python, pero no todo el código de bytes se iguales. bytecode es simplemente el término genérico para los lenguajes intermedios utilizados por compiladores/intérpretes. Incluso los compiladores C como gcc usan un intermediate language (or several) para hacer el trabajo. El bytecode de Java contiene información sobre tipos de datos primitivos, mientras que el bytecode de Python no. En este aspecto, la máquina virtual Python (y Bash, Perl, Ruby, etc.) es realmente fundamentalmente más lenta que la máquina virtual Java, o más bien, simplemente tiene más trabajo por hacer.Es útil tener en cuenta qué tipo de información está contenida en diferentes formatos de código de bytes:

  • llvm: Registros de la CPU
  • Java: tipos de datos primitivos
  • Python: tipos definidos por el usuario

Para dibujar una analogía del mundo real: LLVM trabaja con átomos, la máquina virtual Java trabaja con moléculas, y la máquina virtual Python trabaja con materiales. Dado que todo debe descomponerse finalmente en partículas subatómicas (operaciones de máquina reales ), la máquina virtual Python tiene la tarea más compleja.

Los intérpretes/compiladores de idiomas con tipado estático no tienen el mismo equipaje que tienen los intérpretes/compiladores de lenguajes de tipado dinámico. Los programadores de idiomas con tipado estático tienen que ocupar la holgura, para lo cual el pago es el rendimiento. Sin embargo, al igual que todas las funciones no deterministas son secretamente deterministas, también lo son secretamente estáticamente tipados. Por lo tanto, las diferencias de rendimiento entre las dos familias de lenguas deben nivelar todo el tiempo Python cambia su nombre a HAL 9000.

Las máquinas virtuales de los lenguajes dinámicos como Python implementar alguna máquina lógica idealizada , y no necesariamente se corresponden muy de cerca a cualquier hardware físico real . La máquina virtual Java, en cambio, es más similar en la funcionalidad a un compilador clásico de C, excepto que en lugar de emitir instrucciones de la máquina , ejecuta rutinas incorporadas. En Python, un número entero es un objeto de Python con un conjunto de atributos y métodos asociados. En Java, un int es un número designado de bits, por lo general 32. No es realmente una comparación justa . Los enteros de Python realmente deberían compararse con la clase entera Java . El tipo de datos primitivo "int" de Java no se puede comparar con nada en el lenguaje Python, porque el lenguaje Python simplemente carece de esta capa de primitivas , y lo mismo ocurre con el bytecode de Python.

Dado que las variables Java se escriben de forma explícita, uno puede esperar razonablemente algo así como Jython rendimiento para estar en el mismo estadio de béisbol como cPython. Por otro lado, es casi seguro que una máquina virtual Java implementada en Python sea más lenta que el lodo. Y no espere que Ruby, Perl, etc., le vaya mejor. No fueron diseñados para hacer eso. Fueron diseñados para "scripting", que es lo que se llama programación en un lenguaje dinámico.

Cada operación que tiene lugar en una máquina virtual finalmente tiene que golpear el hardware real. Las máquinas virtuales contienen rutinas pre compiladas que son lo suficientemente generales como para ejecutar cualquier combinación de operaciones lógicas. Una máquina virtual puede no emitir nuevas instrucciones de máquina, pero sin duda está ejecutando sus propias rutinas una y otra vez en secuencias complejas. La máquina virtual Java, la máquina virtual Python y todas las otras máquinas virtuales de uso general que existen son iguales en el sentido de que se las puede convencer para que realicen cualquier lógica que se les ocurra, pero son diferentes en términos de las tareas que asumir, y qué tareas le dejan al programador.

Psyco para Python no es una máquina virtual completa de Python, pero un compilador justo a tiempo que secuestra la máquina virtual de Python regular en puntos que piensa que puede compilar unas pocas líneas de código - bucles sobre todo donde cree que el tipo primitivo de alguna variable permanecerá constante incluso si el valor cambia con en cada iteración. En ese caso, puede prescindir de la determinación incesante tipo de la máquina virtual normal. Sin embargo, debes tener un poco de cuidado, , para que no saques el tipo de debajo de los pies de Psyco. Pysco, sin embargo, normalmente sabe simplemente recurrir a la máquina virtual normal si no es completamente seguro de que el tipo no cambiará.

La moraleja de la historia es que la información del tipo de datos primitivos es realmente útil para un compilador/máquina virtual.

Por último, para poner todo en perspectiva considere esto: un programa de Python ejecutado por una máquina intérprete de Python/virtual implementado en Java que se ejecuta en un intérprete máquina Java/Virtual implementado en LLVM se ejecuta en un qemu virtuales máquina en marcha en un iPhone.

permalink

+0

'intentar escribir cualquier código estáticamente de forma interactiva sería tedioso'. Si conoces OCaml y Haskell, verás que eso no es cierto, ya que son * muy * concisos y estáticos. –

0

En primer lugar usted debe entender que la programación o la informática en general, no son las matemáticas y no tenemos definiciones rigurosas para la mayoría de los términos que a menudo utilizamos.

ahora a su pregunta:

lo que es un intérprete (en informática)

Se traduce el código fuente de la unidad más pequeña ejecutable y luego ejecuta esa unidad.

lo que es una máquina virtual

en caso de JVM la máquina virtual es un software que contiene un intérprete, cargadores de clases, recolector de basura, programador de subprocesos, compilador JIT y muchas otras cosas.

como puede ver el intérprete es una pieza o JVM y JVM no se puede llamar intérprete porque contiene muchos otros componentes.

qué el uso de la palabra "intérprete" cuando se habla de pitón

con java la parte compilación es explícita. python, por otro lado, no es explícito como java sobre su proceso de compilación e interpretación, desde la perspectiva del usuario final, la interpretación es el único mecanismo utilizado para ejecutar programas python

Cuestiones relacionadas