Մեքենայական կոդ

Մեքենայական կոդ (machine code) կամ մեքենայական լեզու, հրամանների համակարգ, որը նախատեսված է կոնկրետ մեքենայի համար։ Ինտերպրետացվում է անմիջապես այդ մեքենայի պրոցեսորի կամ միկրոծրագրերի կողմից։
Համակարգչային ծրագիրը՝ գրված մեքենայական լեզվով, կազմված է մեքենայի հրամաններից, որոնցից յուրաքանչյուրը ներկայացված է մեքենայական կոդի տեսքով, այսինքն օպերացիայի կոդից (opcode, կամ operation code)՝ մեքենայի հրամնների համակարգից   առանձին օպերացիաների երկուական կոդ։ Ծրագրավորման հարմարավետության համար թվային օպկոդերի փոխարեն, որոնք   միայն պրոցեսսորն է հասկանում, հիմանկանում օգտագործում են իրենց մնեմոնիկայի պայմանական տառային նշանակումները։ Այդպիսի մնեմոնտիկայի հավաքածուն, որոշ լրացուցիչ հնարավորություններով կոչվում է ասսեմբլեր լեզու։
Ցանկացած պրոցեսսորի մոդել ունի իր սեփական հրամանների հավաքածուն, չնայած բազմաթիվ մոդելներում այդ հրամանների հավաքածուն համընկնում է։  A պրոցեսսորը համատեղելի է  B պրոցեսսորի հետ, եթե A պրոցեսսորը հասկանում է   B պրոցեսսորի մեքենայական կոդը։ Եթե A և B պրոցեսսորները ունեն որոշ հրամանների ենթախմբեր, որոնցով դրանք փոխադարաձ համատեղելի են, ապա դրանք ունեն նույն ճարտարապետությունը։


== Մեքենայական հրաման ==
Ցանկացած մեքենայական հրաման կատարում է որոշակի հրամաններ, ինչպիսին է տվյալների հետ գործողություններ (օրինակ գումարում կամ մեքենայական բառի պատճենում ռեգիստրում կամ հիշողության մեջ) կամ այլ կոդի մասի անցում։ Ցանկացած կատարվող ծրագիր կազմված է այդպիսի մեքենայական հրահանգների  հաջորդակնություններից։
Մեքենայական հրամանների տեսքվ գրված գործողությունները կարող են բաժանվել երկու խմբի՝ պարզ (էլեմենտար օպերացիաներ)  և հասարակ ։ Բացի դրանից ժամանակակից պրոցեսսորները բաղկացած են առանձին կատարվող սարքերից՝  հաշվաղական բլոկներից, որնք կարող են կատարել միայն սահմանափակ պարզ գործողությունների հավաքածուներ։ Հերթական հրամանը կատարելիս պրոցեսսորի հատուկ բլոկը՝ դեկոդերը տրանցլյացնում է այն էլեմենտար գերծողությունների հաջորդականության։
Պրոցեսսորի հրամանի հավաքածուի ճարտարապետությունը որոշում է, ինչ գործողություններ է այն իվիճակի կատարել և որ մեքենայական գործողություններին ինչ թվային կոդի գործողություններ են համըկնում (օպկոդ) ։


== Մեքենայական կոդը որպես ծրագրվարման լեզու ==
Մեքենայակն կոդը կարող է դիտարկվել ինչպես պարզունական ծրագրավորման լեզու կամ ինչպես կոմպիլյացված կամ ասսամբլերացված ամենացածր մակարդակի ծրագիր։ Չնայած կարելի է ստեղծել անմիջապես մեքենայական կոդով ծրագրեր, սակայն դա արվում է հազվադեպ կոդի մեծածավալության հիման վրա, ինչպես նաև առաջանում է պրոցեսսորի ռեսուրսների մեխանիկական կառավարման դժվարություններ, բացառությամբ՝ երբ պահանջվում է  էքստրեմալ օպտիմիզացիա։ Այդ պատճառով էլ ծրագրերի մեծ մասը գրվում է բարձր մակարդակի լեզուներով և տրանսլյացվում է մեքենայակն կոդի։ Մեքենյակն կոդը երբեմն անվանում են հարազատ կամ սեփական կոդ, երբ խոսքը լեզվի պլատֆորմից կամ գրադարանից  կախման մասին է (native code)։
Ինտերպրետացող ծրագրերում մեքենայակն կոդի տրանսլյացում տեղի չի ունենում (ինչպիսին է օրինակ   Python-ը), դրա փոխարեն այն կամ անմիջապես կատարվում է լեզվի ինտերպրետատորով կամ տրանսլյացվում է բայթկոդի։ Մինչդեռ այդ լեզուների ինտերպրետատորները որպես կանոն ներկայացված են մեքենայական կոդի տեսքով։


