Введение

Parrot – это виртуальная машина, основанная на регистровой модели, предназначенная для эффективного выполнения динамических языков программирования. Возможно компилировать ассемблер Parrot и промежуточное представление Parrot (PIR) в байт-код Parrot и запускать его. Parrot – это свободное программное обеспечение с открытым исходным кодом. Parrot был начат сообществом Perl и разрабатывался при поддержке сообществ открытого исходного кода и свободного программного обеспечения. В результате основное внимание уделялось совместимости лицензий с Perl (Artistic License 2.0), платформенной совместимости с широким спектром систем, совместимости архитектур процессоров с большинством современных процессоров, скорости выполнения, небольшому размеру (около 700 КБ в зависимости от платформы) и гибкости для обработки различных требований Raku и других современных динамических языков. Версия 1.0, с стабильным интерфейсом прикладного программирования (API) для разработки, была выпущена 17 марта 2009 года. Последняя версия – выпуск 8.1.0 "Андийский волнистый попугайчик".

История

Название Parrot возникло из шутки на 1 апреля, объявившей о гипотетическом языке Parrot, который должен был объединить Python и Perl. Позже это название было принято проектом Parrot (первоначально частью разработки Raku), целью которого являлась поддержка Raku, Python и других языков программирования. Фонд Parrot был распущен в 2014 году. Фонд был создан в 2008 году для владения авторскими правами и товарными знаками проекта Parrot, для стимулирования разработки языковых реализаций и основной кодовой базы, для создания основы для развития сообщества Parrot и для взаимодействия с другими языковыми сообществами. Исторические решения по проектированию задокументированы в виде документов по проектированию Parrot, или PDD, в репозитории Parrot. До конца 2005 года Дэном Сугальски был ведущий разработчик и главный архитектор Parrot. Чип Салценберг, опытный программист Perl, ядра Linux и C++, возглавил проект до середины 2006 года, когда стал ведущим разработчиком. Эллисон Рэндал, ведущий разработчик Punie и главный архитектор компиляторных инструментов Parrot, была главным архитектором до середины октября 2010 года, когда она ушла в отставку и назначила Кристофа Отто новым главным архитектором.

Языки

Целью виртуальной машины Parrot было обеспечение поддержки клиентских языков и обеспечение их взаимодействия. Для достижения этой цели существует ряд препятствий, в особенности сложность сопоставления высокоуровневых концепций, данных и структур данных между различными языками.

Статические и динамические языки

Различные свойства статически и динамически типизированных языков послужили мотивацией для разработки Parrot. Современные популярные виртуальные машины, такие как виртуальная машина Java и Common Language Runtime для платформы .NET, были разработаны для языков со статической типизацией, в то время как языки, для которых предназначен Parrot, используют динамическую типизацию. Виртуальные машины, такие как виртуальная машина Java и текущая виртуальная машина Perl 5, также построены на стековой архитектуре. Разработчики Parrot выбрали архитектуру, основанную на регистрах, полагая, что она больше соответствует аппаратной архитектуре, что позволяет использовать обширную литературу по оптимизации компиляторов при генерации байт-кода для виртуальной машины Parrot, способного работать на скорости, приближенной к скорости машинного кода. Другие виртуальные машины, использующие регистровую архитектуру, вдохновили некоторые аспекты дизайна Parrot, включая LLVM, Lua VM и Dis от Inferno.

Функциональные понятия

Parrot обладает развитой поддержкой различных возможностей функционального программирования, включая замыкания и продолжения, оба из которых могут быть особенно сложны в правильной и переносимой реализации, особенно в сочетании с обработкой исключений и многопоточностью. Главное преимущество – динамическая расширяемость объектов методами, что позволяет создавать полиморфные контейнеры (PMC) и соответствующие им опкоды. Реализация решений этих проблем на уровне виртуальной машины избавляет от необходимости решать их в каждом отдельном языке программирования.

Инструменты компилятора

Parrot предоставляет набор инструментов для разработки компиляторов, включающий в себя Parser Grammar Engine (PGE) – гибридный генератор парсеров, способный реализовывать как рекурсивный спуск, так и парсер с приоритетом операторов, обеспечивая свободный переход между этими подходами в рамках одной грамматики. PGE передает данные в Tree Grammar Engine (TGE), который дополнительно преобразует синтаксическое дерево, созданное PGE, для оптимизации и последующей генерации кода.

Реализация

Наиболее полными языковыми реализациями, ориентированными на Parrot VM, были Raku (известный в то время как Rakudo Perl 6), Lua и новый язык под названием "Winxed". Были начаты проекты по реализации многих других языков, включая PHP, Python и Ruby, а также эзотерических и демонстрационных языков, таких как Befunge и учебный язык "squaak". Ни один из этих проектов не достиг успеха в качестве основной реализации для соответствующих языков. Parrot работает с двоичным кодом и интерпретирует его напрямую. Байт-код обычно хранится в файлах с расширением ".pbc". Язык ассемблера Parrot (PASM) – это язык низкого уровня, который компилируется в байт-код. Код PASM обычно хранится в файлах с расширением ".pasm". Промежуточное представление Parrot (PIR) – это язык немного более высокого уровня, чем PASM, который также компилируется в байт-код. Он является основной целью для языковых реализаций. PIR прозрачно управляет соглашениями о вызовах подпрограмм Parrot, обеспечивает улучшенный синтаксис, распределение регистров и многое другое. Код PIR обычно хранится в файлах с расширением ".pir".