2010-12-28 25 views
8

En Erlang and OTP in Action (página 46), los autores afirman lo siguiente en una nota:Cuando el código compilado difiere del shell evaluado?

Puede suceder que en algún caso esquina impar, código evaluado en la cáscara se comporta de forma ligeramente diferente del mismo código cuando se compila como parte de un módulo. En tal caso, la versión compilada es el estándar de oro. El shell hace todo lo posible para hacer exactamente lo mismo cuando interpreta las expresiones.

¿Puede pensar en uno o más de estos casos de esquina impares? ¿Cuáles son las pequeñas diferencias en esos casos?

Respuesta

7

El intérprete de erlang, erl_eval, trata muy duro de comportarse exactamente como el código compilado. Si no es probable, es un error.

Excepto en un caso y que está recibiendo mensajes. El código compilado puede acceder a las instrucciones internas para acceder y manipular la cola de mensajes. El intérprete no puede hacer esto. Debe: eliminar mensajes de la cola (más o menos con receive X -> X end); pruébelos para ver si coinciden con los patrones de recepción; mantener los que no coinciden; y vuelva a colocar todos los mensajes actualmente no deseados en la cola (al recibir todos los mensajes y luego enviarlos de regreso a sí mismo). Esto significa que hay un corto tiempo en el cual, si llega un mensaje, puede no terminar en el mismo lugar en la cola de mensajes que en el código compilado.

8

La diferencia más importante es que el intérprete de comandos se interpreta mientras que el código compilado es ... bien ... compilado. Esto tiene una diferencia observable en la velocidad de ejecución y el uso de memoria de la función. En otras palabras, puede encontrar que la variante interpretada es más lenta o consume toda su memoria mientras que la versión compilada no lo hace.

Este problema ha mordido a muchos programadores jóvenes de Erlang. Él o ella piensa que Erlang es bastante lento en comparación con otros idiomas, mientras que en realidad es una prueba de código interpretado contra compilado.

El párrafo es una medida de protección. Básicamente, el intérprete y el compilador deberían estar de acuerdo con todas las entradas/salidas de una función. Pero desafortunadamente ese no es siempre el caso. En la práctica, el intérprete y el compilador son motores de ejecución distintos y, por lo tanto, pueden diferir. Si realiza una compilación nativa a través de HiPE, los cambios pueden ser aún mayores. Por lo general, surgen problemas en torno a los números flotantes IEEE 754.

+1

Un caso en el que la diferencia de velocidad puede llegar es en la diversión creada en el caparazón. No se compilan y siempre se interpretarán incluso cuando se pasen al código compilado. – rvirding

Cuestiones relacionadas