Вопрос

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

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

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

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

Это было полезно?

Решение

Вероятно, ваш вопрос следует озаглавить как "Как сделать динамические языки работать?."

Это просто, они хранят информацию о типе переменной вместе с ней в памяти.И это делается не только на интерпретируемых или JIT-скомпилированных языках, но и на изначально скомпилированных языках, таких как Objective-C.

Другие советы

В большинстве языков виртуальных машин переменные могут быть концептуализированы как указатели (или ссылки) на память в куче, даже если сама переменная находится в стеке.Для языков, имеющих примитивные типы (например, int и bool в Java), они также могут храниться в стеке, но им нельзя назначать новые типы динамически.

Игнорируя примитивные типы, все переменные, существующие в стеке, имеют свои фактические значения, сохраненные в куче.Таким образом, если вы динамически переназначаете им значение, исходное значение отбрасывается (и память очищается с помощью некоторого алгоритма сборки мусора), а новое значение выделяется в новом бите памяти.

Виртуальная машина не имеет никакого отношения к языку.Поверх виртуальной машины может работать любой язык (в виртуальной машине Java уже есть сотни языков).

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

Это чрезвычайно низкий уровень, и во многих случаях он сильно основан на стеке - вместо регистров математика машинного уровня выполняется относительно местоположений относительно текущего указателя стека.

В обычных скомпилированных языках для одного шага требуется множество инструкций.a + может выглядеть как "Захватите элемент из точки относительно указателя стека в reg a, захватите другой в reg b.добавьте reg a и b.поместите reg a в место относительно указателя стека.

Виртуальная машина делает все это с помощью одной короткой инструкции, возможно, одного или двух байтов вместо 4 или 8 байтов НА ИНСТРУКЦИЮ на машинном языке (в зависимости от 32 или 64-разрядной архитектуры), что (предположительно) должно означать около 16 или 32 байт x86 для 1-2 байт машинного кода.(Я могу ошибаться, моя последняя кодировка x86 была в эпоху 80286.)

Microsoft использовала (вероятно, до сих пор использует) виртуальные машины в своих продуктах office, чтобы уменьшить объем кода.

Процедура создания кода виртуальной машины такая же, как и при создании машинного языка, только существенно отличается типом процессора.

Виртуальные машины также могут реализовывать свои собственные механизмы обеспечения безопасности, восстановления после ошибок и памяти, которые очень тесно связаны с языком.

Часть моего описания здесь является кратким изложением и составлена по памяти.Если вы хотите сами изучить определение байт-кода, это довольно забавно:

http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc.html

Ключ ко многим вопросам "как виртуальные машины обрабатывают такие переменные, как то или иное" на самом деле сводится к метаданным...Сохраненная и затем обновленная метаинформация дает виртуальной машине гораздо лучшее представление о том, как распределять переменные, а затем правильно обращаться с ними.

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

Что касается ваших конкретных вопросов - обработка переменных как ванильных объектов / etc ...все сводится к переназначению / переоценке метаинформации при новых назначениях - вот почему x может выглядеть сначала в одну сторону, а затем в другую.

Чтобы ответить на часть ваших вопросов, я бы порекомендовал технический специалист Google рассказывает о python, где даны ответы на некоторые из ваших вопросов , касающихся динамических языков;например, что такое переменная (это не указатель и не ссылка, а в случае python метка).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top