В качестве фона для побочного проекта я читал о различных конструкциях виртуальных машин, и, конечно же, наибольшее внимание уделяется JVM. Я также рассмотрел BEAM (Erlang), GHC RTS (вроде, но не совсем виртуальную машину) и некоторые реализации JavaScript. У Python также есть интерпретатор байт-кода, который, как я знаю, существует, но о котором я мало читал.
Чего я не нашел, так это хорошего объяснения того, почему конкретные варианты дизайна виртуальных машин делаются для определенного языка. Меня особенно интересуют варианты дизайна, которые подходят для параллельных и / или очень динамических (Ruby, JavaScript, Lisp) языков.
Изменить: в ответ на комментарий с просьбой указать конкретику, вот пример. JVM использует стековую машину, а не регистровую машину, что было очень спорно, когда впервые была представлена Java. Оказалось, что инженеры, которые разработали JVM, сделали это, намереваясь переносить платформу, и преобразование стековой машины обратно в регистровую машину было проще и эффективнее, чем преодоление несоответствия импеданса, когда было слишком много или слишком мало виртуальных регистров.
Вот еще один пример: для Haskell документ, на который следует обратить внимание, - это Реализация ленивых функциональных языков на стандартном оборудовании: Spineless Tagless G-machine. Это сильно отличается от любого другого типа ВМ, о котором я знаю. И на самом деле GHC (основная реализация Haskell) не работает в реальном времени, а используется как промежуточный шаг при компиляции. Пейтон-Джонс перечисляет не менее 8 других виртуальных машин, которые не работали. Я хотел бы понять, почему одни виртуальные машины успешны, а другие терпят неудачу.
.class
на нем не запускаются. Байт-код для JVM транслируется в байт-код Dalvik перед тем, как поместить его на Android-устройство. - person John F. Miller   schedule 29.06.2012