В качестве фона для побочного проекта я читал о различных проектах виртуальных машин, и, конечно же, JVM получил максимальную отдачу. Я также посмотрел на BEAM (Erlang), GHC RTS (вроде, но не совсем VM) и некоторые из реализаций JavaScript. У Python также есть интерпретатор байт-кода, который я знаю, но он мало что читал.
То, что я не нашел, является хорошим объяснением того, почему конкретные варианты выбора виртуальной машины сделаны для определенного языка. Меня особенно интересуют варианты дизайна, которые бы соответствовали параллельным и/или очень динамичным (Ruby, JavaScript, Lisp) языкам.
Изменить: В ответ на комментарий, требующий специфики, приведен пример. JVM использует старую машину, а не регистрационную машину, что было очень противоречивым, когда Java была впервые введена. Оказалось, что инженеры, которые проектировали JVM, сделали это, предполагая переносимость платформы, а преобразование стекового компьютера обратно в регистрационную машину было проще и эффективнее, чем преодоление несоответствия импеданса, когда было слишком много или слишком мало регистров виртуальных.
Вот еще один пример: для Haskell документ, на который нужно обратить внимание, Внедрение ленивых функциональных языков на биржевом оборудовании: Бесконечная безматрица G-машина. Это очень отличается от любого другого типа VM, о котором я знаю. На самом деле GHC (премьера реализации Haskell) не работает вживую, а используется как промежуточный шаг в компиляции. Пейтон-Джонс перечисляет не менее 8 других виртуальных машин, которые не работают. Я хотел бы понять, почему какая-то виртуальная машина преуспевает там, где другие терпят неудачу.