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

Ծրագրավորման մեջ ***բայթկոդը*** (անգլ. *bytecode* նաև *p-code (portable code)* ), դա միջանկյալ ներկայացում է, որում կարող է թարգմանված լինել համակարգչային ծրագրը։ Համեմատած սկզբանակն կոդի հետ, որը ստեղծման համար հարմարավետ է և մարդու կողմից ընթեռնելի, բայթկոդը ծրագրի կոմպակտ ներկայացումն է՝ արդեն սինտակտական (անգլ. syntactic analysis ) և սեմանտիկական (անգլ. semantic analysis) վերլուծությունները արված։ Իրենում հստակորեն կոդավորված են տիպերը, տեսանելիության տիրույթները և այլն։ Տեխնիկական տեսանկյունից բայթկոդը իրնից ներկայացնում է ցածր մակարդակի մեքենայից անկախ կոդ, սկզբանական կոդից գեներացված տրանսլյատորի կողմից։

 Java Bytecode գումարման օրինակ
Շատ ծրագրավորման լեզուներ, հատկապես ինտերպրետացվող, բայթկոդն օգտագործում են ինտերպրետատորի աշխատանքը թեթևացնելու և արագացնելու համար։ Բայթկոդի տրանսլյացիան ինտերպրետացիայի և կոմպիլյացիայի միջև էֆեկտիվությամբ միջանկյալ տեղ է զբաղեցնում։

Բայթկոդի տեսքը նման է մեքենայական կոդի, նախատեսված է ոչ թե իրական պրոցեսսորի իրականցման համար, այլ *վիրտուալ մեքենայի*։ Վիրտուալ մեքենայի հատկությունում հանդես է գալիս ծրագրավորման լեզվին համապատասխանող ինտերպրետատոր (երբեմն համալրված JIT- կամ AOT-կոմպիլյատորով)։ Տարբեր լեզուների համար բայթկոդի առանձնահատկությունները և այն իրականցնող վիրտուալ մեքենան կարող են խիստ տարբերվել, հիմնականում բայթկոդը կազմված է *ստեկային վիրտուալ մեքենայի* հրամաններից, սակայն կարող են օգտագործվել և *ռեգիստրային մեքենաներում* ։ Այդուհանդերձ բայթկոդի հրամանների մեծամասնությունը հիմանակնում համարժեք է ասսամբլերրի մեկ կամ մի քանի հրամաննրի։

Բայթկոդն այդպես է կոչվում, քանի որ յուրաքանչյուր կոդի օպերացիայի երկարությունը սովորաբար մեկ բայթ է։ Յուրաքանչյուր հրաման հիմնականում իրենից ներկայացնում է մեկբայթային կոդի օպերացիա (0-ից մինչև 255), որին կարող է հաջորդել տարբեր պարամետրներ, օրինակ ռեգիստորի կամ հիշողության հասցեի թիվ։

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

Ծրագիրը հիմնված բայթկոդի վրա հիմնականում կատարվում է բայթկոդ ինտերպրետաորով։ Բայթկոդի առավելությունը բարձր էֆեկտիվությունն է և փոխադրելիությունը (անգլ. Porting), այսինքն նույն բայթկոդը կարող է իրականցվել տարբեր պլատֆորմաններում և ճարտարապետություններում, որոնց համար իրականցված է ինտերպրետատոր։ Բայթկոդը հիմնականում ավելի քիչ աբստրակտ է և ավելի կոմպակտ, քան սկզբնական կոդը, բայթկոդի ինտերպրետացիայի էֆեկտիվությունը ավելի բարձր է, քան սկզբնական կոդի մաքուր ինտերպրետացիան կամ աբստրակտ շարահյուսական ծառի ինտերպրետացիան։ Բացի դրանից բայթկոդի ինտերպրետատորը հաճախ հեշտ է սկզբնական կոդի ինտերպրետատորից և իրեն հեշտ է տեղափողել այլ պլատֆորմ։

Բարձրարդյունավետությամբ վիրտուալ մեքենաներում կարող է կիրառվել ինտերպրետատորի և JIT-կոմպիլյատորի համատեղում, որը իրականցման ժամանակ ծրագրը տրանսլյացնում է հաճախ բայթկոդի հաճախ օգտագործվող հատվածները մեքենայակն կոդի։ JIT-կոմպիլյացիայի փոխարեն կարող է օգտագործվել AOT-կոմպիլյատոր, տրանսլյացնելով բայթկոդը մեքենայական կոդի մինչև ծրագրի կատարումը։

Միևնույն ժամանակ կարելի է ստեղծել պրոցեսսներ, որոնց համար տվյալ բայթկոդը հանդիսանա անմիջական մեքենայական կոդ (նման էքստրեմալ պրոցեսսներ ստեղծվել են Java և *Forth* -ում)։

