Перл виртуальная машина
— Виртуальная машина 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::.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «B::Deparse — серверная часть компилятора Perl для создания кода Perl» .
- ^ Jump up to: а б «B — Серверная часть компилятора Perl» .
- ^ «B::Concision — просмотр синтаксического дерева Perl, вывод краткой информации об операциях» .
- ^ «Devel::Peek — инструмент отладки данных для XS-программиста» .
- ^ «B::C — серверная часть C компилятора Perl» .
- ^ «Acme::Perl::VM — виртуальная машина Perl5 в чистом Perl (APVM)» .