Как работает виртуальная машина?
Я изучал, как работают языки программирования, а некоторые из них имеют так называемые виртуальные машины. Я понимаю, что это некоторая форма эмуляции языка программирования на другом языке программирования и что он работает так же, как скомпилированный язык будет выполнен со стеком. Правильно ли я понял?
С условием, что я сделал, что меня обманывает, так это то, что многие некомпилированные языки допускают переменные с "либеральными" типами систем. Например, в Python я могу написать это:
x = "Hello world!"
x = 2**1000
Строки и большие целые числа полностью не связаны между собой и занимают разное количество места в памяти, поэтому как этот код может быть представлен даже в среде на основе стека? Что именно здесь происходит? Является ли x указателем на новое место в стеке, а старые данные строк остались без ссылок? Не используют ли эти языки стек? Если нет, то как они представляют переменные внутри?
Ответы
Ответ 1
Возможно, ваш вопрос должен иметь название "Как работают динамические языки?".
Это просто, они сохраняют информацию типа переменной вместе с ней в памяти. И это делается не только в интерпретируемых или JIT-скомпилированных языках, но также в естественных скомпилированных языках, таких как Objective-C.
Ответ 2
В большинстве языков VM переменные могут быть концептуализированы как указатели (или ссылки) на память в куче, даже если сама переменная находится в стеке. Для языков, которые имеют примитивные типы (например, int и bool в Java), они также могут быть сохранены в стеке, но им не могут быть назначены новые типы динамически.
Игнорируя примитивные типы, все переменные, которые существуют в стеке, имеют свои фактические значения, хранящиеся в куче. Таким образом, если вы динамически переназначаете для них значение, исходное значение будет отменено (а память очищена с помощью некоторого алгоритма сбора мусора), а новое значение будет выделено в новом бите памяти.
Ответ 3
VM не имеет ничего общего с языком. Любой язык может работать поверх VM (у Java VM уже сотни языков).
Виртуальная виртуальная машина позволяет запустить другой тип "языка ассемблера", который больше подходит для адаптации компилятора. Все, что сделано в виртуальной машине, можно сделать в CPU, поэтому подумайте о VM как о процессоре. (Некоторые из них реализованы на аппаратном уровне).
Это чрезвычайно низкий уровень, а во многих случаях сильно основан на стеке - вместо регистров математика машинного уровня относится к местоположениям относительно текущего указателя стека.
С обычными скомпилированными языками для одного шага требуется много инструкций. a + может выглядеть так: "Возьмите элемент из точки относительно указателя стека в reg a, возьмите другую в reg b. добавьте reg a и b. поместите reg a в место относительно указателя стека.
VM делает все это с помощью одной короткой инструкции, возможно, одного или двух байтов вместо 4 или 8 байтов PER INSTRUCTION в машинном языке (в зависимости от архитектуры 32 или 64 бит), которая (угадывание) должна означать около 16 или 32 байты x86 для 1-2 байтов машинного кода. (Я мог ошибаться, мое последнее кодирование x86 было в эпоху 80286.)
Microsoft использовала (возможно, все еще использует) виртуальные машины в своих офисных продуктах, чтобы уменьшить количество кода.
Процедура создания кода виртуальной машины такая же, как и для создания машинного языка, в основном по типу процессора.
VM также могут реализовать свои собственные механизмы защиты, восстановления ошибок и памяти, которые очень тесно связаны с языком.
Некоторые из моих описаний здесь суть резюме и из памяти. Если вы хотите самостоятельно изучить определение байт-кода, это выглядит как весело:
http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc.html
Ответ 4
Ключ к многим из того, как виртуальные машины обрабатывают переменные, подобные тому или иному, действительно сводится к метаданным... Мета-информация, хранящаяся, а затем обновленная, дает VM гораздо лучший способ определить, как распределить, а затем выполнить правильная вещь с переменными.
Во многих случаях это накладные расходы, которые могут действительно мешать производительности. Тем не менее, современные современные реализации и т.д. Прошли долгий путь в правильном направлении.
Что касается ваших конкретных вопросов - обработка переменных как объектов ванили/и т.д. сводится к переназначению/переоценке метаинформации о новых назначениях - поэтому x может выглядеть так, а затем и в следующем.
Ответ 5
Чтобы ответить на часть ваших вопросов, я бы рекомендовал google tech talk о python, где некоторые из ваших вопросов, касающихся динамических языков ответы; например, какая переменная (это не указатель, не ссылка, а в случае питона - метка).