Un equipo de la Universidad Brown publica un estudio que disecciona las diferencias semánticas entre las implementaciones de async/await en lenguajes como C#, JavaScript, Swift, Python y Rust. Los autores, Gavin Gray, Shriram Krishnamurthi y Will Crichton, parten de una observación: pese a compartir la misma sintaxis, ninguna pareja de estos lenguajes produce el mismo comportamiento en contextos equivalentes, lo que confunde a desarrolladores y diseñadores.
El trabajo introduce un espacio de diseño con nueve dimensiones que cubren el ciclo de vida completo de un cómputo asíncrono: garantías al invocar una función asíncrona, manejo del fin de una tarea, cancelación, propagación de errores y relación con runtimes configurables como Tokio o Smol en Rust. Cada dimensión se analiza con ejemplos concretos, discusión informal y una semántica operacional formal basada en un cálculo con continuaciones delimitadas.
El artículo contextualiza async/await como respuesta a la inversión de control de los callbacks, distinguiendo asincronía de concurrencia y paralelismo. Su objetivo es ofrecer a programadores, diseñadores de lenguajes y teóricos un mapa común para entender y comparar estas propuestas. El texto completo está disponible en arXiv con licencia Creative Commons.
