¿Se interpreta o compila Python?

76

Esto es solo una pregunta que tuve al leer sobre 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.
Por el contrario, C es un lenguaje compilado, ya que primero hay que compilar el código fuente de acuerdo con la máquina y luego ejecutarlo. Este resultado es una ejecución mucho más rápida.

Ahora llegando a Python :

  • Un código 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 de Django. Después de la importación, cambio el código un poco y ejecuto las funciones importadas nuevamente para encontrar que todavía se está ejecutando el código anterior. Esto sugiere que los archivos * .pyc son archivos compilados de Python similares al ejecutable creado 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 como indica un comportamiento interpretado.

Esto sugiere que se compila un código de Python 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?

De acuerdo con la página de Idiomas Interpretados de wiki , aparece como un idioma compilado en Virtual Machine Code, ¿qué significa eso?

crodjer
fuente
1
¿Cuándo hay dudas sobre si Ruby es un lenguaje interpretado? Cuando se compila. :) macruby.org
mipadi
8
Vale la pena señalar que ningún lenguaje moderno se interpreta en sentido estricto. Prácticamente todos ellos compilan a bytecode.
Winston Ewert
@ Winston Ewert: ¡bravo! Applesoft Basic (en la década de 1980) fue compilado por código de bytes. "moderno" en este caso, significa cada lenguaje interpretado en la memoria viva, con la única excepción posible de algunas implementaciones rudimentarias básicas de Dartmouth.
S.Lott
66
>> Por el contrario, C es un lenguaje compilado << root.cern.ch/drupal/content/cint
igouy
3
@ S.Lott: Llamar al proceso de tokenización que Applesoft y los intérpretes BASIC de los 80 hicieron "compilación de bytecode" es más que un poco falso. Sí, el código del programa ingresado por el usuario se almacenó en la memoria en forma comprimida, un byte por palabra reservada, pero no se hizo nada más hasta que escribió RUN. Era como si tuviera un compilador que realizó el paso lexing y luego generó una secuencia de tokens que tuvieron que analizarse cada vez que se ejecutó el programa. No se parece en nada a la compilación moderna de bytecode como se hace, por ejemplo javac, que abarca el lexing, el análisis y la optimización.
dodgethesteamroller

Respuestas:

80

Vale la pena señalar que los idiomas no se interpretan ni compilan, sino que las implementaciones de idiomas interpretan o compilan el código. Notó que Ruby es un "lenguaje interpretado", pero puede compilar Ruby à la MacRuby , por lo que no siempre es un lenguaje interpretado.

Casi todas las implementaciones de Python consisten en un intérprete (en lugar de un compilador). Los .pycarchivos que ve son código de bytes para la máquina virtual Python (similar a los .classarchivos 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. Algunas implementaciones de Python, sin embargo, consisten en un compilador justo a tiempo que compilará el código de bytes de Python en código de máquina nativo.

(Digo "casi todos" porque no conozco ningún compilador de máquinas nativas para Python, pero no quiero afirmar que ninguno existe en ningún lado).

mipadi
fuente
Dependiendo de su definición, existen compiladores de máquinas nativas para Python. Algunos solo compilan un subconjunto de python. Otros implementan todo Python pero usan la API de Python para realizar las operaciones que no puede realizar en C.
Winston Ewert
Creo que en realidad estás describiendo que Python es lo que yo llamaría 'semi-compilado', o en realidad se puede compilar por completo. Por semi-compilado quiero decir que, dado que generalmente se compila en el archivo .pyc de 'lenguaje intermedio' que usa la máquina virtual Python, generalmente se ejecuta desde este formulario 'semi-compilado', que generalmente hace que el código sea más rápido que Interpretación simple en tiempo de ejecución del código interpretado. Curiosamente, el código sem compilado a veces puede ser más rápido que el código compilado de forma nativa (por ejemplo, C # es generalmente más rápido que C ++).
Chris Halcrow
55
Cython compila el código Python en C para que pueda compilarse como un objeto compartido.
greyfade
Distinguir el código de bytes y el código de máquina de esta manera es bastante arbitrario. Java se compila: el compilador javac produce archivos de clase que contienen instrucciones de bajo nivel que pueden ejecutarse, ya sea en una máquina virtual (por ejemplo, punto de acceso) o directamente por hardware (por ejemplo, en procesadores ARM con la extensión Jazelle). Hasta donde yo sé, no hay ninguna razón técnica para que una arquitectura de procesador similar no se pueda diseñar para ejecutar directamente las instrucciones de python vm.
Jules
@Jules Casualmente, el código Jython se compila en archivos .class que creo que se reutilizan hasta que modifique la fuente py.
JimmyJames
35

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

Para ver comparaciones de velocidad de diversas implementaciones de idiomas, puede probar aquí .

aufather
fuente
Gracias por la información. Según los puntos de referencia, el rendimiento de Python es muy bajo.
crodjer
1
El enlace que di claramente indica que estos son puntos de referencia defectuosos de las implementaciones de lenguaje . Python no debería ser su elección de idioma si le preocupa demasiado el rendimiento de la ejecución. Si todavía quieres comparar, compara idiomas similares. El código de bytes oficial interpretado CPython es comparable o más rápido que el compilado JIT de Ruby.
aufather
1
@ jase21 - "Mis planes para 2006 son portar las técnicas implementadas en Psyco a PyPy. PyPy nos permitirá construir un especialista en JIT más flexible, más fácil de experimentar y sin la necesidad de estar sincronizados con las evoluciones de el lenguaje Python ". psyco.sourceforge.net/introduction.html
igouy
1
@ jase21 - "hace que los códigos de Python se ejecuten más rápido que las contrapartes C" - ¿Se supone que debemos tomar su palabra para eso?
igouy
3
El enlace en la respuesta está roto.
Basilevs
11

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 futura ejecución, utiliza una máquina M.

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


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


Al final, depende de qué nivel de abstracción estés hablando y de qué te preocupes. 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 forma u otra.

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

Paul Draper
fuente
7

Virtual Machine Code 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 analizar que el código original escrito por un ser humano.

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

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

LennyProgrammers
fuente
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 las cosas, el código objeto (o código de bytes, si lo prefiere) se almacena en el disco, por lo que puede reutilizarse la próxima vez que se ejecute el programa.

ykombinator
fuente