| Կոմպիլյատորի կառուցումը  |
| --- |
| 
Ընդհանուր թեմաներ |
| * Լեքսիկական վերլուծություն
* Շարահյուսական վերլուծություն
* Ծրագրի կատարում
* Կապերի խմբագրիչ
* Դինամիկ կապերի խմբագրիչ
* Ծրագրի բեռնիչ
* Տրանսլյատոր
* Կոմպիլյատոր
* Դեկոմպիլյատոր
* Կրոսս կոմպիլյատոր
* Դինամիկ կոմպիլյացիա
* JIT-կոմպիլյացիա
* AOT-կոմպիլյացիա
* Ինտերպրետատոր
* Run-time գրադարան
* Ծրագրի կատարման ժամանակ
* Կոմպիլյացիայի ժամանակ
* Ելակոդ
* Օբյեկտային կոդ
* Բայթկոդ
* Մեքենայական կոդ
* Միկրոկոդ
* Բացարձակ կոդ
 |
| * դ
* ք
* խ
 |

**Տրանսլյատորը** (անգլ.՝ translator) ծրագիր է, որը կատարում է ծրագրի թարգմանում։ 
Տրանսլյացիայի պրոցեսում ծրագրավորման մի լեզվով գրված ծրագիրը փոխակերպվում է մեկ այլ լեզվի՝ պահպանելով ֆունկցիոնալ համարժեքությունը, առանց սկզբնական ծրագիր ֆունկցիանալ և իմաստային կառուցվածքի կորստի։

Լեզուն, որով ներկայացված է մուտքային ծրագիրը, կոչվում է *սկզբնական լեզու*, իսկ ծրագիրը՝ *սկզբանական կոդ* (անգլ.՝ Source code)։ Ելքային լեզուն կոչվում է *target լեզու*, իսկ ելքային ծրագիրը՝ *օբյեկտային կոդ* (անգլ.՝  object code )։

Տրանսլյատորը փոխակերպում է *սկզբնական կոդը* *օբյեկտային կոդի*

Տրանսլյատորի տեսակները
----------------------

Գոյություն ունեն մի քանի տրանսլյատորի տեսակներ՝ 

* Եթե տրանսլյատորը բարձր մակարդակի լեզուն թարգմանում է մեկ այլ բարձր մակարդակի լեզվի, ապա այն կոչվում է *տրանսլյատոր* կամ source-to-source կոմպիլյատոր անգլ.՝ transcompiler or transpiler)։
* Եթե տրանսլյատորը բարձր մակարդակի լեզուն թարգմանում է ցածր մակարդակի լեզվի, ապա այն կոչվում է կոմպիլյատոր։ Ցանկացած լեզու կարող է թարգմանվել, կամ բարձր մակարդակի, կամ ասեմբլեր լեզվի։
* Եթե տրանսլյատորը բարձր մակարդակի լեզուն թարգմանում է միջանկյալ ներկայացման, որն ուղղակիորեն կատարվում է, ապա այն կոչվում է ինտերպրետատոր։
* Եթե տրանսլյատորը ելքային/մեքենայական լեզուն թարգմանում է սկզբնական լեզվի, կոչվում է *դեկոմպիլյատոր* անգլ.՝  decompiler)։
* Եթե տրանսլյատորը ասեմբլերի լեզուն թարգմանում է մեքենայական կոդի, ապա այն կոչվում է ասեմբլեր։
* Եթե տրանսլյատորը մեքենայական կոդը թարգմանում է ասեմբլերի լեզվի, կոչվում է *դիզասեմբլեր*։

Իրականացումը
------------

 Լեզվի իրականացումը
Տրանսլյատորի նպատակը մի լեզվից մյուսին տեքստի փոխակերպումն է՝ հասցեատիրոջը հասկանլի դարձնելու համար։ Տրանսլյացիայի ժամանակ հասցեատերը կարող է լինել՝

* սարք՝ պրոցեսոր (տրանսլյացիան կոչվում է կոմպիլյացիա),
* ծրագիր՝ ինտերպրետատոր (տրանսլյացիան կոչվում է *ինտերպրետացիա*)։

*Տրանսլյացիայի տեսակները՝*

* Կոմպիլյացիա,
* Ինտերպրետացիա,
* Դինամիկ կոմպիլյացիա։

### Կոմպիլյացիա

Ծրագրի կոմպիլյացիա
Հիմնական հոդված՝ Կոմպիլյատոր
Պրոցոսսորի լեզուն կոչվում է մեքենայական լեզու, մեքենայական կոդ։ Մեքենայական լեզվի կոդը կատարվում է պրոցոսսորի կողմից։ Հիմնականում մեքենյական լեզուն ցածր մակարդակի լեզու է, բայց գոյություն ունեն պրոցեսսորներ, որոնք օգտագործում են բարձր մակարդակի լեզուներ (այդպիսիները բավականին ծախսատար են)։

