Jump to content

Перл виртуальная машина

Виртуальная машина Perl это на основе стека, виртуальная машина процессов реализованная как кодов операций интерпретатор , который запускает ранее скомпилированные программы, написанные на языке Perl . Интерпретатор кодов операций является частью интерпретатора Perl, который также содержит компилятор ( лексер , анализатор и оптимизатор ) в одном исполняемом файле, обычно /usr/bin/perl в различных Unix-подобных системах или perl.exe в системах Microsoft Windows .

Выполнение

[ редактировать ]

Коды операций

[ редактировать ]

Компилятор Perl выводит скомпилированную программу в память как внутреннюю структуру, которую можно представить в виде древовидного графа, в котором каждый узел представляет код операции. Коды операций представлены внутри typedefs . Каждый код операции имеет указатели следующего / другого и первого / родственного узла , поэтому дерево кодов операций можно нарисовать как базовое дерево ОП, начиная с корневого узла, или как плоский список ОП в том порядке, в котором они обычно выполняются от начального узла. Дерево кодов операций можно сопоставить с исходным кодом, поэтому его можно декомпилировать в исходный код высокого уровня. [1]

Интерпретатор кодов операций Perl реализован как обходчик дерева, который перемещается по дереву кодов операций в порядке выполнения от начального узла, следуя за указателями next или другими указателями. Каждый код операции имеет указатель на функцию pp_ opname , т.е. код операции Say вызывает функцию pp_say внутреннего API Perl.

Этап компиляции программы Perl скрыт от конечного пользователя, но его можно открыть с помощью модуля B Perl. [2] или другие специализированные модули, такие как модуль B::Concision Perl. [3]

Пример простой скомпилированной программы Hello world, выгруженной в порядке выполнения (с модулем B::Concision Perl):

$ perl -MO=Concise,-exec -E 'say "Hello, world!"'
1  <0> enter
2  <;> nextstate(main 46 -e:1) v:%,{
3  <0> pushmark s
4  <$> const[PV "Hello, world!"] s
5  <@> say vK
6  <@> leave[1 ref] vKP/REFC

Некоторые коды операций (entereval, dofile, require) вызывают функции компилятора Perl, которые, в свою очередь, генерируют другие коды операций в той же виртуальной машине Perl.

Переменные

[ редактировать ]

Переменные Perl могут быть глобальными, динамическими ( ключевое слово local ) или лексическими ( ключевые слова my и Our ).

Глобальные переменные доступны через stash и соответствующий typeglob .

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

Лексические переменные хранятся в списке закладок .

Структуры данных

[ редактировать ]

Структуры данных Perl VM внутренне представлены typedefs .

Внутренние структуры данных можно изучить с помощью модуля B Perl. [2] или другие специализированные инструменты, такие как модуль Devel::Peek Perl. [4]

типы данных

[ редактировать ]

В Perl есть три определения типов, которые обрабатывают три основных типа данных Perl: скалярное значение ( SV ), значение массива ( AV ), хэш-значение ( HV ). Perl использует специальное определение типа для простых целых чисел со знаком ( IV ), целых чисел без знака ( UV ), чисел с плавающей запятой ( NV ) и строк ( PV ).

Perl использует механизм сборки мусора, управляемый подсчетом ссылок . SV, AV или HV начинают свою жизнь со счетчиком ссылок, равным 1. Если счетчик ссылок значения данных упадет до 0, то оно будет уничтожено, а его память станет доступной для повторного использования.

Другими определениями типов являются Glob Value ( GV ), которые содержат именованные ссылки на различные объекты, Code Value ( CV ), которые содержат ссылку на подпрограмму Perl, обработчик ввода-вывода ( IO ), ссылку на регулярное выражение ( REGEXP ; RV в Perl до 5.11), ссылка на скомпилированный формат выходной записи ( FM ) и простая ссылка, которая представляет собой специальный тип скаляра, указывающего на другие типы данных ( RV ).

Специальное значение хэша — это stash , хэш, содержащий все переменные, определенные в пакете. Каждое значение в этой хеш-таблице является глобальным значением ( GV ).

Специальное значение массива — это список , который представляет собой массив массивов. Это 0-й элемент AV, содержащий все имена лексических переменных (с префиксными символами), используемые в этой подпрограмме. Первый элемент списка контактов указывает на блокнот AV, элементы которого содержат значения, соответствующие лексическим переменным, указанным в 0-й строке. Другие элементы списка создаются при рекурсии подпрограммы или создании нового потока.

В Perl имеется несколько стеков для хранения данных, над которыми он работает.

Стек аргументов

[ редактировать ]

Аргументы передаются в код операции и возвращаются из кода операции с использованием стека аргументов. Типичный способ обработки аргументов — извлечь их из стека, а затем поместить результат обратно в стек.

Отметить стопку

[ редактировать ]

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

Сохранить стек

[ редактировать ]

Этот стек используется для сохранения и восстановления значений локальных переменных с динамической областью действия .

Стек области действия

[ редактировать ]

Этот стек хранит информацию о фактической области действия и используется только в целях отладки.

Другие реализации

[ редактировать ]

Для языка Perl и виртуальной машины Perl не существует стандартизации. Внутренний API считается нестабильным и меняется от версии к версии. Виртуальная машина Perl тесно связана с компилятором.

Наиболее известной и стабильной реализацией является модуль B::C Perl. [5] который преобразует дерево кодов операций в представление на языке программирования C и добавляет собственный обходчик дерева.

Другая реализация — модуль Acme::Perl::VM Perl. [6] это реализация, закодированная только на языке Perl, но она по-прежнему связана с исходной виртуальной машиной Perl через модули B::.

См. также

[ редактировать ]
  1. ^ «B::Deparse — серверная часть компилятора Perl для создания кода Perl» .
  2. ^ Jump up to: а б «B — Серверная часть компилятора Perl» .
  3. ^ «B::Concision — просмотр синтаксического дерева Perl, вывод краткой информации об операциях» .
  4. ^ «Devel::Peek — инструмент отладки данных для XS-программиста» .
  5. ^ «B::C — серверная часть C компилятора Perl» .
  6. ^ «Acme::Perl::VM — виртуальная машина Perl5 в чистом Perl (APVM)» .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 85d40a9970563052d16d0105b254950d__1708151520
URL1:https://arc.ask3.ru/arc/aa/85/0d/85d40a9970563052d16d0105b254950d.html
Заголовок, (Title) документа по адресу, URL1:
Perl virtual machine - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)