Parrot (віртуальна машина)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
Віртуальна машина Parrot
Тип Віртуальна машина
Розробник The Perl Foundationd
Останнє оновлення 8.1.0 / Лютий 16, 2016;
Операційна система кросплатформова програма
Мова програмування C
Ліцензія Artistic License 2.0
Репозиторій https://github.com/parrot/parrot
Вебсайт parrot.org

Parrot (перрот або паррот; від англ. parrot — папуга) — віртуальна машина, що використовується інтерпретованими мовами для ефективного виконання байт-коду. Parrot є вільним програмним забезпеченням з відкритим вихідним кодом.[1]

Parrot планувалося зробити основою інтерпретатора Perl, а також цільовою платформою для компіляції коду Perl 6. Крім реалізованої частини Perl 6, у байткод можна скомпілювати програми іншими мовами, включно з APL, BASIC, Befunge, Brainfuck, Cola, Forth, Jako, Lisp,m4, Miniperl, Ook!, Parakeet, OpenComal, PHP, Plot, Pheme, Punie, Python, Ruby, Scheme, [[Span[en]]], Tcl, URM та YAL, але більша частина реалізацій цих мов для Parrot неповна і перебуває в експериментальному стані.

Версія 1.0 зі стабільним інтерфейсом прикладного програмування (API) для розробки була випущена 17 березня 2009 року[2]. Остання версія — випуск 8.1.0 «Andean Parakeet»[3]. У 2014 році, у зв'язку з проблемами розвитку Parrot, як альтернативну реалізацію віртуальної машини для Perl 6 було випущено MoarVM. Parrot офіційно припинив своє існування у серпні 2021 року, після того, як був витіснений MoarVM у своєму основному використанні (Raku) і так і не став основною віртуальною машиною для жодної з інших підтримуваних ним мов.[4]

Історія[ред. | ред. код]

Назва Parrot походить від першоквітневого жарту, в якому було оголошено про гіпотетичну мову, названу Parrot, яка об'єднала б Python та Perl.[5][6] Пізніше ця назва була перейнята проєктом Parrot (спочатку частиною зусиль з розробки Raku), метою якого була підтримка Raku, Python та інших мов програмування.

Фонд Parrot Foundation був розпущений у 2014 р.[7] Фонд був створений у 2008 р. з метою збереження авторських прав та торгових марок проєкту Parrot, сприяння розвитку мовних реалізацій та основної кодової бази, забезпечення бази для зростання спільноти Parrot та налагодження зв'язків з іншими мовними спільнотами.

Історичні проєктні рішення задокументовані у вигляді проєктних документів Parrot, або PDD, у репозиторії Parrot.[8]

До кінця 2005 року провідним дизайнером і головним архітектором Parrot був Ден Сугальскі. Чіп Зальценберг, давній хакер Perl, ядра Linux і C++, зайняв цю посаду до середини 2006 року, коли він став провідним розробником. Елісон Рендал, провідний розробник Punie і головний архітектор інструментів компілятора Parrot, була головним архітектором до середини жовтня 2010 року, коли вона пішла у відставку і обрала Крістофа Отто новим головним архітектором.[9]

Мови[ред. | ред. код]

Метою віртуальної машини Parrot було розміщення клієнтських мов і забезпечення взаємодії між ними. На шляху до досягнення цієї мети існувало кілька перешкод, зокрема складність відображення високорівневих концепцій, даних і структур даних між мовами.

Статичні та динамічні мови[ред. | ред. код]

Різні властивості статично та динамічно типізованих мов мотивували розробку Parrot. Популярні віртуальні машини, такі як віртуальна машина Java та Common Language Runtime для платформи .NET, були розроблені для статично типізованих мов, в той час, як мови, на які орієнтований Parrot, є динамічно типізованими.