== Միկրոկոդ ==

Որոշ համակարգչային ճարտարապետություններում մեքենայական կոդի աջակցումը իրականցվում է ավելի ցածր մակարդակի ծրագրի շերտով, միկրոծրագիր անվանմամբ։ Դա թույլ է տալիս ապահովել մեկ մեքենայական կոդի ինտերֆեյս ամբողջ տողում կամ համակարգի ընտանիքում, որնոք կարող են իրենց մեջ ունենալ էական տարբերություններ և մեղմացնում է մեքենայական կոդում ծրագրի փոխանցումը այլ համակարգերի մոդելների միջև։
Էմուլյատորի իրականցման համար միկրոկոդի շերտի օգտագործումը հնարավորություն է տալիս համակարգչին ներկայացնել լրիվ այլ համակարգչի ճարտարապետությունը։


== Բացարձակ կոդ ==
Բացարձակ կոդը ( absolute code)  ծրագրային կոդ է՝ անհրաժեշտ անմիջապես պրոցեսսորի կատարման համար, այսինքն կարիք չունի լրացուցիչ մշակման (օրինակ՝ կոդի տարբեր մասի հղումների թուլյատրումը  կամ հիշողության հասցեների կապումը հիմանկանում բեռնիչի կողմից կատարվող)։ Բացարձակ կոդի օրինակներ են հանդիսանում կատարվող ֆայլերը .COM ֆորմատով կամ ОС բեռնիչը։ Հաճախ բացարձակ  կոդը  հասկացվում է ավելի նեղ իմաստով ինչպես անկախ-դրքային կոդը (Այսինքն կոդ՝ կապված հիշողության որոշակի հասցեների հետ )։


== Անկախ-դիրքային կոդ ==
Անկախ-դիրքային կոդը (անգլ.՝ position-independent code) — ծրագիր, որը կարող է փոխադրվեկ հիշողության ցանկացած հատված, քանի որ բոլոր հիշողության բջիջների  հղումները իրենում հարաբերական են։ Այդպիսի ծրագիրը ցանկացած ժամանակ կարող է տեղափոխվել հիշողության այլ հատված, ի տարբերություն փոխադրելի ծրագրերի, որը թեև կարող է բեռված լինել հիշողության ցանկացած հատված, բայց բեռնելուց հետո պետք է մնա նույն տեղում։
Անկախ-դիրքային կոդի ստեղծման հնարավորությունը կախված է ճարտարապետությունից  (architecture) և նշանակային պլատֆորմի հրամնների համակարգից։ Օրինակ, եթե հրամանների համակարգում բոլոր անցումների հրամններում պետք է նշվեն բացարձակ հասցեներ, ապա անցումեր պահաջող այդ կոդը գործնականում անհնար է դարձնել անկախ-դիրքային։  x86 ճարտարապետությունում տվյալների հետ աշխատող անմիջական հասցեավորված հրամաններում ներկայացված է միայն բացարձակ հասցեներ, բայց քանի որ տվյալների հասցեները համարվում են սեգմենտային ռեգիստրի համեմատական, որը կարող է փոխվել ցանկացած ժամանակ, դա թույլ է տալիս տվյլալների համար ստեղծել անկախ-դիրքային կոդ՝ իր հիշողության բջիջներով։  Բացի դրանից որոշ հրամանների հավաքածուներ կարող են հանվել ինքնամոդիֆիկացաված կոդի (Self-modifying code ) կամ ոչտրվիալ հրամանների հաջորդակնության օգնությամբ։


== «Hello, world!» ծրագիրը ==
«Hello, world!» ծրագիրը x86 արխիտեկտեւրայի համար  (ОС MS DOS,) ոինի հետևյալ տեսքը (տասնվեցական համակարգում)՝

BB 11 01 B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21


== Տես նաև ==
Ասսեմբլեր լեզու
JIT կոմպիլյացիա


== Հղումներ ==

Basics of Compiler Design 
Language Implementation Patterns Archived 2016-03-05 at the Wayback Machine.