2009-05-20 8 views

Respuesta

33

Casi ningún intérprete realmente interpreta el código directamente, línea por línea - es simplemente demasiado ineficiente. Casi todos los intérpretes usan alguna representación intermedia que se puede ejecutar fácilmente. Además, se pueden realizar pequeñas optimizaciones en este código intermedio.

Python Además almacena este código que tiene una enorme ventaja para la próxima vez que este código es ejecutado: Python no tiene que analizar el código más; el análisis es la parte más lenta en el proceso de compilación. Por lo tanto, una representación de bytecode reduce considerablemente la sobrecarga de ejecución.

+1

Incluso el viejo MS BASIC en mi TRS-80 usaba un esquema de codificación muy simple: tan pronto como escribía o editaba una línea, las palabras clave BASIC se colapsaron en bytes individuales. –

+1

@DavidThornley: muchas computadoras de los años 80 usaban un derivado de MS-basic que convertía las palabras clave en tokens, pero conservaban los números y los nombres de las variables en forma textual, por lo que tenían que calcular sus valores o buscarlos en el tiempo de ejecución. Atari BASIC hizo más procesamiento, construyendo una tabla de variables y reemplazando sus nombres con índices. También convirtió números numéricos a números de coma flotante BCD. Solo los literales de cadena y los comentarios se almacenaron como texto. Tales cosas podrían haber permitido que Atari BASIC supere a los demás, excepto que el número de cada línea se almacenó como binario, pero los objetivos GOTO ... – supercat

+1

... se almacenaron como punto flotante BCD, por lo que cada GOTO requirió una conversión de BCD a binario . Aún así, es interesante que el autor de Atari BASIC convirtió el programa en una representación analizada en lugar de simplemente reemplazar palabras clave con tokens. – supercat

7

Debido interpretting de código de bytes es directamente más rápido. Evita la necesidad de hacer lexing, por un lado.

8

Debido a que se puede compilar a un .pyc vez e interpretar de ella muchas veces.

lo que si está ejecutando un script muchas veces es suficiente con la sobrecarga de analizar el código fuente de una vez.

6

Re-léxico y analizar el código fuente una y otra vez, en lugar de hacerlo sólo una vez (con mayor frecuencia en la primera import), obviamente sería una pérdida tonta y sin sentido del esfuerzo.

+0

Simplemente ejecutando un archivo ".py" resulta en volver a extraer y analizar el código fuente una y otra vez, ¿verdad? Si el archivo es grande, esto puede ser una sobrecarga significativa. No estoy seguro de por qué importar recibe un trato especial. Realmente agradecería cualquier ayuda para entender. – batbrat

-1

Dudo mucho que la razón es el rendimiento, aunque se trate de un efecto secundario interesante. Diría que es natural pensar que una máquina virtual construida alrededor de un lenguaje ensamblador de alto nivel sería más práctica que encontrar y reemplazar texto en alguna cadena de código fuente.

Editar:

bien, con claridad, que alguna vez pon un contador -1 votación sobre mi post sin dejar un comentario razonable para explicar lo sabe muy poco acerca de las máquinas virtuales (tiempo de ejecución de ambientes).

http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Erik-Meijer-and-Lars-Bak-Inside-V8-A-Javascript-Virtual-Machine/

+1

No lo hice -1, pero voy a ser sincero porque no entendí su punto, especialmente esta parte de esto: "sería más práctico que encontrar y reemplazar texto en alguna cadena de código fuente" –

+0

Vea el video en canal 9, o escriba su propia máquina virtual, o dos de ellos probablemente le expliquen todo el proceso en detalle. Lo que quise decir con esa cita es que a veces es más fácil realizar optimizaciones en un nivel más alto de abstracción que ensamblar. Cuando haces esto normalmente trabajas con un AST (árbol sintáctico abstracto), si no tienes uno puedes realizar las mismas optimizaciones pero tienen que mover el código fuente, es decir, encontrar y reemplazar, y eso es muy poco práctico. tienden a ir con otra representación intermedia por este motivo (ver código de tres direcciones). –

+0

El código de bytes es solo una representación compacta y práctica más eficiente del AST. –

2

Aunque hay un pequeño aspecto de eficiencia a ella (se puede almacenar el código de bytes en el disco o en la memoria), la mayor parte de ingeniería: Permite separar el análisis de la interpretación. Los analizadores a menudo pueden ser criaturas desagradables, llenas de casos extremos y tener que ajustarse a reglas esotéricas como usar la cantidad justa de anticipación y resolver problemas de cambio-reducción. Por el contrario, la interpretación es realmente simple: es solo una gran declaración de cambio que utiliza el código de operación del bytecode.

Cuestiones relacionadas