¿Las corutinas son solo azúcar sintáctico para los manipuladores de finalización?

¿Las corutinas son solo azúcar sintáctico alnetworkingedor de los bloques de terminación y se crearán bloques de terminación debajo del capó? ¿O el concepto de corutinas es mucho más complejo y amplio que el truco del comstackdor, también conocido como azúcar sintáctica?

No es solo azúcar sintáctico, en absoluto. Las corutinas no bloquean los hilos, simplemente suspenden la ejecución, por lo tanto fomentan la progtwigción concurrente sin locking .

Las corutinas no dependen de las características del sistema operativo o la JVM (p. Ej., No están asignadas a Threads nativas). En cambio, las corutinas y las funciones de suspend particular son transformadas por el comstackdor que produce una máquina de estados capaz de manejar suspensiones en general y que pasan suspendiendo corutinas manteniendo su estado. Esto está habilitado por Continuaciones , que se agregan como un parámetro para cada function suspendida por el comstackdor; esta técnica se llama "estilo de continuación de la continuidad".

Para más detalles, consulte https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md

No, las corutinas no son azúcar sintáctico. Puedes pensar en corrutinas como en funciones que pueden interactuar con la persona que llama. Cuando llamas a una function normal, di que pasas el control a foo y tienes que esperar hasta que foo complete o arroje una exception. Las corutinas son funciones que pueden transferir el control a la persona que llama, y ​​la persona que llama puede decidir si la coroutine debe continuar y cuándo y cómo debe continuar la coroutine. Esto le da la oportunidad de implementar cosas que son construcciones de lenguaje especiales en otros idiomas:

  • Generadores (también conocidos como yield palabra key) como en C # y JavaScript. La persona que llama continúa la ejecución de coroutine cuando un usuario quiere un nuevo valor del iterador. Coroutine vuelve al llamador llamando a la function yield() , que también le transfiere cierto valor a la persona que llama.
  • Async / await como en C # y JavaScript. La persona que llama continúa la ejecución cuando se resuelve Futuro (similar a Tarea o Protable). Coroutine vuelve al llamador llamando a la function await await() . La persona que llama pasa el valor a coroutine cuando Future se resuelve y corutina observa este valor como resultado de la llamada await await() .
  • Goroutines / canales en Go.

A diferencia de C #, JavaScript o Go, Kotlin no implementa ninguna de estas características en la syntax especial. En cambio, Kotlin proporciona solo la syntax de suspend fun , y luego usted mismo puede implementar estas características (u get una existente de la biblioteca correspondiente llamada kotlinx.coroutines ).

Te aconsejo que escuches lo que Chris Lattner (creador de Swift) count sobre los futuros models Swift Concurrency. Enlace: https://spec.fm/podcasts/swift-unwrapped/84323

a las 11:30 él dice:

Puedes pensar en async / await como azúcar sintáctico solo para los manejadores de finalización

  • Clase de datos Kotlin de RealmObject
  • ¿Cómo implementar esta interfaz Java en Kotlin?
  • Obtener una URL en Android Kotlin de forma asíncrona
  • RecyclerView animation de elementos, se llama AnimationFinished, pero no está activado en AnimationStarted. ¿Por qué?
  • ¿En kotlin cómo hacer la function de aplicación instantánea?
  • ¿Cómo puedo pasar una reference de método adecuada para que Nashorn pueda ejecutarlo?
  • Los generics de Kotlin esperan un tipo inesperado
  • La inferencia de tipo del comstackdor Kotlin no puede elegir qué método llamar (ambigüedad con types generics)
  • ¿Es posible utilizar println como reference de function en Kotlin?
  • Problemas henetworkingando la class interna de Java
  • Kotlin y parallelStream toArray