**Կոմպիլյատորը** որևէ ծրագրավորման լեզվով գրված սկզբանական կոդը փոխակերպում է մեքենայական կոդի։

Կոմպիլյացիայի գործընթացը կատարվում է մի քանի փուլերով՝

* Լեքսիկական վերլուծություն,
* շարահյուսական վերլուծություն,
* իմաստային վերլուծություն,
* վերլուծության արդյունքների հիման վրա միջանկյալ կոդի ստեղծում,
* միջանկյալ կոդի օպտիմիզացիա,
* օբյեկտային կոդի ստեղծում, տվյալ դեպքում մեքենայական կոդի։

Ծրագիրը կարող է օգտագործել օպերացիոն համակարգի կողմից տրամադրված ծառայություններ (օրնակ գրադարաններ՝ ֆայլերի հետ աշխատելու համար, գրադարններ՝ գրաֆիկական ինտերֆեյս ստեղծոլու համար)։ Մեքենայակն կոդի օբյեկատային ֆայլերը այլ օբյեկտային ֆայլերից ավելացնելու և դինամիկ գրադարանի մասին ինֆորմացիայի համար կատարվում է միացում(անգլ.՝ link) կամ կոմպանոկա։ Միացում կատարվում է կապերի խմբագրիչով։ Կապերի խմբագրիչը կարող է լինել առանձին ծրագիր կամ կոմպիլյատորի մաս։ Այն ստեղծում է կատարվող ֆայլ ( անգլ.՝ executable file)։ Այն իրականացվում է հետևյալ ձևով՝ 

* օգտագործողի պահանջով ստեղծվում է օպերացիան համակարգի միջուկում ստեղծվում է «պրոցեսս» օբյեկտ,
* օպերացիոն համակարգի բեռնիչը(անգլ.՝ loader) կատարում է հաջորդ գործողությունները
* կատարվող ֆայլը իրականացնում է
* բեռնում է հիշողության մեջ
* բեռնում է դինամիկ գրադարանի հիշողության մեջ
* կատարում է մեքենայական կոդի ծրագրի միացում դինամիկ գրադարանին
* ղեկավարումը փոխանցում է ծրագրին

Կոմպիլյատորի առավոլությունները՝

* ծրաագրի կոմպիլյացիան կատարվում է մեկ անգամ
* սարքում՝ որի համար կատարվում է կոմպիլյացիան, կոմպիլյատորի առկայություն չի պահանջում։

Կոմպիլյատորի թերությունները՝

* կոմպիլյացիան դանդաղ գործընթաց է
* սկզբանկան կոդում փոփոխություններ մտցնելով, պահանջվում է կրկանկի կոմպիլայցիա .

Ասսեմբլերը կոմպիլյատոր է, ասսեմբլերի լեզվով տեքստը փոխակերպող մեքենայական լեզվի։ Ասսեմբլերի լեզուն լեզու է, որը մոտ է մեքենայական լեզվին, ցածր մակարդակի լեզու է։

### Ինտերպրետացիա

 Ծրագրի ինտերպրետացիա
Հիմնական հոդված՝ ինտերպրետատոր
Ինտերպրետացիան սկզբնական կոդը կարդալու և կատարելու պրոցեսս է։ Ծրագրի իրականցումն է Ինտերպրետատորով։

Ինտերպրետատորը կաորղ է աշխատել երկու ձևով՝

1. կոդը կարդալ և իրակացնել միանգամից (մաքուր ինտերպրետացիա);
2. Կոդը կարդալ, հիշողությունում ստեղծել կոդի միջանկյալ ներկայությունը (Բայթկոդ կամ պի-կոդ),միջանկյալ ներկայացված կոդը կատարել։

Առաջին դեպքում տրանսլյացիա չի օգտագործվում, իսկ երկրորդում օգտագործվում է սկզբանկան կոդի տրանսլյացիա, միջանկյալ կոդում։

Ինտերպրետատորի աշխատանքի փուլերը՝

* Լեքսիկական վերլուծություն,
* շարահյուսական վերլուծություն,
* իմաստային վերլուծություն,
* միջանկլյալ ներկայացված կոդի կատարում (մաքուր ինտերպրետացիայի դեպքում չի կատարվում)
* իրականցում

Ինտերպրետատորը մոդելավորում է մեքենա(վիրտուալ մեքենա), ռեալիզացնում է մեքենայի ընտրված իրականցման հրամանները։ Մեքենայի հրամանները գրվում են ոչ թե մեքենայակն լեզվով այլ, բարձր մակարդակի լեզվով։ Ինտերպրետատորը կարելի է անվանել վիրտուալ մեքենայի լեզվի կատարող։

