Pregunta

¿Cuáles son algunas de las críticas contra exponer las continuaciones como objetos de primera clase?

Yo creo que es bueno tener de primera clase continuaciones.Se permite un completo control sobre el flujo de ejecución de instrucciones.Los programadores avanzados pueden desarrollar soluciones intuitivas para cierto tipo de problemas.Por ejemplo, las continuaciones se utilizan para controlar el estado de los servidores web.Una implementación del lenguaje puede ser muy útil de las abstracciones en la parte superior de las continuaciones.Por ejemplo, hilos verdes.

A pesar de todos estos, hay fuertes argumentos en contra de primera clase continuaciones?

¿Fue útil?

Solución

En primer lugar, no es más que un simple llamada / cc cuando se trata de la continuación. Sugiero comenzar con Mark Feelys papel: Una mejor API para continuaciones de primera clase

El siguiente sugiero leer sobre el control de los operadores cambian y se restablecen, que es una forma diferente de representar contunations.

Otros consejos

La realidad es que muchos de los útiles en situaciones donde usted podría utilizar continuaciones ya están cubiertos por el lenguaje especializado de las construcciones:lanzar/catch, volver, C#o Python rendimiento.Por lo tanto, el lenguaje de los implementadores realmente no tienen mucho incentivo para proporcionar en forma generalizada a los utilizable para liar sus propias soluciones.

En algunos idiomas, la generalización de las continuaciones son muy difíciles de implementar de manera eficiente.Basado en pila de idiomas (es decir,la mayoría de los idiomas), básicamente, tienen que copiar toda la pila cada vez que se crea una continuación.

Los idiomas pueden implementar ciertas continuación-como las características, las que no rompen el básico basado en pila de modelo, mucho más eficiente que el caso general, pero la implementación generalizada de las continuaciones es un poco más difícil y no vale la pena.

Los lenguajes funcionales son más propensos a implementar las continuaciones para un par de razones:

  1. Ellos son frecuentemente implementadas en la continuación de pasar estilo, lo que significa que la llamada "pila" es, probablemente, una lista vinculada asignados en el montón.Esto hace que sea trivial para pasar un puntero a la pila como una continuación, ya que no es necesario sobrescribir el marco de pila cuando usted abre el cuadro actual y el empuje de una nueva.(Nunca he implementado CPS, pero esa es mi interpretación de ella.)
  2. Están a favor de inmutable enlaces de datos, que hacen que su antiguo continuación mucho más útil debido a que no se han alterado el contenido de las variables que la pila señaló que cuando se creó.

Por estas razones, las continuaciones son propensos a permanecer en su mayoría sólo en el dominio de los lenguajes funcionales.

Una objeción importante es el costo de implementación. Si el tiempo de ejecución utiliza una pila, entonces continuaciones de primera clase requieren una copia pila en algún momento. El costo de copia puede ser controlado (ver representativas de dicho control en la Presencia de Primera Clase continuaciones para una buena estrategia), pero también significa que las variables mutables no pueden ser asignados en la pila. Esto no es un problema para (por ejemplo, el Esquema) lenguajes funcionales o mayormente-funcionales, pero esto implica una sobrecarga significativa para lenguajes orientados a objetos.

  1. La mayoría de los programadores no las entienden. Si tiene código que los utiliza, es más difícil encontrar programadores de reemplazo que será capaz de trabajar con él.
  2. Las continuaciones son difíciles de aplicar en algunas plataformas. Por ejemplo, JRuby no soporta continuaciones.

continuaciones de primera clase socavan la capacidad de razonar sobre el código, especialmente en idiomas que permiten continuaciones a ser asignados a las variables imperativamente, porque el interior de los cierres pueden ser llevados vida de nuevo en formas peludas.

Cf. la queja de Kent Pitman sobre continuaciones , acerca de la camino complicado que descansar-proteger interactúa con llamada / cc

Llamada / cc es el 'Goto' de la programación funcional avanzada (al estilo de la aquí ).

1.8 en la implementación de rubí era extremadamente lento. mejor en 1.9, y por supuesto la mayoría de los esquemas se habían incorporado en ellas y un buen rendimiento desde el primer momento.

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