Rispetto ad altre macchine virtuali, la JVM in realtà non è particolarmente versatile . Supporta direttamente OO staticamente digitato. Per tutto il resto, devi vedere quali parti puoi utilizzare e come puoi costruire tutto il resto del tuo linguaggio in più rispetto a quelle parti.
Ad esempio, fino a quando Java 7 ha introdotto il bytecode invokedynamic
, è stato molto difficile implementare un linguaggio OO dinamicamente tipizzato sulla JVM: è stato necessario utilizzare soluzioni alternative che erano dannose per le prestazioni e hanno provocato tracce di stack orribilmente gonfiate.
Eppure, un gruppo di linguaggi dinamici (Groovy, Jython, JRuby tra gli altri) sono stati implementati sulla JVM prima di quello.
Non perché la JVM sia così versatile, ma perché è così diffusa e perché ha implementazioni molto mature, ben supportate e ad alte prestazioni.
E, forse ancora più importante, perché c'è un'enorme quantità di codice Java là fuori che fa praticamente qualsiasi cosa, e se la tua lingua funziona sulla JVM, puoi facilmente offrire servizi per l'integrazione con quel codice. Fondamentalmente, avere la tua lingua eseguita sulla JVM è la versione del 21 ° secolo di offrire interoperabilità con C.