Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Реализация [ править ]

Коды операций [ править ]

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

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

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

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

$ perl -MO = Concise, -exec -E 'say «Hello, world!»' 1 <0> введите 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 .

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

Лексические переменные хранятся в padlist .

Структуры данных [ править ]

Структуры данных виртуальных машин Perl внутренне представлены определениями типов .

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

типы данных [ править ]

Perl имеет три typedef, которые обрабатывают три основных типа данных Perl: скалярное значение ( SV ), значение массива ( AV ), значение хэша ( HV ). Perl использует специальный typedef для простого целочисленного типа со знаком ( 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 ).

padlist [ править ]

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

Стеки [ править ]

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

Стек аргументов [ править ]

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

Отметить стек [ править ]

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

Сохранить стек [ править ]

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

Стек областей видимости [ править ]

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

Другие реализации [ править ]

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

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

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

См. Также [ править ]

  • Сравнение виртуальных машин приложений

Ссылки [ править ]

  1. ^ "B :: Deparse - Бэкэнд компилятора Perl для создания кода Perl" .
  2. ^ a b "B - Бэкэнд компилятора Perl" .
  3. ^ «B :: Concise - Обход синтаксического дерева Perl, печать краткой информации о операциях» .
  4. ^ "Devel :: Peek - Инструмент отладки данных для программиста XS" .
  5. ^ "B :: C - Бэкэнд C компилятора Perl" .
  6. ^ «Acme :: Perl :: VM - виртуальная машина Perl5 на чистом Perl (APVM)» .

Внешние ссылки [ править ]

  • Внутреннее устройство Perl: рабочий этап
  • Введение в Perl API
  • Дерево операций "B".