Օրինակներ
---------

Java վիրտուալ մեքենայի ներքին ճարտարապետությունը
Բայթկոդ օգտագործող ինտերպրետացվող լեզուները վերաբերվում են Perl, PHP, Ruby, Python, Erlang և մնացած ուրիշներին։
Բայթկոդը օգտագործող տարածված պլատֆորմներ՝

* Բայթկոդ Java (ստեկային վիրտուալ մեքենա)՝ իրականցվող տարբեր Java վիրտուալ մեքենաներում (անգլ.՝ Java Virtual Machine, JVM)։ Պլատֆորմը ստեղծել է Sun ընկերությունը, Java-ի համար, բայց դրաձավ օգտագործվաղ այլ լեզուներում, գոյություն ունեն JVM-ի շատ իրականցումներ, JIT-կոմպիլյատորն օգտագործող։
* Microsoft .NET-ի պլատֆորմանորը օգտագործում են ստեկային բայթկոդ *Intermediate Language* *(CIL, MSIL), Common Language Runtime (CLR)* կողմիցօգտագործվող։
* JavaScript սկրպտային լեզուն կատարվում է տարբեր բարձր արդյունավետությամբ շարժիչներում, հիմանակնում կառուցված են վեբ-բրաուզերներում, հաճախ JIT- օպտիմիզացիաներով։ Շատերը կառուցված են բայթկոդ կիրառելով, սակայն Javascript-ով ծրագրերը ընդլայնվում են սկզբանական կոդով։
* ActionScript սկրպտային լեզուն տրանսլյացվում է ստեկային բայթկոդի, ընդլայնվում են swf և pdf ֆայլերի մասերով, և իրականցվում են Adobe Flash и Adobe Acrobat վիրտուալ մեքենաներում։

ActionScript սկզբանական կոդից JIT գեներացված կոդի
*Clipper* կոմպիլյատորը ստեղծում է իրականցվող ֆայլ, որում միացված է բայթկոդ, տրանսլյացված ծրագրի սկզբանակն տեքստից և վիրտուալ մեքենան իրականացնում է այդ բայթկոդը։
Java-ով ծրագրերը հիմանակնում կոմպիլյացվում են class-ֆայլի՝ պարունակող *բայթկոդ Java* ։
Visual Basic-ի տարբեր իրականցումերում(մինչև 6) օգտագործվում է բարձրմակարդակային p-code

Բարձրմակարդակային p-կոդերը և բայթկոդերը կիրառվել են, բազային տվյալների կառավարման համակարգերում, BASIC-ի և պասկալի որոշ ռեալիզացիաներում։

**Վերլուծություն**
------------------

branch prediction, normal branch code
Ավանդական **բայթկոդը** մշակվում է ստեկային վիրտուալ մեքենայի ոճով, որը հեշտացնում է *աբստրակտ շարահյուսական ծառի* (անգլ. *abstract syntax tree (AST)*) գեներացումը, այն հնարավորություն է տալիս օգտագերծել ավելի պարզ և կոմպակտ բայթկոդի կոդավորում, պարզեցնել ինտերպրետատորը ր նվազեվնել մեքենայակն կոդի քանակությունը՝ պահանջող բայթկոդի մեկ հրաման։ Մյուս կողմից, ծրագրի ստեղծման բայթկոդի այդպիսի տարբերակը պարուանկում է մեծ քանակությամբ հրամններ, քան ռեգիստրային վիրտուալ մեքեանայի բայթկոդը, որի պատճառով ինտերպրետատորը պետք է իրագործի ավելի շատ անուղղակի անցումներ, որի համար վատ է աշխատում *անցումների կանխատեսումը* ( անգլ.՝ branch prediction) ։ Ռեգիստրային վիրտուալ մեքենաների բայթկոդը ունի քիչ հրահանգների քանակություն համեմատած ստեկայի բայթկոդերի հետ, մոտավորապես երկու անգամ քիչ, իսկ ինտերպրետատորը՝ տասնյակ տոկոսով ավելի արագ։ Նաև ստեկային մեքենայի բայթկոդը տարվող օպտիմիզացիայի համար դժվար է (արտահայտությունները դառնում են թաքնված, կապակցված հրամանները չխմբավորված, արտահայտությունները բաշխվում են մի քանի բազային բլոկների ) և պահանջում է ստուգել իրականցվող ստեկի կոռեկտությունը։

Արտաքին հղումներ
----------------

* Basics of Compiler Design
* Language Implementation Patterns Արխիվացված 2016-03-05 Wayback Machine