Dibandingkan dengan VM lain, JVM sebenarnya tidak terlalu serbaguna . Ini secara langsung mendukung OO yang diketik secara statis. Untuk yang lainnya, Anda harus melihat bagian apa yang dapat Anda gunakan, dan bagaimana Anda bisa membangun semua yang dibutuhkan bahasa Anda di atas bagian-bagian itu.
Sebagai contoh, sampai Java 7 memperkenalkan invokedynamic
bytecode, sangat sulit untuk mengimplementasikan bahasa OO yang diketik secara dinamis di JVM - Anda harus menggunakan solusi kompleks yang buruk untuk kinerja dan menghasilkan jejak tumpukan yang membengkak.
Namun, banyak bahasa dinamis (Groovy, Jython, JRuby, antara lain) diimplementasikan pada JVM sebelumnya.
Bukan karena JVM sangat fleksibel, tetapi karena sangat luas, dan karena ia memiliki implementasi yang sangat matang, didukung dengan baik, dan berkinerja tinggi.
Dan, mungkin bahkan lebih penting, karena ada sejumlah besar kode Java di luar sana melakukan cukup banyak hal, dan jika bahasa Anda berjalan pada JVM, Anda dapat dengan mudah menawarkan fasilitas untuk berintegrasi dengan kode itu. Pada dasarnya, menjalankan bahasa Anda di JVM adalah versi abad ke-21 yang menawarkan interoperabilitas dengan C.