¿Python es interpretado o compilado?

69

Esto es solo una pregunta que tuve al leer sobre los idiomas interpretados y compilados.

Ruby es sin duda un lenguaje interpretado, ya que el código fuente es procesado por un intérprete en el punto de ejecución.
Al contrario, C es un lenguaje compilado, ya que uno tiene que compilar el código fuente primero de acuerdo con la máquina y luego ejecutarlo. Este resultado es una ejecución mucho más rápida.

Ahora vamos a Python :

  • Un código de python ( somefile.py ) cuando se importa crea un archivo ( somefile.pyc ) en el mismo directorio. Digamos que la importación se realiza en un shell de Python o en un módulo django. Después de la importación, cambio un poco el código y ejecuto las funciones importadas nuevamente para encontrar que todavía está ejecutando el código anterior. Esto sugiere que los archivos * .pyc son archivos python compilados similares a los ejecutables creados después de la compilación de un archivo C, aunque no puedo ejecutar el archivo * .pyc directamente.
  • Cuando el archivo python (somefile.py) se ejecuta directamente (./somefile.py o python somefile.py) no se crea ningún archivo .pyc y el código se ejecuta de manera que indica un comportamiento interpretado.

Estos sugieren que un código de Python se compila cada vez que se importa en un nuevo proceso para crear un .pyc mientras se interpreta cuando se ejecuta directamente.

Entonces, ¿qué tipo de lenguaje debería considerarlo? ¿Interpretado o compilado? ¿Y cómo se compara su eficiencia con los idiomas interpretados y compilados?

Según la página Idiomas interpretados de wiki, aparece como un idioma compilado en el Código de Máquina Virtual, ¿qué es? ¿Qué significa eso?

    
pregunta crodjer 08.12.2010 - 08:28

5 respuestas

68

Vale la pena señalar que los idiomas no se interpretan o compilan, sino que el lenguaje implementations interpreta o compila el código. Notaste que Ruby es un "lenguaje interpretado", pero puedes compilar Ruby à la MacRuby , por lo que no es siempre un lenguaje interpretado.

Casi todas las implementaciones de Python consisten en un intérprete (en lugar de un compilador). Los archivos .pyc que ves son códigos de bytes para la máquina virtual de Python (similar a los archivos .class de Java). No son lo mismo que el código de máquina generado por un compilador de C para una arquitectura de máquina nativa. Sin embargo, algunas implementaciones de Python consisten en un compilador just-in-time que compilará el código de bytes de Python en un código de máquina nativo.

(Digo "casi todos" porque no conozco ningún compilador de máquina nativo para Python, pero no quiero afirmar que no existe ninguno en ninguna parte).

    
respondido por el mipadi 08.12.2010 - 15:39
30

Python caerá bajo el código de byte interpretado. El código fuente .py se compila primero en un código de byte como .pyc. Este código de byte se puede interpretar (CPython oficial) o JIT compilado (PyPy). El código fuente de Python (.py) se puede compilar a un código de bytes diferente, como IronPython (.Net) o Jython (JVM). Existen múltiples implementaciones del lenguaje Python. El oficial es un código de byte interpretado. También hay implementaciones compiladas JIT de código byte.

Para comparaciones rápidas de varias implementaciones de idiomas, puede probar aquí .

    
respondido por el aufather 08.12.2010 - 08:52
9

Compilado vs. interpretado puede ser útil en algunos contextos, pero cuando se aplica en un sentido técnico, es una falsa dicotomía.

Un compilador (en el sentido más amplio) es un traductor . Traduce el programa A al programa B y para su ejecución futura utilizando una máquina M.

Un intérprete (en el sentido más amplio) es un ejecutor . Es una máquina M la que ejecuta el programa A. Aunque normalmente excluimos de esta definición las máquinas físicas (o máquinas no físicas que actúan como las físicas). Pero desde una perspectiva teórica, esa distinción es algo arbitraria.

Por ejemplo, tome re.compile . "Compila" una expresión regular a una forma intermedia, y esa forma intermedia se interpreta / evalúa / ejecuta.

Al final, depende de qué nivel de abstracción está hablando y qué le importa. La gente dice "compilado" o "interpretado" como descripciones amplias de las partes más interesantes del proceso, pero en realidad la mayoría de los programas se compilan (traducen) e interpretan (ejecutan) de una manera u otra.

CPython (la implementación más popular del lenguaje Python) es sobre todo interesante para ejecutar código. Por lo tanto, CPython normalmente se describiría como interpretado. Aunque esta es una etiqueta suelta.

    
respondido por el Paul Draper 23.10.2015 - 07:33
6

El Código de máquina virtual es una versión más compacta del código fuente original (código de byte). Todavía necesita ser interpretado por una máquina virtual, ya que no es un código de máquina. Sin embargo, es más fácil y rápido de analizar que el código original escrito por un ser humano.

Algunas máquinas virtuales generan código de máquina al interpretar el código de máquina virtual por primera vez (compilación justo a tiempo - JIT). Las siguientes invocaciones usarán este código de máquina directamente, lo que lleva a una ejecución más rápida.

Hasta donde sé, Ruby > = 1.9 también utiliza una máquina virtual como Python.

    
respondido por el LennyProgrammers 08.12.2010 - 08:48
5

El tiempo de ejecución de Python ejecuta código de objeto personalizado (código de byte) en una máquina virtual.

El proceso de compilación convierte el código fuente en código objeto.

Para acelerar el proceso, el código objeto (o el código de bytes, si lo prefiere) se almacena en el disco, por lo que se puede reutilizar la próxima vez que se ejecute el programa.

    
respondido por el ykombinator 08.12.2010 - 08:55

Lea otras preguntas en las etiquetas

Comentarios Recientes

'Cómo compilan las organizaciones de Python (de todos los tamaños) En otro póster de 2014 (copiado aquí), McGehee ilustra varias formas en que las organizaciones crean programas de Python:' Mi interés en identificar y modelar organizaciones que hacer este trabajo es intenso y, como la mayoría de las cosas en la investigación de idiomas, requiere algunas experiencias de primera mano ... los datos recopilados de estas experiencias deberían ser útiles para los reclutadores, ya que los prepara para formar grupos... Lee mas