Author here: Jactl is a secure embeddable scripting language that compiles to bytecode and supports Java 8 and later versions. The article describes how Continuations were used to provide Virtual Thread-like behaviour for scripts.
Blocking operations suspend a script which is then resumed from where it left off once the operation completes.
I implemented continuations (required for Python generators) differently in my Python (AST) to Java (bytecode) translator. The switch dispatch to restore variables and jump to next location is the same, but instead of throwing an exception, I treated each function as its own class and stored the stack, variables, etc. on the class (relevant code: https://github.com/cdis-vm/cdis2java/blob/main/src/main/java...). When you "call" the generator, what you actually get is a new instance of that class, so multiple threads can call the function with different arguments.
Note: the code itself is far from production ready, do not use this!
I think this is similar to the way Kotlin implements coroutine.
I believe Kotlin goes to the extra miles to also capture parts of the stack frames when creating the Continuation object so even when the runtime resume the continuation, the exceptions thrown later get the "correct" stack trace (not the one that shows that you come from a call through a MethodHandle).
As a related work regarding continuations, there was also a thesis by Andrea Bernardini (https://andrebask.github.io/thesis), with similar principal idea
reply