Насколько я знаю, на более высоком уровне две виртуальные машины на самом деле очень похожи: обе являются классическими компьютерами, основанными на стеке, с в основном операциями высокого уровня (например, отправка виртуального метода является кодом операции). Тем не менее, CLR позволяет вам перейти к металлу, если вы хотите, поскольку он имеет указатели необработанных данных с арифметикой, указатели необработанных функций, объединения и т. Д. Он также имеет надлежащие вызовы хвоста. Таким образом, если для реализации языка требуется что-либо из вышеперечисленного (например, спецификация схемы требует мандатных вызовов), или если оно обладает значительными преимуществами, имея эти функции, то вы, вероятно, захотите пойти по пути CLR.
Другое преимущество заключается в том, что вы получаете стандартный API для выдачи там байт-кода - System.Reflection.Emit
- даже если он несколько ограничен для сценариев полноценного компилятора, его все же обычно достаточно для простого компилятора.
Благодаря JVM вы получаете два основных преимущества: лучшую переносимость и тот факт, что сам байт-код, возможно, проще (из-за меньшего количества функций).