Pregunta

Me han dado a entender que Python es un lenguaje interpretado...Sin embargo, cuando miro a mi el código fuente de Python veo .pyc los archivos, que Windows identifica como "Compila los Archivos de Python".Donde estas venir?

¿Fue útil?

Solución

Contienen código de byte, que es a lo que el intérprete de Python compila la fuente. Este código es ejecutado por la máquina virtual de Python.

La documentación de Python explica la definición así:

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

Otros consejos

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

Este popular meme es incorrecta, o, más bien, construida encima de un malentendido de (natural) de los niveles de idioma:un error similar sería decir "la Biblia es un libro de tapa dura".Me explico que el símil...

"La Biblia" es "un libro", en el sentido de ser un clase de (reales, los objetos físicos identificados como de libros;los libros identificados como "copias de la Biblia" se supone que tienen algo fundamental en común (el contenido, aunque incluso estos pueden ser en diferentes idiomas, con diferentes traducciones aceptadas, los niveles de pie de página y otras anotaciones); sin embargo, esos libros son perfectamente permitido diferir en una miríada de aspectos que son no se considera fundamental, tipo de encuadernación, el color de la encuadernación, el tipo de letra(s) que se utiliza en la impresión, ilustraciones, si las hubiere, de ancho de escritura de los márgenes o no, los números y tipos de builtin marcadores, y así sucesivamente, y así sucesivamente.

Es muy posible que en un típico la impresión de la Biblia sería, de hecho, en tapa dura de unión, después de todo, es un libro que suele estar destinado a ser leído una y otra vez, marcado en varios lugares, lo manosearon a través en busca de capítulo y versículo de los punteros, etc, etc, y una buena tapa dura de unión puede hacer una copia dada durar más tiempo en virtud de dicho uso.Sin embargo, estos son mundanas (práctica) de los problemas que no pueden ser utilizados para determinar si un libro real que el objeto es una copia de la Biblia o no:rústica impresiones son perfectamente posibles!

Del mismo modo, Python es un "idioma" en el sentido de definir una clase de idioma implementaciones todos deben ser similares en algunos aspectos fundamentales (sintaxis, la mayoría de la semántica, excepto aquellas partes de aquellos en los que explícitamente permitido a diferentes), pero son totalmente permitido que difieren en casi todos los "aplicación" detalle, incluyendo cómo lidiar con los archivos de origen se les da, ya sea que compilar el código fuente a algún nivel inferior formas (y, si es así, que la forma -- y si salvar compilado formas, en el disco o en otro lugar), forma en que se ejecutan dijo formas, y así sucesivamente.

La clásica aplicación, CPython, es a menudo llamada simplemente "Python" para el corto, pero es sólo uno de varios de calidad de producción de las implementaciones, de lado a lado con Microsoft IronPython (que compila a CLR códigos, es decir, ".NET"), Jython (que compila a JVM códigos), PyPy (que está escrito en Python y puede compilar una gran variedad de "back-end" de los formularios incluidos "just-in-time", que se genera en lenguaje máquina).Son todos Python (=="implementaciones del lenguaje Python") al igual que muchos superficialmente diferentes objetos de libro puede ser todas las Biblias (=="copias de La Biblia").

Si usted está interesado en CPython específicamente:compila los archivos de código fuente en Python específicos de nivel inferior del formulario (conocido como "bytecode"), lo hace de forma automática cuando sea necesario (cuando no hay ningún archivo de código de bytes correspondiente a un archivo de origen o el archivo de código de bytes es mayor que el de origen o compilado por una diferente de la versión de Python), que normalmente se guarda el código de bytes de los archivos en el disco (para evitar volver a compilar en el futuro).OTOH IronPython normalmente compilar CLR códigos (guardar en el disco o no, dependiendo) y Jython para JVM códigos (guardar en el disco o no, se va a utilizar el .class extensión si no guardarlos).

Estos de nivel inferior formas son ejecutados por los correspondientes "máquinas virtuales", también conocido como "intérpretes" -- el CPython VM, el .Net, Java VM (aka JVM), según corresponda.

Así que, en este sentido (¿qué es lo típico de las implementaciones de hacer), Python es un "lenguaje interpretado" si y sólo si C# y Java son:todos ellos tienen una típica estrategia de implementación de la producción de código de bytes en primer lugar, a continuación, ejecutarlo a través de una VM/intérprete.

Es más probable que el foco está en cómo el "pesado", lento y de alto ceremonia el proceso de compilación.CPython está diseñado para compilar tan rápido como sea posible, tan ligero como sea posible, con tan poca ceremonia como sea posible -- el compilador hace muy poco la comprobación de errores y optimización, por lo que puede correr rápido y en pequeñas cantidades de memoria, que a su vez permite que se ejecute automáticamente y de forma transparente siempre que sea necesario, sin que el usuario ni siquiera tener que ser consciente de que no es una compilación pasando, la mayoría del tiempo.Java y C# suelen aceptar más trabajo durante la compilación (y por lo tanto no se realice la compilación automática) con el fin de comprobar los errores más a fondo y realizar más optimizaciones.Es un continuo de escalas de grises, no es blanco o negro de la situación, y sería totalmente arbitrario poner un umbral en algún nivel determinado y decir que sólo por encima de ese nivel se llame "compilación"!-)

No existe un lenguaje interpretado. Si se usa un intérprete o un compilador es puramente un rasgo del implementación y no tiene absolutamente nada que ver con el idioma.

Cada Un intérprete o un compilador puede implementar el lenguaje. La gran mayoría de los idiomas tienen al menos una implementación de cada tipo. (Por ejemplo, hay intérpretes para C y C ++ y hay compiladores para JavaScript, PHP, Perl, Python y Ruby). Además, la mayoría de las implementaciones de idiomas modernos en realidad combinan tanto un intérprete como un compilador (o incluso múltiples compiladores).

Un idioma es solo un conjunto de reglas matemáticas abstractas. Un intérprete es una de varias estrategias de implementación concreta para un idioma. Esos dos viven en niveles de abstracción completamente diferentes. Si el inglés fuera un idioma escrito, el término "idioma interpretado" sería un error de tipo. La declaración "Python es un lenguaje interpretado" no es solo falso (porque ser falso implicaría que la declaración incluso tiene sentido, incluso si está mal), simplemente no hace sentido, porque un idioma puede nunca ser definido como "interpretado".

En particular, si observa las implementaciones de Python existentes actualmente, estas son las estrategias de implementación que están utilizando:

  • Ironpython: se compila en árboles DLR que el DLR luego compila para cil bytecode. Lo que le sucede al CIL Bytecode depende de qué CLI se ejecute, pero Microsoft .NET .NET, GNU Portable.net y Novell Mono eventualmente lo compilarán en el código de la máquina nativa.
  • Jython: Interpreta el código de origen de Python hasta que identifica las rutas de código caliente, que luego compila a JVML bytecode. Lo que le sucede al Bytecode JVML depende de qué JVM se ejecute. Maxine lo compilará directamente con un código nativo no optimizado hasta que identifique las rutas de código caliente, que luego recompila al código nativo optimizado. HotSpot interpretará primero el Bytecode JVML y luego eventualmente compilará las rutas de código de acceso al código de máquina optimizado.
  • Pypy: se compila en Pypy bytecode, que luego es interpretado por la VM Pypy hasta que identifica las rutas de código caliente que luego se compila en código nativo, bytodo jvml o cil bytecode dependiendo de qué plataforma se esté ejecutando.
  • CPYTHON: se compila en el bytecodo de CPython que luego interpreta.
  • Python sin pilas: se compila en el bytecodo de Cpython que luego interpreta.
  • Swallow Unaden: se compila en Bytecode de CPython que luego interpreta hasta que identifica las rutas de código caliente que luego compila a LLVM IR que el compilador LLVM luego se compila en el código de la máquina nativa.
  • Cython: compila el código Python en el código C portátil, que luego se compila con un compilador C estándar
  • Nuitka: compila el código Python en el código C ++ dependiente de la máquina, que luego se compila con un compilador C estándar

Puede notar que cada una de las implementaciones en esa lista (además de otras que no mencioné, como TinyPy, Shedskin o PSYCO) tiene un compilador. De hecho, hasta donde yo sé, actualmente no existe una implementación de Python que se interprete puramente, no existe tal implementación y nunca ha habido tal implementación.

El término "lenguaje interpretado" no solo no tiene sentido, incluso si lo interpretas como significado "lenguaje con la implementación interpretada", claramente no es cierto. Quien te dijo eso, obviamente no sabe de qué está hablando.

En particular, el .pyc Los archivos que está viendo son archivos de bytecode en caché producidos por CPYTHON, Python Stackless o Unaden Swallow.

Estos son creados por el intérprete de Python cuando un .py El archivo se importa y contienen el "Bytecode compilado" del módulo/programa importado, la idea es que la "traducción" del código fuente al bytecode (que solo debe hacerse una vez) se puede omitir posteriormente imports si el .pyc es más nuevo que el correspondiente .py Archivo, por lo tanto, acelera un poco de inicio. Pero todavía se interpreta.

Para acelerar los módulos de carga, Python almacena el contenido compilado de los módulos en .pyc.

CPyThon compila su código fuente en "código de byte", y por razones de rendimiento, almacena este código de byte en el sistema de archivos cada vez que el archivo fuente tiene cambios. Esto hace que la carga de módulos de pitón sea mucho más rápido porque la fase de compilación se puede omitir. Cuando su archivo fuente es foo.py, Cpython almacena el código de byte en un archivo foo.pyc justo al lado de la fuente.

En Python3, la maquinaria de importación de Python se extiende para escribir y buscar archivos de caché de código de byte en un solo directorio dentro de cada directorio de paquetes de Python. Este directorio se llamará __pycache__.

Aquí hay un diagrama de flujo que describe cómo se cargan los módulos:

enter image description here

Para más información:

árbitro:PEP3147
árbitro:Archivos de python "compilados"

Esto es para principiantes,

Python compila automáticamente su script al código compilado, llamado código de byte, antes de ejecutarlo.

Ejecutar un script no se considera una importación y no se creará .pyc.

Por ejemplo, si tiene un archivo de script abc.py que importa otro módulo xyz.py, cuando corres abc.py, xyz.pyc se creará desde que se importe XYZ, pero ningún archivo ABC.Pyc será creado Dado que Abc.py no está siendo importado.

Si necesita crear un archivo .pyc para un módulo que no se importe, puede usar el py_compile y compileall módulos.

los py_compile El módulo puede compilar manualmente cualquier módulo. Una forma es usar el py_compile.compile función en ese módulo interactivamente:

>>> import py_compile
>>> py_compile.compile('abc.py')

Esto escribirá el .pyc en la misma ubicación que Abc.py (puede anularlo con el parámetro opcional cfile).

También puede compilar automáticamente todos los archivos en un directorio o directorios utilizando el módulo CompileAll.

python -m compileall

Si se omite el nombre del directorio (el directorio actual en este ejemplo), el módulo compila todo lo que se encuentra en sys.path

Python (al menos la implementación más común de la misma) sigue un patrón de compilar la fuente original a los códigos de bytes, luego interpretando los códigos de byte en una máquina virtual. Esto significa (nuevamente, la implementación más común) no es un intérprete puro ni un compilador puro.

Sin embargo, el otro lado es que el proceso de compilación está en su mayoría oculto: los archivos .pyc se tratan básicamente como un caché; Aceleran las cosas, pero normalmente no tienes que ser consciente de ellas en absoluto. Invalta y vuelve a cargarlos automáticamente (vuelve a compilar el código fuente) cuando sea necesario en función de las sellos de hora/fecha del archivo.

La única vez que he visto un problema con esto fue cuando un archivo de bytecode compilado de alguna manera obtuvo una marca de tiempo en el futuro, lo que significaba que siempre se veía más nuevo que el archivo fuente. Como parecía más nuevo, el archivo fuente nunca fue recompilado, así que no importa qué cambios hicieran, fueron ignorados ...

El archivo *.py de Python es solo un archivo de texto en el que escribe algunas líneas de código. Cuando intenta ejecutar este archivo usando "python filename.py"

Este comando invoca a Python Virtual Machine. Python Virtual Machine tiene 2 componentes: "compilador" e "intérprete". El intérprete no puede leer directamente el texto en el archivo *.py, por lo que este texto se convierte primero en un código de byte que está dirigido al PVM (no hardware sino PVM). PVM ejecuta este código de byte. *.PYC El archivo también se genera, como parte de ejecutarlo que realiza su operación de importación en el archivo en Shell o en algún otro archivo.

Si este archivo *.pyc ya está generado, cada vez que ejecuta/ejecuta su archivo *.py, el sistema carga directamente su archivo *.pyc que no necesitará ninguna compilación (esto le ahorrará algunos ciclos de procesador de la máquina).

Una vez que se genera el archivo *.pyc, no hay necesidad de *.py archivo, a menos que lo edite.

El código de Python pasa por 2 etapas. El primer paso compila el código en archivos .pyc, que en realidad es un bytecode. Luego, este archivo .pyc (bytecode) se interpreta utilizando el intérprete CPython. Por favor refiérase a este Enlace. Aquí el proceso de compilación y ejecución de código se explica en términos fáciles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top