Բայթկոդ

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

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

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

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

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

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

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

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

thumb|left|upright=2.00|ActionScript սկզբանական կոդից JIT գեներացված կոդի

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

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

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

## Արտաքին հղումներ
* Basics of Compiler Design 
* Language Implementation Patterns 

Կատեգորիա:Համակարգիչ