Соответствие дизайна виртуальной машины ее основному языку программирования

В качестве фона для побочного проекта я читал о различных конструкциях виртуальных машин, и, конечно же, наибольшее внимание уделяется JVM. Я также рассмотрел BEAM (Erlang), GHC RTS (вроде, но не совсем виртуальную машину) и некоторые реализации JavaScript. У Python также есть интерпретатор байт-кода, который, как я знаю, существует, но о котором я мало читал.

Чего я не нашел, так это хорошего объяснения того, почему конкретные варианты дизайна виртуальных машин делаются для определенного языка. Меня особенно интересуют варианты дизайна, которые подходят для параллельных и / или очень динамических (Ruby, JavaScript, Lisp) языков.


Изменить: в ответ на комментарий с просьбой указать конкретику, вот пример. JVM использует стековую машину, а не регистровую машину, что было очень спорно, когда впервые была представлена ​​Java. Оказалось, что инженеры, которые разработали JVM, сделали это, намереваясь переносить платформу, и преобразование стековой машины обратно в регистровую машину было проще и эффективнее, чем преодоление несоответствия импеданса, когда было слишком много или слишком мало виртуальных регистров.

Вот еще один пример: для Haskell документ, на который следует обратить внимание, - это Реализация ленивых функциональных языков на стандартном оборудовании: Spineless Tagless G-machine. Это сильно отличается от любого другого типа ВМ, о котором я знаю. И на самом деле GHC (основная реализация Haskell) не работает в реальном времени, а используется как промежуточный шаг при компиляции. Пейтон-Джонс перечисляет не менее 8 других виртуальных машин, которые не работали. Я хотел бы понять, почему одни виртуальные машины успешны, а другие терпят неудачу.


person John F. Miller    schedule 09.06.2012    source источник
comment
Это слишком широкая тема. Можете ли вы назвать некоторые аспекты дизайна, которые вас больше всего интересуют? Или любые другие примеры. +1 от меня в любом случае, так как это может привести к некоторым интересным ответам.   -  person Jivings    schedule 09.06.2012
comment
JVM Dalvik использует архитектуру на основе регистров - en.wikipedia.org/wiki/Dalvik_ (программное обеспечение) < / а>   -  person SpacedMonkey    schedule 28.06.2012
comment
Вам следует ознакомиться с документацией к Parrot parrot.org, который изначально был разработан для Perl, но с тех пор используется для нескольких других языков. В документации рассказывается о возможностях виртуальных машин для динамически типизированных языков по сравнению с более статическими языками, такими как Java.   -  person Gene    schedule 29.06.2012
comment
SpacedMonkey - Dakvik не является JVM, и файлы JVM .class на нем не запускаются. Байт-код для JVM транслируется в байт-код Dalvik перед тем, как поместить его на Android-устройство.   -  person John F. Miller    schedule 29.06.2012
comment
Мне было бы очень интересно узнать, как много, скажем, C # и VB.net связаны с .net IL, а какое просто основано на уроках, извлеченных из Java и x86.   -  person SilverbackNet    schedule 29.06.2012
comment
Разве это не лучше подходит для программистов?   -  person Austin Henley    schedule 29.06.2012
comment
Я чувствую, что это может быть один из самых крутых, совершенно неуместных вопросов, которые я видел на SO. Я чертовски хотел бы знать, какие ответы вы получите, но, может быть, это лучше подходит для Reddit или чего-то еще. См. FAQ: ваши вопросы должны иметь разумный масштаб. Если вы можете представить себе целую книгу, которая отвечает на ваш вопрос, вы задаете слишком много.   -  person mergeconflict    schedule 30.06.2012
comment
Вы можете проверить эту pagesperso-systeme.lip6.fr/Nicolas. Джеффрей / files / pppj-08.pdf   -  person dilip kumbham    schedule 10.07.2012


Ответы (3)


Я отвечу на ваш вопрос с другой стороны: что такое виртуальная машина? ВМ - это просто спецификация для «интерпретатора» языка более низкого уровня, чем исходный язык. Здесь я использую значение слова «интерпретатор» в черном ящике. Меня не волнует, как будет реализована виртуальная машина (как интерпретатор байт-кода, JIT-компилятор, что угодно). В такой формулировке с точки зрения дизайна виртуальная машина не самая интересная вещь, это язык низкого уровня.

Идеальный язык виртуальных машин будет делать две вещи. Во-первых, это упростит компиляцию исходного языка в него. И, во-вторых, это также упростит интерпретацию на целевой платформе (ах) (где, опять же, интерпретатор может быть реализован очень наивно или может представлять собой действительно сложную JIT, такую ​​как Hotspot или V8).

