Si se interpreta Python, ¿qué son los archivos .pyc?

Resuelto froadie asked hace 14 años • 12 respuestas

Python es un lenguaje interpretado. Pero, ¿por qué mi directorio de origen contiene .pycarchivos que Windows identifica como "archivos compilados de Python"?

froadie avatar Jun 08 '10 21:06 froadie
Aceptado

Me han dado a entender que Python es un lenguaje interpretado...

Este meme popular es incorrecto o, más bien, se basa en una mala comprensión de los niveles del lenguaje (natural): un error similar sería decir "la Biblia es un libro de tapa dura". Déjame explicarte ese símil...

"La Biblia" es "un libro" en el sentido de ser una clase de (objetos físicos reales identificados como) libros; Se supone que los libros identificados como "copias de la Biblia" tienen algo fundamental en común (los contenidos, aunque incluso éstos pueden estar en diferentes idiomas, con diferentes traducciones aceptables, niveles de notas al pie y otras anotaciones); sin embargo, esos libros son Se permite perfectamente diferir en una infinidad de aspectos que no se consideran fundamentales: tipo de encuadernación, color de encuadernación, fuentes utilizadas en la impresión, ilustraciones si las hay, márgenes amplios para escribir o no, números y tipos de marcadores incorporados. , y así sucesivamente y así sucesivamente.

Es muy posible que una impresión típica de la Biblia tenga encuadernación de tapa dura; después de todo, es un libro que normalmente debe leerse una y otra vez, marcarse en varios lugares y hojearse buscando sugerencias de capítulos y versículos determinados. , etc, etc, y una buena encuadernación de tapa dura puede hacer que una copia determinada dure más con dicho uso. Sin embargo, estas son cuestiones mundanas (prácticas) que no se pueden utilizar para determinar si un libro determinado es una copia de la Biblia o no: ¡las impresiones en rústica son perfectamente posibles!

De manera similar, Python es "un lenguaje" en el sentido de definir una clase de implementaciones de lenguaje que deben ser todas similares en algunos aspectos fundamentales (sintaxis, la mayor parte de la semántica, excepto aquellas partes en las que se permite explícitamente que difieran), pero están totalmente permitidas. diferir en casi todos los detalles de "implementación", incluyendo cómo manejan los archivos fuente que se les entregan, si compilan las fuentes en algunos formatos de nivel inferior (y, de ser así, en qué formato, y si guardan dichos archivos). formularios compilados, en disco o en otro lugar), cómo ejecutan dichos formularios, etc.

La implementación clásica, CPython, a menudo se denomina simplemente "Python" para abreviar, pero es sólo una de varias implementaciones con calidad de producción, al lado de IronPython de Microsoft (que compila en códigos CLR, es decir, ".NET"), Jython (que se compila en códigos JVM), PyPy (que está escrito en Python y puede compilarse en una gran variedad de formas "back-end", incluido el lenguaje de máquina generado "justo a tiempo"). Todos son Python (=="implementaciones del lenguaje Python") al igual que muchos objetos de libros superficialmente diferentes pueden ser Biblias (=="copias de La Biblia").

Si está interesado específicamente en CPython: compila los archivos fuente en un formato de nivel inferior específico de Python (conocido como "código de bytes"), lo hace automáticamente cuando es necesario (cuando no hay ningún archivo de código de bytes correspondiente a un archivo fuente, o el archivo de código de bytes es más antiguo que el fuente o está compilado con una versión diferente de Python), generalmente guarda los archivos de código de bytes en el disco (para evitar volver a compilarlos en el futuro). OTOH IronPython normalmente compilará en códigos CLR (guardándolos en el disco o no, dependiendo) y Jython en códigos JVM (guardándolos en el disco o no; usará la .classextensión si los guarda).

Estos formularios de nivel inferior luego son ejecutados por "máquinas virtuales" apropiadas, también conocidas como "intérpretes": CPython VM, .Net runtime, Java VM (también conocido como JVM), según corresponda.

Entonces, en este sentido (qué hacen las implementaciones típicas), Python es un "lenguaje interpretado" si y solo si C# y Java lo son: todos ellos tienen una estrategia de implementación típica de producir código de bytes primero y luego ejecutarlo a través de una VM/intérprete. .

Lo más probable es que la atención se centre en cuán "pesado", lento y ceremonioso es el proceso de compilación. CPython está diseñado para compilar lo más rápido posible, lo más liviano posible y con la menor ceremonia posible: el compilador realiza muy poca verificación de errores y optimización, por lo que puede ejecutarse rápidamente y en pequeñas cantidades de memoria, lo que a su vez le permite ejecutarse de forma automática y transparente siempre que sea necesario, sin que el usuario tenga que darse cuenta de que se está realizando una compilación, la mayor parte del tiempo. Java y C# normalmente aceptan más trabajo durante la compilación (y por lo tanto no realizan una compilación automática) para verificar los errores más a fondo y realizar más optimizaciones. Es un continuo de escalas de grises, no una situación de blanco o negro, y sería completamente arbitrario poner un umbral en un nivel determinado y decir que sólo por encima de ese nivel se llama "compilación"!-)

Alex Martelli avatar Jun 08 '2010 15:06 Alex Martelli

Contienen código de bytes , que es en lo que el intérprete de Python compila el código fuente. Luego, este código es ejecutado por la máquina virtual de Python.

La documentación de Python explica la definición de esta manera:

Python es un lenguaje interpretado, a diferencia de uno compilado, aunque la distinción puede ser borrosa debido a la presencia del compilador de código de bytes. Esto significa que los archivos fuente se pueden ejecutar directamente sin crear explícitamente un ejecutable que luego se ejecute.

unwind avatar Jun 08 '2010 14:06 unwind