Віртуальні машини, такі як віртуальна машина Java та поточна віртуальна машина Perl 5, також базуються на стеку. Розробники Parrot обрали регістрову структуру, мотивуючи це тим, що вона більше нагадує апаратну структуру, що дозволяє використовувати величезну літературу з оптимізації компіляторів для створення байт-коду для віртуальної машини Parrot, який може працювати зі швидкістю, наближеною до машинного коду[джерело не вказано]. Інші реєстрові віртуальні машини надихнули на створення Parrot, зокрема LLVM, Lua VM та Inferno's Dis.

Функціональні концепції[ред. | ред. код]

Parrot має багату підтримку декількох функцій функціонального програмування, включаючи закриття та продовження, обидві з яких можуть бути особливо складними для правильної та портативної реалізації, особливо у поєднанні з обробкою винятків та багатопотоковістю. Найбільшою перевагою є динамічна розширюваність об'єктів з методами, що дозволяє використовувати поліморфні контейнери (PMC) та пов'язані з ними опкоди. Реалізація розв'язання цих проблем на рівні віртуальної машини позбавляє від необхідності розв'язувати ці проблеми в окремих клієнтських мовах.

Інструменти компілятора[ред. | ред. код]

Parrot надає набір інструментів для написання компіляторів, який включає Parser Grammar Engine (PGE), гібридний синтаксичний аналізатор-генератор, який може виражати як синтаксичний аналізатор рекурсивного спуску, так і синтаксичний аналізатор операторного передування, дозволяючи вільний перехід між ними в одній граматиці. PGE подає дані до деревовидного граматичного рушія (TGE), який далі трансформує дерево розбору, згенероване PGE, для оптимізації і, зрештою, для генерації коду.

Реалізації[ред. | ред. код]

Найповнішими мовними реалізаціями, орієнтованими на Parrot VM, були Raku (відома на той час як Rakudo Perl 6), Lua та нова мова під назвою «Winxed».[10] Було розпочато проєкти з реалізації багатьох інших мов, зокрема PHP, Python та Ruby, а також езотеричних та демонстраційних мов, таких як Befunge та навчальна мова «squaak». Жодному з цих проєктів не вдалося стати основною реалізацією відповідних

Приклади[ред. | ред. код]

Регістри[ред. | ред. код]

Parrot базується на регістрах, як більшість апаратних ЦП, і відрізняється від більшості віртуальних машин, які базуються на стеку.

Parrot надає чотири типи регістрів: I: цілочисельний тип

N: числа з рухомою комою

S: розширені рядкові регістри з підтримкою Unicode

P: PMC, або поліморфний контейнер — тип об'єкта Parrot

Parrot надає довільну кількість регістрів; це число фіксується на етапі компіляції для кожної підпрограми.

Арифметичні операції

В PASM

    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

В PIR

 .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

Також дивитись[ред. | ред. код]

Примітки[ред. | ред. код]

  1. Wayback Machine (PDF). web.archive.org. Архів оригіналу (PDF) за 16 серпня 2010. Процитовано 9 грудня 2023.
  2. {14} Roadmap Report by Milestone – Parrot. web.archive.org. 15 квітня 2010. Процитовано 9 грудня 2023.
  3. New supported release 8.1.0 "Andean Parakeet" | Parrot VM. www.parrot.org. Процитовано 9 грудня 2023.
  4. Inactive Parrot | Parrot VM. www.parrot.org. Процитовано 9 грудня 2023.
  5. O'Reilly Media - Technology and Business Training. www.oreilly.com (англ.). Процитовано 9 грудня 2023.
  6. perl.com: Programming Parrot. web.archive.org. 18 липня 2010. Архів оригіналу за 18 липня 2010. Процитовано 9 грудня 2023.
  7. Corporations and Charities System. ccfs.sos.wa.gov. Процитовано 9 грудня 2023.
  8. Parrot 8.1.0-devel - Parrot Design Documents (PDDs). docs.parrot.org. Процитовано 9 грудня 2023.
  9. Otto, Christoph (21 жовтня 2010). reparrot: Parrot has a new architect. What now?. reparrot. Процитовано 9 грудня 2023.
  10. Languages | Parrot VM. www.parrot.org. Процитовано 9 грудня 2023.

Посилання[ред. | ред. код]