Очевидно, есть противоречие между этими двумя желательными свойствами, но они более или менее образуют две конечные точки на линии, проходящей через пространство дизайна всех возможных виртуальных машин. (Или, возможно, более сложная форма, чем линия, потому что это не плоское евклидово пространство, но идею вы поняли). Если вы создадите свой язык виртуальной машины далеко за пределами этой линии, это не будет очень полезно. Вот что ограничивает дизайн ВМ: помещать ее где-нибудь в эту идеальную линию.

Эта линия также является причиной того, почему виртуальные машины высокого уровня, как правило, сильно зависят от языка, в то время как виртуальные машины низкого уровня больше не зависят от языка, но не предоставляют много услуг. Виртуальная машина высокого уровня по своей природе близка к исходному языку, что отличает ее от других, отличных от исходных языков. Низкоуровневая виртуальная машина по своей природе близка к целевой платформе, поэтому она близка к концу идеальной линии для многих языков, но эта низкоуровневая виртуальная машина также будет довольно далеки от конца идеальной линии "легко компилировать". большинство исходных языков.

В более широком смысле концептуально любой компилятор можно рассматривать как серию преобразований от исходного языка к промежуточным формам, которые сами по себе могут рассматриваться как языки для виртуальных машин. Виртуальные машины для промежуточных языков могут никогда не быть построены, но могут. В конечном итоге компилятор выдает окончательную форму. И эта окончательная форма сама по себе будет языком для виртуальной машины. Мы могли бы назвать эту виртуальную машину «JVM», «V8» ... или мы могли бы назвать эту виртуальную машину «x86», «ARM» и т. Д.

Надеюсь, это поможет.

person James Iry    schedule 09.07.2012

Один из методов получения виртуальной машины - просто спуститься по цепочке компиляции, преобразовывая исходный язык во все больше и больше промежуточных языков низкого уровня. Как только вы обнаружите достаточно низкоуровневый язык, подходящий для плоского представления (то есть тот, который может быть сериализован в последовательность «инструкций»), это в значительной степени ваша виртуальная машина. А ваш интерпретатор виртуальной машины или JIT-компилятор просто продолжит вашу цепочку преобразований с точки, которую вы выбрали для сериализации.

Некоторые методы сериализации очень распространены - например, использование представления псевдостека для деревьев выражений (например, в .NET CLR, которая вообще не является «настоящей» стековой машиной). В противном случае вы можете использовать SSA-форму для сериализации, как в LLVM, или просто 3-адресную виртуальную машину с бесконечным количеством регистров (как в Dalvik). На самом деле не имеет значения, какой путь вы выберете, поскольку это всего лишь сериализация, и она будет десериализована позже, чтобы продолжить ваш обычный способ компиляции.

Немного другая история, если вы намереваетесь сразу же интерпретировать свой код виртуальной машины, а не компилировать его. В настоящее время нет единого мнения о том, какие виртуальные машины лучше подходят для интерпретации. И виртуальные машины на основе стека (или, я бы сказал, Forth), и виртуальные машины на основе регистров доказали свою эффективность.

person SK-logic    schedule 01.07.2012

Я нашел эту книгу полезной. В нем обсуждаются многие вопросы, о которых вы спрашиваете. (обратите внимание, что я никоим образом не связан с Amazon и не продвигаю Amazon; просто это было самое простое место для ссылки).

https://rads.stackoverflow.com/amzn/click/com/1852339691

person Jim    schedule 29.06.2012
comment
Это не ответ, вы могли бы упомянуть его как комментарий - person dilip kumbham; 01.07.2012
comment
Не могли бы вы вкратце изложить то, что было сказано по этой теме? - person John F. Miller; 01.07.2012
comment
Есть целая глава о методах реализации, в которой сравниваются машины на основе стека и машины с регистрами. - person Jim; 01.07.2012
comment
Забавно, что вы отрицаете ответ, когда задаете общий вопрос, на который нет конкретного ответа. Что ты сделал, чтобы помочь себе? Какая конкретная проблема у вас возникла с вашим исследованием? Прочтите книгу, если хотите сравнить конструкции виртуальных машин и то, как они используются в различных ситуациях. - person Jim; 01.07.2012
comment
Извини, Джим, это не о чтении Книги, это что-то более практическое, чем просто предложение книги. - person dilip kumbham; 01.07.2012
comment
Плохой вопрос. Лучший ответ, который может быть дан, если не писать книгу вместо ответа, - это предложить книгу. Это мое мнение по этому поводу. - person Jim; 01.07.2012