Բայթկոդ

Վիքիպեդիայից՝ ազատ հանրագիտարանից

Ծրագրավորման մեջ բայթկոդը (անգլ. 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) ։ Ռեգիստրային վիրտուալ մեքենաների բայթկոդը ունի քիչ հրահանգների քանակություն համեմատած ստեկայի բայթկոդերի հետ, մոտավորապես երկու անգամ քիչ, իսկ ինտերպրետատորը՝ տասնյակ տոկոսով ավելի արագ։ Նաև ստեկային մեքենայի բայթկոդը տարվող օպտիմիզացիայի համար դժվար է (արտահայտությունները դառնում են թաքնված, կապակցված հրամանները չխմբավորված, արտահայտությունները բաշխվում են մի քանի բազային բլոկների ) և պահանջում է ստուգել իրականցվող ստեկի կոռեկտությունը։

Հղումներ[խմբագրել | խմբագրել կոդը]