Parrot — это прекращенная виртуальная машина процессов на основе регистров , разработанная для эффективного запуска динамических языков . Можно скомпилировать язык ассемблера Parrot и промежуточное представление Parrot (PIR, промежуточный язык) в байт-код Parrot и выполнить его. Parrot — это бесплатное программное обеспечение с открытым исходным кодом . [2]
Parrot был создан сообществом Perl и разработан с помощью сообществ открытого исходного кода и свободного программного обеспечения . В результате он был сосредоточен на лицензионной совместимости с Perl ( Artistic License 2.0 ), платформенной совместимости с широким спектром систем, совместимости архитектуры процессора с большинством современных процессоров, скорости выполнения, небольшом размере (около 700k в зависимости от платформы) и гибкости для обработки различных требований, предъявляемых 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 был распущен в 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 VM, были Raku (известный в то время как Rakudo Perl 6), Lua и новый язык под названием «Winxed». [12] Были начаты проекты по реализации многих других языков, включая PHP , Python и Ruby ; наряду с эзотерическими и демонстрационными языками, такими как Befunge и обучающий язык «squaak». [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 ' , ' print N1 print " \ n " end
В ПИР
. 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 print $I1 print ', ' print $N1 print "\n" . end
mod_parrot — это необязательный модуль для веб-сервера Apache . Он встраивает интерпретатор виртуальной машины Parrot в сервер Apache и обеспечивает доступ к API Apache, что позволяет писать обработчики на языке ассемблера Parrot или любом языке высокого уровня, ориентированном на Parrot.