Parrot — это снятая с производства виртуальная машина процессов на основе регистров, предназначенная для эффективной работы с динамическими языками . Можно скомпилировать ассемблерный язык Parrot и промежуточное представление Parrot (PIR, промежуточный язык) в байт-код Parrot и выполнить его. Parrot — бесплатное программное обеспечение с открытым исходным кодом . [2]
Parrot был создан сообществом Perl и разработан при помощи сообществ открытого и бесплатного программного обеспечения . В результате основное внимание уделялось совместимости лицензий с Perl ( Artistic License 2.0 ), совместимости платформ с широким спектром систем, совместимости архитектуры процессора с большинством современных процессоров, скорости выполнения, небольшому размеру (около 700 КБ в зависимости от платформы) и гибкость для удовлетворения различных требований, предъявляемых Raku и другими современными динамическими языками .
Версия 1.0 со стабильным интерфейсом прикладного программирования (API) для разработки была выпущена 17 марта 2009 года. [3] Последней версией является версия 8.1.0 «Andean Parakeet». [1] Официальное прекращение поддержки Parrot было прекращено в августе 2021 года после того, как его заменил MoarVM в его основном использовании (Raku), и он так и не стал основной виртуальной машиной ни для одного из других поддерживаемых языков. [4]
Название Parrot произошло от первоапрельской шутки, в которой было объявлено о создании гипотетического языка Parrot , который объединит Python и Perl . [5] [6] Позже это название было принято проектом Parrot (первоначально являвшимся частью разработки Raku), целью которого была поддержка Raku, Python и других языков программирования.
Фонд Parrot Foundation был распущен в 2014 году. [7] Фонд был создан в 2008 году для хранения авторских прав и товарных знаков проекта Parrot, чтобы помочь в разработке языковых реализаций и основной кодовой базы, чтобы обеспечить основу для роста сообщества Parrot. и обратиться к другим языковым сообществам. [8]
Исторические проектные решения документируются в форме проектных документов Parrot или PDD в репозитории Parrot. [9]
До конца 2005 года Дэн Сугальски был ведущим дизайнером и главным архитектором Parrot. Чип Зальценберг, давний хакер Perl, ядра Linux и C++, занял пост до середины 2006 года, когда он стал ведущим разработчиком. Эллисон Рэндал , ведущий разработчик Punie и главный архитектор инструментов компилятора Parrot, была главным архитектором до середины октября 2010 года, когда она ушла в отставку и выбрала Кристофа Отто новым главным архитектором. [10]
Целью виртуальной машины Parrot было размещение клиентских языков и обеспечение взаимодействия между ними. На пути достижения этой цели существует несколько препятствий, в частности, сложность сопоставления концепций высокого уровня, данных и структур данных между языками.
Различные свойства статически и динамически типизированных языков послужили причиной создания Parrot. Современные популярные виртуальные машины, такие как виртуальная машина Java и Common Language Runtime для платформы .NET , были разработаны для статически типизированных языков, в то время как языки, на которые ориентирован Parrot, являются динамически типизированными.
Виртуальные машины, такие как виртуальная машина Java и текущая виртуальная машина Perl 5, также основаны на стеке . Разработчики Parrot выбрали дизайн на основе регистров, мотивируя это тем, что он больше напоминает аппаратный дизайн, что позволяет использовать обширную литературу по оптимизации компилятора при генерации байт-кода для виртуальной машины Parrot , которая может работать на скоростях, близких к машинному коду . . Другие виртуальные машины на основе регистров вдохновили часть дизайна Parrot, включая LLVM , Lua VM и Dis от Inferno .
Parrot имеет богатую поддержку нескольких функций функционального программирования, включая замыкания и продолжения , обе из которых может быть особенно сложно реализовать правильно и переносимо, особенно в сочетании с обработкой исключений и многопоточностью . Самым большим преимуществом является динамическая расширяемость объектов с помощью методов, что позволяет использовать полиморфные контейнеры (PMC) и связанные с ними коды операций . Реализация решений этих проблем на уровне виртуальных машин устраняет необходимость решать эти проблемы на отдельных клиентских языках.
Parrot предоставляет набор инструментов для написания компиляторов [11] , который включает в себя Parser Grammar Engine (PGE), гибридный анализатор-генератор, который может выражать анализатор рекурсивного спуска, а также анализатор с приоритетом операторов , обеспечивая свободный переход между ними в единая грамматика. PGE передается в механизм Tree Grammar Engine (TGE), который дополнительно преобразует дерево синтаксического анализа, сгенерированное PGE, для оптимизации и, в конечном итоге, для генерации кода.
Наиболее полными языковыми реализациями, предназначенными для виртуальной машины Parrot, были Raku (известный в то время как Rakudo Perl 6), Lua и новый язык под названием «Winxed». [12] Были начаты проекты по реализации многих других языков, включая PHP , Python и Ruby ; наряду с эзотерическими и демонстрационными языками, такими как Befunge и обучающий язык «писк». [13] Ни один из этих проектов не стал первичным внедрением соответствующих языков. [4]
Существует три формы программного кода для Parrot:
Parrot основан на регистрах, как и большинство аппаратных процессоров , и в отличие от большинства виртуальных машин, которые основаны на стеке. Parrot предоставляет четыре типа регистров:
Parrot предоставляет произвольное количество регистров; это число фиксируется во время компиляции каждой подпрограммы.
В ПАСМ
set I1 , 4 inc I1 # I1 теперь 5 add I1 , 2 # I1 теперь 7 set N1 , 42 .0 dec N1 # N1 теперь 41.0 sub N1 , 2 .0 # N1 теперь 39.0 print I1 print ' , ' напечатайте N1 напечатайте "\ n " конец
В ПИР
. sub 'main' : main $I1 = 4 inc $I1 # $I1 теперь равен 5 $I1 += 2 # $I1 теперь равен 7 $N1 = 42.0 dec $N1 # $N1 теперь равен 41.0 $N1 -= 2.0 # $ N1 теперь 39.0 напечатайте $I1 напечатайте ',' напечатайте $N1 напечатайте "\n" . конец