Подтвердить что ты не робот

Как работает виртуальная машина?

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

С условием, что я сделал, что меня обманывает, так это то, что многие некомпилированные языки допускают переменные с "либеральными" типами систем. Например, в Python я могу написать это:

x = "Hello world!"
x = 2**1000

Строки и большие целые числа полностью не связаны между собой и занимают разное количество места в памяти, поэтому как этот код может быть представлен даже в среде на основе стека? Что именно здесь происходит? Является ли x указателем на новое место в стеке, а старые данные строк остались без ссылок? Не используют ли эти языки стек? Если нет, то как они представляют переменные внутри?

4b9b3361

Ответ 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, где некоторые из ваших вопросов, касающихся динамических языков ответы; например, какая переменная (это не указатель, не ссылка, а в случае питона - метка).