2009-04-28 16 views
14

De acuerdo con esta respuesta¿Qué significa realmente que un lenguaje de programación no es apilado?

https://stackoverflow.com/questions/551950/what-stackless-programming-languages-are-available/671296#671296

todos estos lenguajes de programación son sin apilado

  • Stackless Python
  • PyPy
  • Lisp
  • Esquema
  • Tcl
  • Lua
  • loro VM

Lo que significa realmente para que sean sin pérdida de velocidad? ¿Significa que no usan una pila de llamadas? Si no usan una pila de llamadas, ¿qué usan?

+0

Véase la respuesta al http://stackoverflow.com/questions/1016218/how-does-a-stackless-language-work/1053159#1053159 –

+0

no existe La página http://stackoverflow.com/questions/551950/what-stackless-programming-languages-are-available/671296 # 671296 –

Respuesta

14

¿Qué significa realmente para ellos ser apilados? ¿Significa que no usan una pila de llamadas?

Sí, eso es todo.

Si no usan una pila de llamadas, ¿qué utilizan?

La implementación exacta, por supuesto, variará de un idioma a otro. En Stackless Python, hay un despachador que inicia el intérprete de Python utilizando el marco superior y sus resultados. El intérprete procesa los códigos de operación según sea necesario de uno en uno hasta que llegue al código de operación CALL_FUNCTION, la señal que está a punto de ingresar en una función. Esto hace que el despachador construya un nuevo marco con la información relevante y lo devuelva al despachador con el indicador de desenrollado. A partir de ahí, el despachador comienza de nuevo, señalando al intérprete en el marco más alto.

Los idiomas apáticos evitan las pilas de llamadas por varias razones, pero en muchos casos se utilizan para que ciertas construcciones de programación sean mucho más fáciles de implementar. El canónico es continuations. Las continuas son estructuras de control muy potentes y muy simples que pueden representar cualquiera de las estructuras de control habituales con las que probablemente ya esté familiarizado (while, do, if, switch, etc.).

Si eso es confuso, es posible que desee para tratar de envolver su cabeza alrededor de un artículo de Wikipedia, y en particular la cursi continuación analogía sándwich:

Digamos que estás en la cocina delante de la nevera , pensando en un sándwich. Tomas una continuación allí y la guardas en tu bolsillo. Luego, saca un poco de pavo y pan del refrigerador y hazte un sándwich, que ahora está sobre el mostrador. Usted invoca la continuación en su bolsillo, y se encuentra frente a la nevera de nuevo, pensando en un emparedado. Pero afortunadamente, hay un bocadillo en el mostrador, y todos los materiales utilizados para hacerlo desaparecen. Entonces te lo comes

10

No usan una pila de llamadas, porque funcionan en continuation-passing style. Si no está familiarizado con la optimización de la cola de llamada, ese es probablemente un buen primer paso para entender lo que esto significa.

Para emular la llamada/devolución tradicional en este modelo, en lugar de presionar una dirección de retorno y esperar que el resto del fotograma permanezca intacto, la persona que llama cierra el resto de su código y las variables que aún se necesitan (el resto son liberados). Luego realiza una llamada de cola al destinatario, pasando esta continuación como argumento. Cuando el destinatario "vuelve", lo hace llamando a esta continuación, pasando el valor de retorno como un argumento para ello.

En cuanto a lo anterior, es simplemente una forma complicada de hacer llamadas de función. Sin embargo, se generaliza muy bien a escenarios más complejos:

  1. excepción/fin/etc bloques son muy fácilmente modelados - si puede pasar una continuación de "retorno" como un argumento, se puede pasar 2 (o más) justo tan facilmente Los bloques de "control de condición" lisp-y (que pueden o no devolver el control a la persona que llama) también son fáciles: pase una continuación para el resto de esta función, que podría o no invocarse.
  2. Los valores de retorno múltiples se simplifican de manera similar: pase varios argumentos a la continuación.
  3. Los temporales de devolución/copia no son más diferentes que el paso del argumento de función. Esto a menudo hace que sea más fácil eliminar los temporales.
  4. La optimización de recurrencia de cola es trivial: la persona que llama simplemente transfiere la continuación de "devolución" que recibió en lugar de capturar una nueva.
Cuestiones relacionadas