¿Qué quiere decir realmente que un lenguaje de programación es stackless?

StackOverflow https://stackoverflow.com/questions/796211

  •  18-09-2019
  •  | 
  •  

Pregunta

De acuerdo a esta respuesta

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

todos estos lenguajes de programación son stackless

  • Stackless Python
  • PyPy
  • Lisp
  • Esquema de
  • Tcl
  • Lua
  • Parrot VM

¿Qué significa realmente para ser stackless?Qué significa que no utilice una pila de llamadas?Si no usan una pila de llamadas, ¿que uso?

¿Fue útil?

Solución

  

¿Qué significa realmente para que sean sin pérdida de velocidad? ¿Quiere decir que no utilizan una pila de llamadas?

Sí, eso es correcto.

  

Si no utilizan una pila de llamadas, lo utilizan?

La aplicación exacta será, por supuesto, variar de un idioma a otro. En Stackless Python, hay un despachador que se inicia el intérprete de Python usando el bastidor superior y sus resultados. El intérprete procesa códigos de operación según sea necesario uno a la vez hasta que llega a un código de operación CALL_FUNCTION, la señal de que estás a punto de entrar en una función. Esto hace que el despachador para construir un nuevo marco con la información relevante y volver al despachador con la bandera de desenrollado. A partir de ahí, el despachador comienza de nuevo, señalando el intérprete en el marco superior.

idiomas Stackless evitan las pilas de llamadas para un número de razones, pero en muchos casos se utiliza de modo que ciertas construcciones de programación se hacen mucho más fácil de implementar. La canónica es continuaciones . Continuaciones son estructuras de control muy potentes, muy simples que pueden representar a cualquiera de las estructuras de control habituales probablemente ya está familiarizado con (while, do, if, switch, etcétera).

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 sándwich analogía

  

Digamos que estás en la cocina en la parte frontal del refrigerador, pensando en un sándwich. Se toma una continuación allí mismo y lo pega en el bolsillo. A continuación, se obtiene un poco de pavo y pan de la nevera y hacerte un sándwich, que ahora está sentado en el mostrador. Se invoca la continuación en el bolsillo, y usted se encuentra de pie delante de la nevera de nuevo, pensando en un sándwich. Pero, afortunadamente, hay un sándwich en el mostrador, y todos los materiales utilizados en su elaboración se han ido. Así lo comes.

Otros consejos

No utilizan una pila de llamadas, porque operan en estilo de continuación que pasa . Si usted no está familiarizado con la optimización de llamada de cola, que es probablemente un buen primer paso para entender lo que esto significa.

Para emular la llamada tradicional / retorno de este modelo, en lugar de empujar una dirección de retorno y esperar que el resto de la trama de permanecer intacta la persona que llama se cierra sobre el resto de su código y las variables que siguen siendo necesarios (el resto son liberado). A continuación, realiza una llamada a la cola del destinatario de la llamada, pasando esta continuación como argumento. Cuando el destinatario de la llamada "devuelve", lo hace llamando a esta continuación, pasar el valor de retorno como un argumento a la misma.

En cuanto a lo anterior ocurre, es simplemente una manera complicada de hacer llamadas a funciones. 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) con la misma facilidad. Lisp-Y bloques "manejador de condiciones" (que puede o no puede devolver el control a la persona que llama) son también fácil -. pasar una continuación para el resto de esta función, que podría o no podría llamarse
  2. Múltiples valores de retorno se realizan de manera similar fácil -. Pasar varios argumentos sobre la continuación
  3. temporales de retorno / copiado ya no son diferentes a paso de argumentos de función. A menudo, esto hace que sea más fácil para eliminar los temporales.
  4. optimización de recursión de cola es trivial - la persona que llama simplemente pasa sobre la continuación de "retorno" que recibió en lugar de la captura de uno nuevo
  5. .
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top