Մաքուր ինտերպրետացիան կիրառելի է պարզ կառուցվածք ունեցող լեզուների հետ, ինչպիսիք են օրիանակ սկրիպտավորման լեզուները, լիսպը։

Բայթկոդ ստեղծող ինտերպրետատորների օրինակներ են՝ Perl, PHP, Python․․․։

Ինտերպրետատորի առավոլությունները կոմպիլայտորի հետ համեմատած՝

* հնարավորություն աշխատել ինտերակտիվ ռեժիմում
* փոփոխություններ մտցնելուց սկզբանական կոդի նախակոմպիլյացիայի բացակայություն

Ինտերպրետատորի թերությունները կոմպիլայտորի հետ համեմատած՝

* ցածր արդյունավետություն (մեքենայական կոդը պրոցոսսորի կողմից է իրականցվում, իսկ ինտերպրետացված կոդը՝ ինտերպրետատորի);
* սարքում ինտերպրետատորի առկայության անհրաժեշտություն, որով պլանավորվում է ծրագրի իներպրետացիան
* կատարման ընթացքում սինտակսիսական սխալների բացահայտում

Պարզ ինտերպրետատորների համեմատումը, բայթկոդ ստեղծող ինտերպրետատոների հետ

* պարզ ինտերպրետատորը հեշտ է ռեալիզացնել, քանի որ դրա համր պետք չէ գրել տրանսլյատոր
* բայթկոդ ստեղծող ինտերպրետատորը կարող է կատարել իր օպտիմիզացիան և հասնել մեծ արդյունավետության
* բայթկոդ ստեղծող ինտերպրետատորը, պահանջում է համակարգի մեծ ռեսուրսներ (բայթկոդի տրանսլյացիան զբաղեցնում է պրոցեսսորային ժամանակ, բայթ կոդը հիշողությունում է տեղ զբաղեցնում է )..

### Դինամիկ կոմպիլյացիա

Հիմնական հոդված՝ JIT կոմպիլյացիա
Դինամիկ կամ JIT կոմպիլյացիան (անգլ.՝ just in time compilation) տրանսլյացիա է, որի դեպքում սկազբնական կամ միջանկյալ կոդը փոխակերպվում է մեքենայական կոդի ծրագրի կատարման ժամանակ։. Յուրաքանչյուր մասի կոմպիլյացիան կատարվում է միայն մեկ անգամ, կոմպիլյացված կոդը պահվում է կեշում և անհարժեշտության դեպքում օգտագործվում է կրկնակի։

Դինամիկ կոմպիլայցիայի առավելությունները համեմատած կոմպիլյացիայի հետ՝

* դինամիկ կոմպիլյացիայի աշխատանքի արգությունը մոտ է կոմպիլյացվող ծրագրի աշխատանքի արագությանը
* Ծրագիրը այլ պլատֆորմ տեղափոխելիս անհրաժեշտ չէ նախակոմպիլյացնել այն։

Դինամիկ կոմպիլայցիայի առավելությունները համեմատած կոմպիլյացիայի հետ՝

* ռեալիզացիայի մեծ դժվարություն
* ռեսուրսների մեծ պահանջ։

Դինամիկ կոմպիլյացիան հարմար է վեբ- հավելվածների համար։

Տրանսլյացիայի և ինտերպրետացիայի հասկացությունները
-------------------------------------------------

«Տրանսլյացիա» և «ինտերպրետացիա» հասկացությունները տարբերվում են։ Տրանսլյացիայի կատարման ժամանակ փոխակերպվում ծրագրի կոդը մի լեզվից մյուսին։ Իներպրետացիայի ժամանակ ծրագիրը կատարվում է։

Քանի որ ամբողջ տրանսլյացիան հիմնականում համարվում է ինտերպրետացիային պատվելը, այդ պրոցեսները դիտարկվում են միասին։ Օրինակ ծրագրավորման լեզուներ հաճախ բնութագրվում են ինչպես «կոմպիլյացվող» կամ «ինտերպրետացվող» , կախված այն բանից, ինչն է գերակշռում կատարվող լեզվում։

Մյուս կողմից, գոյություն ունի տրանսլյատորի և ինտերպրետացիայի փոխներգրավվածության պրոցեսս՝ ինտերպրետատորնեը կարող են լինել կոմպիլյացվող, իսկ տրանսլյատորներում կարող է պահանջվել ինտերպրետցիա «metaprogramming»-ի ռեալիզացիայի համար։

Ավելին, նույն ծրագրավորման լեզուն կարող է և տրանսլյացվել և ինտերպրետացվեր , և երկու դեպքում էլ պետք է լինեն վերլուծության ընդհանուր էտապներ։

Գրականություն
-------------

* *Касьянов В. Н. Поттосин И. В.* Методы построения трансляторов. — Новосибирск: Наука, 1986. — 344 с.
* Foundations of Programming Languages | Kent D. Lee