> "I’m wondering why you consider Java, Scala, and Kotlin to be “JIT-optimized languages”. What features of the languages themselves do you think tie them to the JIT?"
For me, the intensive use of reflection, dynamic proxy, dynamic loading of classes, class initializers, finalizers or green threads prevents them from being totally converted (or optimized) into a totally deterministic mode of operation.
But to produce a truly native binary (which does not embed an underlying runtime) the compiler must have a fully deterministic view of the program.
Scala, Kotlin, Java, Goovy all use intensively these mechanisms in their core functionality.
This is not linked to any design error, it is a conscious choice to be able to propose features that simplify the life of the developer by moving part of the complexity to the runtime, and to the JIT which then takes care of absorbing part of the overhead of these features.
Trying today to make these languages deterministic at compile time is for me a bit unnatural, just have a look at the page about GraalVM limitations to be convinced (https://www.graalvm.org/reference-manual/native-image/Limitations/).
I understand the interest of these initiatives, but they are for me more a transitional stage allowing companies to adapt their existing large codebase to the constraints of the Cloud. The final goal should rather be a migration to languages natively designed for static compilation.