Ця стаття не містить . (лютий 2020) |
Інтерпретатор мови програмування (interpreter) — програма чи технічні засоби, необхідні для виконання інших програм, вид транслятора, який здійснює пооператорну (покомандну, построкову) обробку, перетворення у машинний код та виконання програми або запиту (на відміну від компілятора, який транслює у машинні коди всю програму без її виконання).
Інтерпретатори можуть працювати як з початковим кодом програми (англ. source code), написаним мовою програмування, так і з байт-кодом ().
Типи інтерпретаторів
Простий інтерпретатор аналізує і відразу виконує (власне інтерпретація) програму покомандно (або порядково), по мірі надходження тексту програми на вхід інтерпретатора. Перевагою такого підходу є миттєва реакція. Недолік — такий інтерпретатор виявляє помилки в тексті програми тільки при спробі виконання команди (або рядка) з помилкою.
Інтерпретатор компілюючого типу — це система з компілятора, який перекладає текст програми в , наприклад, в байт-код або p-код, і власне інтерпретатора, який виконує отриманий проміжний код (так звана віртуальна машина). Перевагою таких систем є більша швидкодія виконання програм (за рахунок винесення аналізу початкового коду в окремий, разовий прохід, і мінімізації цього аналізу в інтерпретаторі). Недоліки — більші вимоги до ресурсів і вимога на коректність тексту програми. Застосовується в таких мовах, як Java, Tcl, Perl (використовується байт-код), REXX (зберігається результат синтаксичного аналізу), а також у різних СУБД (використовується p-код).
Інтерпретатор компілюючого типу складається з компілятора мови і простого інтерпретатора з мінімізованим аналізом початкового коду; цей код у такому випадку не обов'язково повинен мати — це може бути машинний код якоїсь наявної апаратної платформи. Наприклад, віртуальні машини типу QEMU, Bochs, VMware містять у собі інтерпретатори машинного коду процесорів сімейства x86.
Деякі інтерпретатори (наприклад, для мов Lisp, Scheme, Python, Basic та інших) можуть працювати в режимі діалогу або так званого циклу читання-обчислення-друку (англ. read-eval-print loop, REPL). У такому режимі інтерпретатор зчитує закінчену конструкцію мови (наприклад, s-expression у мові Lisp), виконує її, друкує результати, після чого переходить до очікування введення користувачем наступної конструкції.
Унікальною є мова Forth, яка здатна працювати як в режимі інтерпретації, так і компіляції вхідних даних, дозволяючи переключатись між цими режимами в довільний момент, як під час трансляції початкового коду, так і під час роботи програм.
Слід також зазначити, що режими інтерпретації можна знайти не тільки в програмному, а й апаратному забезпеченні. Так, багато мікропроцесорів інтерпретують машинний код за допомогою вбудованих мікропрограм, а процесори сімейства x86, починаючи з Pentium (наприклад, на архітектурі Intel P6), під час виконання машинного коду попередньо транслюють його у внутрішній формат (в послідовність мікрооперацій).
Порівняння інтерпретатора та компілятора
Програми, як правило, пишуть мовою високого рівня, яка повинна бути перетворена в машинний код для виконання центральним процесором. Це перетворення виконує компілятор або інтерпретатор.
Розробка програмного забезпечення
Під час розробки програмного забезпечення, програмісти роблять часті зміни у початковому коді. При використанні компіляторів, кожен раз після внесення змін у початковий код компілятор транслює змінені початкові файли і компонує всі файли бінарного коду разом, перш ніж програма може бути виконана. Чим більша програма, тим більшим є час очікування компілювання. З іншого боку, при використанні інтерпретатора, очікування набагато менше, бо інтерпретатору не треба транслювати всю програму, а просто потрібно транслювати код, що зараз виконується, на проміжне представлення (або не транслювати його взагалі), що вимагає набагато менше часу, щоб програма могла бути виконана.
Розповсюдження
Компілятор перетворює початковий код у бінарні інструкції для процесора певної архітектури, що робить його менш портативним. Такий переклад здійснюється тільки один раз в середовищі розробника, після чого той же бінарний файл можна розповсюдити на машини користувача, де він може бути виконаний без додаткового перекладу. Крос-компілятор може генерувати бінарний код для машини користувача, навіть якщо вона має інший процесор, ніж машина розробника, на якій відбувалась компіляція коду.
Програма, що інтерпретується, може поширюватися у вигляді початкового коду. Вона має бути трансльована на кожній машині, що займає більше часу, але робить розповсюдження програми незалежним від архітектури машини. Однак переносимість початкового коду, що інтерпретується, залежить від того, чи має цільова машина відповідний інтерпретатор. Якщо інтерпретатор треба розповсюджувати разом з початковим кодом, загальний процес встановлення програми ускладнюється, порівняно з постачанням одного виконуваного файлу. Те, що інтерпретований код легко читається і копіюється людьми, може представляти проблему з точки зору авторського права. Тим не менш, існують різноманітні системи шифрування і . Доставка проміжного коду, наприклад, байт-коду, має такий же ефект заплутування, але байт-код можна декодувати з допомогою декомпілятора або дизасемблера.
Ефективність
Основним недоліком інтерпретованих програм є те, що процес інтерпретації зазвичай набагато повільніший, ніж запуск скомпільованої програми. Різниця в швидкості може різнитися від незначної до достатньо відчутної: часто на порядок, а іноді й більше. Проте час інтерпретації програми може бути швидшим, ніж загальний час, необхідний для компіляції і запуску. Це особливо важливо, під час прототипування і тестування коду: цикл редагування-інтерпретація-налагодження часто може бути набагато коротший, ніж редагування-компіляція-запуск-налагодження.
Інтерпретація коду відбувається повільніше, ніж запуск скомпільованого коду, тому що інтерпретатор повинен аналізувати кожну інструкцію у програмі кожного разу, коли вона виконується, а потім виконувати потрібну дію, в той час як скомпільований код просто виконує фіксовані дії, визначені під час компіляції. Цей аналіз під час виконання відомий як «додаткові витрати інтерпретації». Доступ до змінних в інтерпретованих програм також повільніший, тому що операція зв'язування ідентифікаторів з місцями зберігання повторюється під час виконання, тоді як компілятором виконується один раз під час компіляції.
Існують різні компроміси між швидкістю розробки програмного забезпечення при використанні інтерпретатора і швидкістю виконання програми при використанні компілятора. Деякі системи (наприклад, Lisp) дозволяють інтерпретованому і скомпільованому коду викликати один одного і обмінюватися змінними. Це означає, що поточний код, який був протестований і налагоджений інтерпретатором, може бути скомпільований, і таким чином отримати більшу швидкість виконання, в той час як інший код розробляється. Багато інтерпретаторів не виконують оператори програми безпосередньо, а приводять його до більш компактної внутрішньої форми. Багато інтерпретаторів мови BASIC замінюють зарезервовані слова одним байтом токена, який може бути використаний для пошуку команди в .
Проміжний код
Зазвичай початковий код мови програмування високого рівня компілюється у проміжну мову, яка буде скомпільована або інтерпретована у машинний код.
Проміжний код для Java
Початковий код на Java компілюється в проміжний код, який буде інтерпретовано.
Початковий код | Проміжний код | Інтерпретатор |
Проміжною мовою для Java є байт-код, інтерпретатор — Java Virtual Machine (JVM). Файл байт-коду є універсальним, тоді як інтерпретатор є унікальним для кожної платформи.
|
|
|
Приклад коду
Розглянемо наступний приклад на мові Java.
outer: for (int i = 2; i < 1000; i++) { for (int j = 2; j < i; j++) { if (i % j == 0) continue outer; } System.out.println (i); }
Компілятор Java може транслювати цей код в наступний байт-код:
0: iconst_2 1: istore_1 2: iload_1 3: sipush 1000 6: if_icmpge 44 9: iconst_2 10: istore_2 11: iload_2 12: iload_1 13: if_icmpge 31 16: iload_1 17: iload_2 18: irem 19: ifne 25 22: goto 38 25: iinc 2, 1 28: goto 11 31: getstatic #84; //Field java/lang/System.out:Ljava/io/PrintStream; 34: iload_1 35: invokevirtual #85; //Method java/io/PrintStream.println:(I)V 38: iinc 1, 1 41: goto 2 44: return
Проміжний код для мов .NET Framework
Мови, сумісні з платформою .NET Framework, такі як Visual Basic, C#, Visual F#, VB.NET, J#, компілюються в Common Intermediate Language (CIL) — проміжну мову для платформи .NET Framework. Отриманий проміжний код інтерпретується Common Language Runtime (CLR) — загальномовним середовищем виконання. Специфікація CIL та CLR є реалізацією специфікації (CLI) — специфікації загальномовної інфраструктури компанії Microsoft.
Код на CIL генерують всі компілятори для платформи .NET Framework. Мова CIL по структурі та мнемоніці нагадує мову асемблер. Проте CIL містить деякі високорівневі конструкції, і писати на CIL значно легше, ніж на асемблері.
Приклад коду
Приклад програми на C#:
static void Main(string[] args) { outer: for (int i = 2; i < 1000; i++) { for (int j = 2; j < i; j++) { if (i % j == 0) goto outer; } Console.WriteLine(i); } }
Вигляд цієї ж програми на CIL:
.method private hidebysig static void Main(string[] args) cil managed { .entrypoint .maxstack 2 .locals init ([0] int32 i, [1] int32 j) IL_0000: ldc.i4.2 stloc.0 br.s IL_001f IL_0004: ldc.i4.2 stloc.1 br.s IL_0011 IL_0008: ldloc.0 ldloc.1 rem brfalse.s IL_0000 ldloc.1 ldc.i4.1 add stloc.1 IL_0011: ldloc.1 ldloc.0 blt.s IL_0008 ldloc.0 call void [mscorlib]System.Console::WriteLine(int32) ldloc.0 ldc.i4.1 add stloc.0 IL_001f: ldloc.0 ldc.i4 0x3e8 blt.s IL_0004 ret }
Parrot
Parrot VM — це віртуальна машина, призначена для ефективної компіляції та виконання байт-коду для динамічних мов. В Parrot на даний момент реалізована підтримка багатьох мов, серед яких Tcl, Javascript, Ruby, Lua, Scheme, PHP, Python, Perl 6, APL і .NET транслятор байт-коду.
Віртуальна машина Parrot аналогічна віртуальним машинам Java і .NET платформи. Проте, на відміну від вказаних двох, які розроблені для статично типізованих мов як Java чи C#, Parrot розроблено для динамічно типізованих мов програмування.
Віртуальна машина Parrot написана на мові C. Саме тому, що Parrot призначена для підтримки різноманітних мов високого рівня, її архітектура доволі загальна та багатофункціональна.
Основні компоненти Parrot
Парсери PASM і PIR
Для компілювання початкового коду у PIR(Parrot Intermediate Representation) — проміжне представлення Parrot — доступно два парсери. IMCC використовується зараз, але є неефективним. PIRC є ефективнішим, але поки що нестабільний. Планується зробити PIRC основним парсером для PIR до виходу версії Parrot 1.0.
Компілятор байт-коду та оптимізатор
Компілятор байт-коду — складова Parrot, що відповідає за перетворення вхідних коду на PASM або PIR у байт-код Parrot. Цей байт-код виконується швидко і ефективно.
Іншим компонентом Parrot є оптимізатор байт-коду, який відповідає за низькорівневі оптимізації байт-коду Parrot.
Ітерпретатор
Тоді як компілятор байт-коду приймає вхідний код після обробки парсерами PIRC або IMCC і перетворює його в байт-код для зберігання і подальшого виконання, функцією інтерпретатора є безпосереднє виконання отриманого PIR та PASM коду. Це означає, що немає ніякого проміжного етапу компіляції, і скрипт можна виконати швидко, без необхідності компіляції.
Приклад коду
PIR
Приклад циклу:
.sub loopy .local int counter counter = 0 LOOP: if counter > 10 goto DONE print counter print " " inc counter goto LOOP DONE: print "counter\n" end .end
PASM
Приклад циклу:
set I1, 1 REDO: gt I1, 10, END print I1 print " " inc I1 branch REDO END: print "\n" end
Результат
0 1 2 3 4 5 6 7 8 9 10
Див. також
Джерела
- Jeff Fox. Chapter 2. More Interpretation. Thoughtful Programming and Forth (англ.). UltraTechnology. Архів оригіналу за 22 серпня 2011. Процитовано 12 травня 2013.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno lyutij 2020 Interpretator movi programuvannya interpreter programa chi tehnichni zasobi neobhidni dlya vikonannya inshih program vid translyatora yakij zdijsnyuye pooperatornu pokomandnu postrokovu obrobku peretvorennya u mashinnij kod ta vikonannya programi abo zapitu na vidminu vid kompilyatora yakij translyuye u mashinni kodi vsyu programu bez yiyi vikonannya Interpretatori mozhut pracyuvati yak z pochatkovim kodom programi angl source code napisanim movoyu programuvannya tak i z bajt kodom Tipi interpretatorivProstij interpretator analizuye i vidrazu vikonuye vlasne interpretaciya programu pokomandno abo poryadkovo po miri nadhodzhennya tekstu programi na vhid interpretatora Perevagoyu takogo pidhodu ye mittyeva reakciya Nedolik takij interpretator viyavlyaye pomilki v teksti programi tilki pri sprobi vikonannya komandi abo ryadka z pomilkoyu Interpretator kompilyuyuchogo tipu ce sistema z kompilyatora yakij perekladaye tekst programi v napriklad v bajt kod abo p kod i vlasne interpretatora yakij vikonuye otrimanij promizhnij kod tak zvana virtualna mashina Perevagoyu takih sistem ye bilsha shvidkodiya vikonannya program za rahunok vinesennya analizu pochatkovogo kodu v okremij razovij prohid i minimizaciyi cogo analizu v interpretatori Nedoliki bilshi vimogi do resursiv i vimoga na korektnist tekstu programi Zastosovuyetsya v takih movah yak Java Tcl Perl vikoristovuyetsya bajt kod REXX zberigayetsya rezultat sintaksichnogo analizu a takozh u riznih SUBD vikoristovuyetsya p kod Interpretator kompilyuyuchogo tipu skladayetsya z kompilyatora movi i prostogo interpretatora z minimizovanim analizom pochatkovogo kodu cej kod u takomu vipadku ne obov yazkovo povinen mati ce mozhe buti mashinnij kod yakoyis nayavnoyi aparatnoyi platformi Napriklad virtualni mashini tipu QEMU Bochs VMware mistyat u sobi interpretatori mashinnogo kodu procesoriv simejstva x86 Deyaki interpretatori napriklad dlya mov Lisp Scheme Python Basic ta inshih mozhut pracyuvati v rezhimi dialogu abo tak zvanogo ciklu chitannya obchislennya druku angl read eval print loop REPL U takomu rezhimi interpretator zchituye zakinchenu konstrukciyu movi napriklad s expression u movi Lisp vikonuye yiyi drukuye rezultati pislya chogo perehodit do ochikuvannya vvedennya koristuvachem nastupnoyi konstrukciyi Unikalnoyu ye mova Forth yaka zdatna pracyuvati yak v rezhimi interpretaciyi tak i kompilyaciyi vhidnih danih dozvolyayuchi pereklyuchatis mizh cimi rezhimami v dovilnij moment yak pid chas translyaciyi pochatkovogo kodu tak i pid chas roboti program Slid takozh zaznachiti sho rezhimi interpretaciyi mozhna znajti ne tilki v programnomu a j aparatnomu zabezpechenni Tak bagato mikroprocesoriv interpretuyut mashinnij kod za dopomogoyu vbudovanih mikroprogram a procesori simejstva x86 pochinayuchi z Pentium napriklad na arhitekturi Intel P6 pid chas vikonannya mashinnogo kodu poperedno translyuyut jogo u vnutrishnij format v poslidovnist mikrooperacij Porivnyannya interpretatora ta kompilyatoraProgrami yak pravilo pishut movoyu visokogo rivnya yaka povinna buti peretvorena v mashinnij kod dlya vikonannya centralnim procesorom Ce peretvorennya vikonuye kompilyator abo interpretator Rozrobka programnogo zabezpechennya Pid chas rozrobki programnogo zabezpechennya programisti roblyat chasti zmini u pochatkovomu kodi Pri vikoristanni kompilyatoriv kozhen raz pislya vnesennya zmin u pochatkovij kod kompilyator translyuye zmineni pochatkovi fajli i komponuye vsi fajli binarnogo kodu razom persh nizh programa mozhe buti vikonana Chim bilsha programa tim bilshim ye chas ochikuvannya kompilyuvannya Z inshogo boku pri vikoristanni interpretatora ochikuvannya nabagato menshe bo interpretatoru ne treba translyuvati vsyu programu a prosto potribno translyuvati kod sho zaraz vikonuyetsya na promizhne predstavlennya abo ne translyuvati jogo vzagali sho vimagaye nabagato menshe chasu shob programa mogla buti vikonana Rozpovsyudzhennya Kompilyator peretvoryuye pochatkovij kod u binarni instrukciyi dlya procesora pevnoyi arhitekturi sho robit jogo mensh portativnim Takij pereklad zdijsnyuyetsya tilki odin raz v seredovishi rozrobnika pislya chogo toj zhe binarnij fajl mozhna rozpovsyuditi na mashini koristuvacha de vin mozhe buti vikonanij bez dodatkovogo perekladu Kros kompilyator mozhe generuvati binarnij kod dlya mashini koristuvacha navit yaksho vona maye inshij procesor nizh mashina rozrobnika na yakij vidbuvalas kompilyaciya kodu Programa sho interpretuyetsya mozhe poshiryuvatisya u viglyadi pochatkovogo kodu Vona maye buti translovana na kozhnij mashini sho zajmaye bilshe chasu ale robit rozpovsyudzhennya programi nezalezhnim vid arhitekturi mashini Odnak perenosimist pochatkovogo kodu sho interpretuyetsya zalezhit vid togo chi maye cilova mashina vidpovidnij interpretator Yaksho interpretator treba rozpovsyudzhuvati razom z pochatkovim kodom zagalnij proces vstanovlennya programi uskladnyuyetsya porivnyano z postachannyam odnogo vikonuvanogo fajlu Te sho interpretovanij kod legko chitayetsya i kopiyuyetsya lyudmi mozhe predstavlyati problemu z tochki zoru avtorskogo prava Tim ne mensh isnuyut riznomanitni sistemi shifruvannya i Dostavka promizhnogo kodu napriklad bajt kodu maye takij zhe efekt zaplutuvannya ale bajt kod mozhna dekoduvati z dopomogoyu dekompilyatora abo dizasemblera Efektivnist Osnovnim nedolikom interpretovanih program ye te sho proces interpretaciyi zazvichaj nabagato povilnishij nizh zapusk skompilovanoyi programi Riznicya v shvidkosti mozhe riznitisya vid neznachnoyi do dostatno vidchutnoyi chasto na poryadok a inodi j bilshe Prote chas interpretaciyi programi mozhe buti shvidshim nizh zagalnij chas neobhidnij dlya kompilyaciyi i zapusku Ce osoblivo vazhlivo pid chas prototipuvannya i testuvannya kodu cikl redaguvannya interpretaciya nalagodzhennya chasto mozhe buti nabagato korotshij nizh redaguvannya kompilyaciya zapusk nalagodzhennya Interpretaciya kodu vidbuvayetsya povilnishe nizh zapusk skompilovanogo kodu tomu sho interpretator povinen analizuvati kozhnu instrukciyu u programi kozhnogo razu koli vona vikonuyetsya a potim vikonuvati potribnu diyu v toj chas yak skompilovanij kod prosto vikonuye fiksovani diyi viznacheni pid chas kompilyaciyi Cej analiz pid chas vikonannya vidomij yak dodatkovi vitrati interpretaciyi Dostup do zminnih v interpretovanih program takozh povilnishij tomu sho operaciya zv yazuvannya identifikatoriv z miscyami zberigannya povtoryuyetsya pid chas vikonannya todi yak kompilyatorom vikonuyetsya odin raz pid chas kompilyaciyi Isnuyut rizni kompromisi mizh shvidkistyu rozrobki programnogo zabezpechennya pri vikoristanni interpretatora i shvidkistyu vikonannya programi pri vikoristanni kompilyatora Deyaki sistemi napriklad Lisp dozvolyayut interpretovanomu i skompilovanomu kodu viklikati odin odnogo i obminyuvatisya zminnimi Ce oznachaye sho potochnij kod yakij buv protestovanij i nalagodzhenij interpretatorom mozhe buti skompilovanij i takim chinom otrimati bilshu shvidkist vikonannya v toj chas yak inshij kod rozroblyayetsya Bagato interpretatoriv ne vikonuyut operatori programi bezposeredno a privodyat jogo do bilsh kompaktnoyi vnutrishnoyi formi Bagato interpretatoriv movi BASIC zaminyuyut zarezervovani slova odnim bajtom tokena yakij mozhe buti vikoristanij dlya poshuku komandi v Promizhnij kodZazvichaj pochatkovij kod movi programuvannya visokogo rivnya kompilyuyetsya u promizhnu movu yaka bude skompilovana abo interpretovana u mashinnij kod Promizhnij kod dlya Java Pochatkovij kod na Java kompilyuyetsya v promizhnij kod yakij bude interpretovano Pochatkovij kod Promizhnij kod Interpretator Promizhnoyu movoyu dlya Java ye bajt kod interpretator Java Virtual Machine JVM Fajl bajt kodu ye universalnim todi yak interpretator ye unikalnim dlya kozhnoyi platformi Priklad kodu Rozglyanemo nastupnij priklad na movi Java outer for int i 2 i lt 1000 i for int j 2 j lt i j if i j 0 continue outer System out println i Kompilyator Java mozhe translyuvati cej kod v nastupnij bajt kod 0 iconst 2 1 istore 1 2 iload 1 3 sipush 1000 6 if icmpge 44 9 iconst 2 10 istore 2 11 iload 2 12 iload 1 13 if icmpge 31 16 iload 1 17 iload 2 18 irem 19 ifne 25 22 goto 38 25 iinc 2 1 28 goto 11 31 getstatic 84 Field java lang System out Ljava io PrintStream 34 iload 1 35 invokevirtual 85 Method java io PrintStream println I V 38 iinc 1 1 41 goto 2 44 return Promizhnij kod dlya mov NET Framework Proces kompilyaciyi program dlya mov NET Framework v CIL ta interpretaciyi za dopomogoyu CLR Movi sumisni z platformoyu NET Framework taki yak Visual Basic C Visual F VB NET J kompilyuyutsya v Common Intermediate Language CIL promizhnu movu dlya platformi NET Framework Otrimanij promizhnij kod interpretuyetsya Common Language Runtime CLR zagalnomovnim seredovishem vikonannya Specifikaciya CIL ta CLR ye realizaciyeyu specifikaciyi CLI specifikaciyi zagalnomovnoyi infrastrukturi kompaniyi Microsoft Kod na CIL generuyut vsi kompilyatori dlya platformi NET Framework Mova CIL po strukturi ta mnemonici nagaduye movu asembler Prote CIL mistit deyaki visokorivnevi konstrukciyi i pisati na CIL znachno legshe nizh na asembleri Priklad kodu Priklad programi na C static void Main string args outer for int i 2 i lt 1000 i for int j 2 j lt i j if i j 0 goto outer Console WriteLine i Viglyad ciyeyi zh programi na CIL method private hidebysig static void Main string args cil managed entrypoint maxstack 2 locals init 0 int32 i 1 int32 j IL 0000 ldc i4 2 stloc 0 br s IL 001f IL 0004 ldc i4 2 stloc 1 br s IL 0011 IL 0008 ldloc 0 ldloc 1 rem brfalse s IL 0000 ldloc 1 ldc i4 1 add stloc 1 IL 0011 ldloc 1 ldloc 0 blt s IL 0008 ldloc 0 call void mscorlib System Console WriteLine int32 ldloc 0 ldc i4 1 add stloc 0 IL 001f ldloc 0 ldc i4 0x3e8 blt s IL 0004 ret Parrot Parrot VM ce virtualna mashina priznachena dlya efektivnoyi kompilyaciyi ta vikonannya bajt kodu dlya dinamichnih mov V Parrot na danij moment realizovana pidtrimka bagatoh mov sered yakih Tcl Javascript Ruby Lua Scheme PHP Python Perl 6 APL i NET translyator bajt kodu Virtualna mashina Parrot analogichna virtualnim mashinam Java i NET platformi Prote na vidminu vid vkazanih dvoh yaki rozrobleni dlya statichno tipizovanih mov yak Java chi C Parrot rozrobleno dlya dinamichno tipizovanih mov programuvannya Virtualna mashina Parrot napisana na movi C Same tomu sho Parrot priznachena dlya pidtrimki riznomanitnih mov visokogo rivnya yiyi arhitektura dovoli zagalna ta bagatofunkcionalna Osnovni komponenti Parrot Parseri PASM i PIR Dlya kompilyuvannya pochatkovogo kodu u PIR Parrot Intermediate Representation promizhne predstavlennya Parrot dostupno dva parseri IMCC vikoristovuyetsya zaraz ale ye neefektivnim PIRC ye efektivnishim ale poki sho nestabilnij Planuyetsya zrobiti PIRC osnovnim parserom dlya PIR do vihodu versiyi Parrot 1 0 Kompilyator bajt kodu ta optimizator Kompilyator bajt kodu skladova Parrot sho vidpovidaye za peretvorennya vhidnih kodu na PASM abo PIR u bajt kod Parrot Cej bajt kod vikonuyetsya shvidko i efektivno Inshim komponentom Parrot ye optimizator bajt kodu yakij vidpovidaye za nizkorivnevi optimizaciyi bajt kodu Parrot Iterpretator Todi yak kompilyator bajt kodu prijmaye vhidnij kod pislya obrobki parserami PIRC abo IMCC i peretvoryuye jogo v bajt kod dlya zberigannya i podalshogo vikonannya funkciyeyu interpretatora ye bezposerednye vikonannya otrimanogo PIR ta PASM kodu Ce oznachaye sho nemaye niyakogo promizhnogo etapu kompilyaciyi i skript mozhna vikonati shvidko bez neobhidnosti kompilyaciyi Priklad kodu PIR Priklad ciklu sub loopy local int counter counter 0 LOOP if counter gt 10 goto DONE print counter print inc counter goto LOOP DONE print counter n end end PASM Priklad ciklu set I1 1 REDO gt I1 10 END print I1 print inc I1 branch REDO END print n end Rezultat 0 1 2 3 4 5 6 7 8 9 10Div takozhKompilyatorDzherelaJeff Fox Chapter 2 More Interpretation Thoughtful Programming and Forth angl UltraTechnology Arhiv originalu za 22 serpnya 2011 Procitovano 12 travnya 2013