**Ծրագրավորման լեզու**, նշանների համակարգ, որը նախատեսված է համակարգչային ծրագրեր գրելու համար։ Ծրագրավորման լեզուն մեզ տալիս է որոշակի բառապաշար և քերականական կանոններ, որոնցից ելնելով ծրագրավորողը գրում է իր ծրագիրը։

Առաջին ԷՀՄ-ների ստեղծումից ի վեր ստեղծվել է ավելի քան 2500 տարբեր ծրագրավորման լեզուներ, և ամեն տարի դրանց թիվն ավելի է մեծանում։ Որոշ լեզուներից օգտվել կարողանում են միայն դրանք ստեղծողները, իսկ մյուսները հանրահայտ են դառնում միլիոնավոր մարդկանց։ Պրոֆեսիոնալ ծրագրավորողները իրենց աշխատանքում օգտագործում են նույնիսկ 10-ից ավելի ծրագրավորման լեզուներ։

Ծրագրավորման լեզվի նկարագրությունը սովորաբար կազմված է լինում երկու բաղկացուցիչներից՝ շարահյուսություն և իմաստաբանություն։ Որոշ ծրագրեր բացատրվում են մասնագրային փաստաթղթերով, օրինակ՝ C ծրագրավորման լեզուն մասնագիտացված է ISO ստանդարտով։ Perl 5-ը և այլ վաղ լեզուներ դոմինանտ իրականացում, ինչի շնորհիվ կիրառվում են որպես տեղեկագրություն։

Ծրագրավորման լեզուն նախատեսված է համակարգչային ծրագրեր գրելու համար, որոնք մի շարք կանոններ են, որոնք համակարգչին թույլ են տալիս կատարել որոշակի հաշվարկային գործընթաց, կազմակերպել տարբեր օբյեկտների կառավարում:Ծրագրավորման լեզուն տարբերվում է բնական լեզուներից, քանի որ այն նախագծված է համակարգիչները վերահսկելու համար, մինչդեռ բնական լեզուները հիմնականում օգտագործվում են մարդկանց միջև հաղորդակցվելու համար։ Ծրագրավորման լեզուների մեծամասնությունը օգտագործում են հատուկ կոնստրուկցիաներ ՝ տվյալների կառուցվածքները սահմանելու և շահարկելու և հաշվարկների գործընթացը վերահսկելու համար:Որպես կանոն, ծրագրավորման լեզուն սահմանվում է ոչ միայն այն լեզվական ստանդարտի բնութագրերի միջոցով, որը պաշտոնապես սահմանում է իր շարահյուսությունն ու իմաստաբանությունը,այլ նաև ստանդարտ- ծրագրային գործիքների ներդրման (իրականացման) միջոցով, որոնք ապահովում են այս լեզվով ծրագրերի թարգմանում կամ մեկնաբանություն:Նման ծրագրային գործիքները տարբերվում են արտադրողի, ապրանքանիշի և տարբերակի (վարկածի) տարբերակով, թողարկման ժամկետով, ստանդարտի իրականացման ամբողջականությամբ, լրացուցիչ հատկություններով:Կարող են լինել մարմնավորման որոշակի սխալներ կամ առանձնահատկություններ, որոնք ազդում են լեզվի կամ նույնիսկ դրա ստանդարտի օգտագործման պրակտիկայում:Ծրագրավորման լեզուն կարող է ներկայացվել մասնագրերի մի այնպիսի համակարգի տեսքով, որոնցով բնութագրվում են նրա շարահյուսությունն ու իմաստաբանությունը։

Մշակման վաղ փուլեր
------------------

Կարելի է ասել, որ առաջին ծրագրավորման լեզուները առաջացել են նույնիսկ ժամանակակից էլեկտրոնային համակարգիչների հայտնվելուց առաջ։ Արդեն 19-րդ դարում հորինվել են այնպիսի սարքեր, որոնք կարելի է ծրագրավորվող անվանել մի փոքր պայմանականությամբ-օրինակ՝ երաժշտական տուփ (իսկ հետագայում ՝ մեխանիկական դաշնամուր) մետաղական մխոցով և այլն։ Դրանք կառավարելու համար օգտագործվել են ցուցումների շարք, որոնք ժամանակակից դասակարգման շրջանակներում կարող են համարվել կողմնորոշված ծրագրավորման լեզուների նախատիպեր։ Նշանակալից կարելի է համարել այն «լեզուն», որում 1842 թվականին Օգուստա Ադա Քինգ կոմսուհի Լավլեյսը գրեց ծրագիր՝ «Չարլզ Բեբիջ» վերլուծական մեքենայի համար Բերնուլի համարները հաշվարկելու համար, որը, եթե իրականացվեր, կդառնար աշխարհում առաջին համակարգիչը, չնայած մեխանիկական, գոլորշու շարժիչով։ 1930-1940-ին Ա.Չյորչը Ա. Տուրինգը, Ա.Մարկովը մշակեցին մաթեմատիկական աբստրակցիաներ (համապատասխանաբար՝ Լամբդայի հաշվարկ, Տուրինգ մեքենա, նորմալ ալգորիթմներ)-պաշտոնականացնելու համար։ Միևնույն ժամանակ, 1940-ական թվականներին հայտնվեցին էլեկտրական թվային համակարգիչներ և ստեղծվեց լեզու, որը կարելի է համարել համակարգչային ծրագրավորման առաջին բարձր մակարդակի լեզու:«Պլանկալկուլ», ստեղծվել է գերմանացի ինժեներ Կ. Զուսեի կողմից 1943-1945թթ։ Առաջին գործնական կիրառված լեզուն 1949 թ.-ին էր, այսպես կոչված, «Կարճ օրենսգիրք», որում գործառույթներն ու փոփոխականները կոդավորված էին երկնիշ համադրություններով։ Այն մշակվել է ընկերության կողմից Eckert - Mauchly Computer Corporation,արտադրող UNIVAC,ստեղծվել է Տուրինգ-ի անդամի կողմից:Մոկլին իր անձնակազմին հանձնարարեց մշակել մաթեմատիկական բանաձևերի թարգմանիչ, բայց 1940-ականների համար այդ նպատակը չափազանց հավակնոտ էր:Կարճ ծածկագիրն իրականացվեց թարգմանչի միջոցով:Շուտով ծրագրավորման այս մեթոդը փոխարինվեց երկրորդ սերնդի լեզուների օգտագործմամբ, որը նույնպես սահմանափակվեց հատուկ մեքենաների բնութագրերով, բայց մարդկային օգտագործման համար ավելի պարզ ՝ օգտագործելով և մեքենայական հիշողության մեջ հասցեներին անունների համապատասխանեցման հնարավորությունը։ Դրանք ավանդաբար հայտնի են որպես հավաքման լեզուներ և ինքնագրեր։ Այնուամենայնիվ, մոնտաժը գործածելիս հարկ եղավ այն իրականացնելուց առաջ ծրագիրը փոխարկել մեքենայական լեզվով, որի համար մշակվել են հատուկ ծրագրեր, որոնք կոչվում են նաև հավաքիչներ։ Հետագայում բարելավվեցին երկրորդ սերնդի լեզուները,դրանցում հայտնվել է մակրո աջակցություն:Երրորդ սերնդի լեզուները, ինչպիսիք են Ֆորտրան- ը,Լիսպը և Կոբոլը, սկսեցին հայտնվել 1950-ականների կեսերին:Այս տիպի ծրագրավորման լեզուներն ավելի վերացական են (դրանք կոչվում են նաև «բարձր մակարդակի լեզուներ») և համընդհանուր, դրանք չունեն ուժեղ կախվածություն հատուկ ապարատային պլատֆորմի վրա և դրա վրա օգտագործվող մեքենայական ցուցումներով:Բարձր մակարդակի լեզու ունեցող ծրագիրը կարող է իրականացվել (համենայն դեպս տեսականորեն, գործնականում սովորաբար կան մի շարք հատուկ վարկածներ կամ լեզվի իրականացման բարբառներ) ցանկացած համակարգչի վրա, որն ունի այս լեզվի թարգմանիչ (գործիք, որը ծրագիրը թարգմանում է մեքենայական լեզվով, որից հետո այն կարող է իրականացվել պրոցեսորի կողմից):Այս լեզուների նորացված տարբերակները դեռ օգտագործվում են համակարգչային ծրագրերի մշակման մեջ, և դրանցից յուրաքանչյուրը որոշակի ազդեցություն է ունեցել ծրագրավորման լեզուների հետագա զարգացման վրա:Այնուհետև, 1950-ականների վերջին հայտնվեց Ալգոլը, որը նաև հիմք հանդիսացավ այս ոլորտում մի շարք հետագա զարգացումների համար:Պետք է նշել, որ վաղ ծրագրավորման լեզուների ձևաչափը և կիրառումը մեծապես ազդել են ինտերֆեյսի սահմանափակումների վրա։

Բարելավում
----------

1960-70-ականների ժամանակահատվածում մշակվել են ծրագրավորման լեզուների հիմնական պարադիգմները, որոնք ներկայումս օգտագործվում են, չնայած որ շատ առումներով այս գործընթացը միայն երրորդ սերնդի առաջին լեզուներում դրված գաղափարների և հասկացությունների կատարելագործումն էր։

* APL- ն ազդեց ֆունկցիոնալ ծրագրավորման վրա և դարձավ առաջին լեզուն, որը աջակցեց զանգվածի մշակմանը,
* Լեզուն PL / 1 (NPL) մշակվել է 1960-ականներին ՝ որպես Ֆորտրան- ի և Կոբոլ- ի լավագույն հատկությունների համադրություն,
* 1960-ականների ընթացքում զարգացած և կատարելագործված Snobol լեզուն, որը կենտրոնացած է բառերի մշակման վրա, ներմուծել է ծրագրավորման լեզուների հիմնական գործողությունների շարքում օրինակելի համընկնում,
* Սիմուլայի լեզուն, որը հայտնվում էր միևնույն ժամանակ, առաջին հերթին աջակցում էր օբյեկտիվ ուղղված ծրագրավորմանը։ 1970-ականների կեսերին մասնագետների մի խումբ ներկայացրեց Smalltalk- ը, որն արդեն լիովին օբյեկտիվ էր,
* 1969 թվականից մինչև 1973 թվականն ընկած ժամանակահատվածում իրականացվեց C լեզվով լեզվի զարգացումը, որը մինչ օրս տարածված է,և որը հիմք հանդիսացավ հետագա շատ լեզուների համար, օրինակ, նույնքան հայտնի, որքան C ++ և Java,
* 1972-ին ստեղծվեց Prolog- ը `ամենահայտնի (չնայած առաջինը չէ, և հեռու միակից) տրամաբանական ծրագրավորման լեզու,
* 1973 թ.-ին ML- ում(Meta Language) իրականացվեց պոլիմորֆային մուտքագրման ընդլայնված համակարգ, որը հիմք դրեց մուտքագրված ֆունկցիոնալ ծրագրավորման լեզուների,

Այս լեզուներից յուրաքանչյուրը սերունդների ընտանիք էր առաջացնում, և ծրագրավորման ժամանակակից լեզուները, ի վերջո, հիմնված են դրանցից մեկի վրա։ Բացի այդ, 1960-70-ական թվականներին ակտիվ քննարկումներ եղան տարբեր լեզուներով կառուցվածքային ծրագրավորմանը աջակցելու անհրաժեշտության վերաբերյալ:Մասնավորապես, հոլանդացի մասնագետ Է. Դեյկստրանը ՝ առաջարկելով լիովին հրաժարվել բոլոր բարձր մակարդակներում GOTO հրահանգների գործածությունից:Մշակվել են նաև տեխնիկա `ծրագրերի ծավալը նվազեցնելու և ծրագրավորողի և օգտագործողի արտադրողականության բարձրացման համար։

Միավորում և զարգացում
---------------------

1980-ականներին սկսվեց մի շրջան, որը կամայականորեն կարելի է անվանել համախմբման ժամանակ:C++ լեզուն համատեղում էր օբյեկտի վրա հիմնված և համակարգային ծրագրավորման առանձնահատկությունները, ԱՄՆ կառավարությունը ստանդարտացրեց Ադայի լեզուն:Ստեղծված Պասկալից և նախատեսված է ռազմական կայանքների համար օդային կառավարման համակարգերում օգտագործելու համար,զգալի ներդրումներ են կատարվել Ճապոնիայում և այլ երկրներում, այսպես կոչված, հինգերորդ սերնդի լեզուների հեռանկարների ուսումնասիրության մեջ,որը կներառեր տրամաբանական ծրագրավորման կոնստրուկցիաներ,Ընդհանուր առմամբ, այս ժամանակահատվածը բնութագրվում էր նախորդ տասնամյակում դրված հիմքի վրա ապավինելով, այլ ոչ թե նոր պարամետրերի մշակմամբ:Մանրածախ համակարգերի համար ծրագրավորման լեզուների մշակման գործընթացում նկատվող կարևոր միտում եղել է մոդուլների օգտագործման շեշտը `ծածկագրերի կազմակերպման հատորային միավորները,աշխատանքի կարևոր ոլորտը վիզուալ (գրաֆիկական) ծրագրավորման լեզուներն են, որոնցում ծրագիրը, որպես տեքստ գրելու գործընթացը փոխարինվում է «նկարելու» գործընթացով:Տեսողական լեզուները տալիս են տեսանելիություն և ավելի լավ ընկալում անձի կողմից ծրագրի տրամաբանության վրա։ 90-ականներին ինտերնետի ակտիվ զարգացման շնորհիվ տարածվեցին լեզուներ, որոնք թույլ տվեցին գրություններ գրել վեբ էջերի համար,մեծացել է նաև վիրտուալացման տեխնոլոգիաների ժողովրդականությունը:Ներկայումս ծրագրավորման լեզուների զարգացումը ընթանում է անվտանգության և հուսալիության բարձրացման ուղղությամբ ՝ ստեղծելով կոդային մոդուլային կազմակերպման նոր ձևեր և տվյալների բազաների հետ ինտեգրում։

**Լեզվի բնութագրում**
=====================

### Ստանդարտացում

Շատ տարածված ծրագրավորման լեզուների համար ստեղծվել են միջազգային ստանդարտներ:Հատուկ կազմակերպությունները պարբերաբար թարմացնում և հրապարակում են համապատասխան լեզվի բնութագրերը և պաշտոնական սահմանումները:Նման հանձնաժողովների շրջանակներում շարունակվում են ծրագրավորման լեզուների մշակումն ու արդիականացումը, քննարկվում են առկա և նոր լեզվական կոնստրուկցիաների ընդլայնման կամ օժանդակության հարցեր։

#### Այբուբենը

Ժամանակակից ծրագրավորման լեզուները նախատեսված են ASCII օգտագործման համար,այսինքն, ASCII- ի բոլոր գրաֆիկական նիշերի առկայությունը անհրաժեշտ և բավարար պայման է ցանկացած լեզվական կոնստրուկցիաներ գրելու համար:6-բիթ նիշերի ժամանակաշրջանում առաջացած վաղ լեզուները օգտագործում էին ավելի սահմանափակ շարք:Օրինակ ՝ Fortran այբուբենը ներառում է 49 նիշ (ներառյալ տարածություն).A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 = + - \* / (). , $ ' :

Հատկանշական բացառություն է APL լեզուն, որն օգտագործում է շատ հատուկ նիշ:ASCII- ից դուրս նիշերի օգտագործումը կախված է իրագործումից.երբեմն դրանք թույլատրվում են միայն մեկնաբանություններում և բնույթի / լարային հաստատություններում, իսկ երբեմն նույնականացուցիչներում:Լեզուները գոյություն ունեին ԽՍՀՄ-ում, որտեղ բոլոր հիմնաբառերը գրվում էին ռուսերեն տառերով, բայց դրանք մեծ ժողովրդականություն չէին վայելում:Օգտագործված խորհրդանիշների շարքի ընդլայնումը կաշկանդված է նրանով, որ ծրագրային ապահովման զարգացման շատ նախագծեր միջազգային են:Շատ դժվար կլինի աշխատել այնպիսի կոդով, որտեղ որոշ փոփոխականների անունները գրված են ռուսերեն տառերով, մյուսները ՝ արաբերենով, իսկ մյուսները ՝ չինական նիշերով:Այնուամենայնիվ, տեքստային տվյալների հետ աշխատելու համար նոր սերնդի ծրագրավորման լեզուները աջակցում են Unicode- ին։

### Ցածր և բարձր մակարդակի լեզուներ.

Սովորաբար, «լեզվի մակարդակը» նշանակում է.

* այն աստիճանի, որով լեզվի իմաստաբանությունը տարբերվում է թիրախային պրոցեսորային ճարտարապետության մեքենայական ծածկագրից. այլ կերպ ասած, այն փոքրագույն փոխակերպումները, որոնք ծրագրի կոդը պետք է ենթարկվեն նախքան դրա իրականացումը
* այն աստիճանը, որով լեզվի իմաստաբանությունը հաշվի է առնում մարդու մտածողության առանձնահատկությունները, այլ ոչ թե մեքենայական, այսինքն ՝ լեզվի մակարդակը «ավելի ցածր է», այնքան ավելի «մեքենային մոտ է», իսկ «ավելի բարձր» ՝ այն «ավելի մոտ է մարդուն»։

Ցածր մակարդակի լեզուները հիմնականում ներառում են մեքենայական լեզուներ,այսինքն ՝ լեզուները, որոնք իրականացվում են ուղղակիորեն ապարատային մակարդակի վրա.Դրանք պատկանում են ծրագրավորման լեզուների առաջին սերնդին։ Շատ չանցած ՝ հայտնվեցին երկրորդ սերնդի լեզուները ՝ այսպես կոչված, «հավաքագրական լեզուներ».Ամենապարզ դեպքում նրանք կատարում են mnemonics- ը մեքենայական լեզվով `հրամաններ և դրանց պարամետրեր գրելու համար,բացի այդ, հավաքույթների շատ լեզուներ ներառում են խիստ զարգացած մակրո լեզու:Առաջին և երկրորդ սերնդի լեզուները թույլ են տալիս ճշգրիտ կերպով վերահսկել, թե ինչպես է գործարկվելու պահանջվող գործառույթը այս պրոցեսորի վրա ՝ հաշվի առնելով դրա ճարտարապետության առանձնահատկություններըթ:Մի կողմից ՝ սա ապահովում է ծրագրերի մեծ արագություն և կոմպակտություն, բայց մյուս կողմից ՝ ծրագիրը մեկ այլ ապարատային հարթակ տեղափոխելու համար, այն պետք է վերամշակվի զրոյից:«Բարձր մակարդակի» լեզուներով ծրագրերը շատ ավելի հեշտ են փոփոխել և շատ հեշտությամբ փոխանցվել համակարգչից համակարգիչ։ Գործնականում առավել լայնորեն կիրառվում են երրորդ սերնդի լեզուները, որոնք միայն պնդում են, որ կոչվում են «բարձր մակարդակի», բայց միայն այն «բարձր մակարդակի» կոնստրուկցիաները, որոնք գտնում են միանշանակ համապատասխանություն ֆոն Նեյման մեքենայում։ Չորրորդ սերնդի լեզուներն ընդգրկում են ավելի բարձր կարգի լեզուներ,չորրորդ լեզուները երբեմն առանձնանում են որպես հինգերորդ սերնդի լեզուների կատեգորիա, բայց այն ընդհանուր առմամբ ընդունված չէ. Երկրորդ սերնդի «գերհամակարգ մակարդակի լեզու» տերմինը հաճախ օգտագործվում է բարձր կարգի լեզուներին վերաբերելու համար։ Սրանք լեզուներ են, որոնց իրականացումը պարունակում է էական ալգորիթմական բաղադրիչ.

Կարևոր կատեգորիա են տիրույթի հատուկ լեզուները:Լեզվի նշանակումը այս կատեգորիայի համար շատ պայմանական և հաճախ հակասական է. գործնականում այս տերմինը կարող է կիրառվել լեզուների երրորդ, չորրորդ և հինգերորդ սերունդների ներկայացուցիչների համար:Լեզուների առաջին երեք սերունդները կազմում են ծրագրավորման հրամայական պարադիգմը, իսկ հաջորդը `դեկլարատիվ:«Հրամայական» տերմինը նշանակում է «հրամանի կարգ», այսինքն ՝ ծրագրավորում մեքենայի քայլ առ քայլ հանձնարարականով կամ մանրամասն ցուցում այն մասին, թե ինչպես է ծրագրավորողն արդեն հորինել մեթոդ ՝ տեխնիկական բնութագրերի իրականացման համար:«Դեկլարատիվ» տերմինը նշանակում է «նկարագրություն», այսինքն `ծրագրավորում` տեխնիկական բնութագրերի ձևակերպում `ավտոմատ փոխակերպումների համար հարմար ձևով, լեզվի թարգմանչի համար ընտրության ազատությամբ:Ստիպողական լեզուները ուղղված են նկարագրելու, թե ինչպես հասնել արդյունքի, մինչդեռ ավելի բարձր մակարդակի լեզուները ուղղված են նկարագրել այն, ինչ պահանջվում է որպես արդյունք:Շատ դեպքերում, բարձր մակարդակի լեզուները առաջացնում են ավելի մեծ մեքենայի կոդ և կատարում են ավելի դանդաղ:Այնուամենայնիվ, ալգորիթմական և կառուցվածքային բարդ ծրագրերի համար բարձր մակարդակի որոշ լեզուներ կարող են զգալի առավելություն տալ արդյունավետության մեջ, երկրորդը `միայն ցածր և միջին մակարդակի, փոքր և պարզ ծրագրերում:Այլ կերպ ասած, լեզվի հնարավոր արդյունավետությունը փոխվում է `իր« մակարդակը »ոչ գծային և ընդհանուր առմամբ երկիմաստորեն բարձրացնելով:Հետևաբար, այսօր ցածր մակարդակի լեզուները օգտագործվում են միայն համակարգային ծրագրավորման առաջադրանքներում:Լայնորեն համարվում է, որ այն առաջադրանքներում, երբ ռեսուրսների ճշգրիտ վերահսկողություն է պահանջվում, լեզուն ինքնին պետք է հնարավորինս քիչ փոխակերպումներ կատարի, հակառակ դեպքում ծրագրավորողի բոլոր ջանքերն ապարդյուն կլինեն։

### Ապահով և անվտանգ լեզուներ

Ժամանակակից համակարգիչները ներկայացնում են բարդ աշխարհի իրական բարդությունները `որպես համակարգչային հիշողության թվեր,սա ներմուծում է մարդկային գործոնի ռիսկը ծրագրավորման կարգապահության մեջ, ներառյալ հիշողության հասանելիության սխալների հավանականությունը:Հետևաբար, ծրագրավորման շատ լեզուներ ուղեկցվում են երկուական տվյալների վրա գործողությունների նշանակությունը վերահսկելու միջոցներով, որոնք հիմնված են ուղեկցող տրամաբանական տեղեկատվության վրա-տիպային համակարգ:Լեզուների տիպի համակարգերը բաժանված են դինամիկ և ստատիկ, իսկ վերջիններս, իր հերթին, բաժանված են ոչ բազմիմֆորիկ և բազմամորֆային:Բացի այդ, դրանք բաժանվում են հստակ, այլ կերպ ասած, որոնք պահանջում են արտահայտված տիպի հայտարարագրեր ծրագրի օբյեկտների համար կամ դրանք ստատիկորեն բխելով ինքնուրույն:Ընդհանրապես, լեզուն անվանում են անվտանգ, եթե դրա վրա եղած ծրագրերը, որոնք կազմողը կարող է ընդունվել ինչպես ճիշտ կառուցված, դինամիկայում երբեք չի անցնում ընդունելի վարքի սահմաններից:Սա չի նշանակում, որ նման ծրագրերն ընդհանրապես չեն պարունակում սխալներ:«Ծրագրի լավ պահվածք» տերմինը նշանակում է, որ նույնիսկ եթե ծրագիրը պարունակում է որոշակի սխալ, այն այնուամենայնիվ, ի վիճակի չէ խախտել տվյալների ամբողջականությունը և խորտակել։

Սխալների վերահսկման աստիճանը և նրանց նկատմամբ լեզվի արձագանքը կարող են տարբեր լինել:Ամենապարզ տիպի համակարգերը արգելում են, օրինակ, տողն իջեցնել ամբողջ թվից:Այնուամենայնիվ, միլիմետրերը և դյույմները կարող են ներկայացվել որպես ամբողջ թվեր, բայց տրամաբանական սխալ կլիներ միլիմետրերից դյույմները հանելը:Առաջադեմ տիպի համակարգերը թույլ են տալիս նման տրամաբանական տեղեկությունները ներառել ծրագրի մեջ։

C լեզուներն ու նրա սերունդ C ++ -ը անվնաս են։ Նրանց համար նախատեսված ծրագրերում լայնորեն հանդիպում են տպագրության թուլացման և դրա ուղղակի խախտման իրավիճակները, ուստի հիշողության հասանելիության սխալները դրանցում վիճակագրական նորմ են:Նրանց համար ստատիկ վերլուծության ամենաուժեղ համակարգերը ի վիճակի են հայտնաբերել ոչ ավելի, քան 70 - 80% սխալներ, բայց դրանց օգտագործումը դրամական առումով շատ թանկ է:Այս լեզուներով ծրագրերի հուսալիության երաշխավորումը անհնար է, առանց դիմելու պաշտոնական ստուգմանը, ինչը ոչ միայն թանկ է, այլև պահանջում է հատուկ գիտելիքներ:Չորրորդ լեզուն չի պնդում, որ «անվտանգ է», բայց, այնուամենայնիվ, գործնականում գրեթե բացառվում է ծրագրերի առկայությունը, որոնք կարող են կոռումպացված տվյալներ, քանի որ ծրագիրը, որը պարունակում է հավանական վտանգավոր սխալի խափանում, իր առաջին փորձարկման ընթացքում վթարի է ենթարկում, ստիպելով շտկել կոդով աղբյուրը։

### Տվյալների տիպերը

Ժամանակակից թվային համակարգիչներն աշխատում են երկուական համակարգով և տվյալները պահպանում են երկնշան կոդերի մեջ։ Այդ տվյալները ցուցադրում են իրական աշխարհին պատկանող տեղեկություններ՝ անուններ, բանկային հաշիվներ, չափեր և այլն։  
Ծրագրավորման լեզուն օժտված է լինում «տիպերի համակարգով», որով կազմակերպվում են տվյալները։ Լեզուները լինում են «ստատիկ տիպականացումով» և «դինամիկ տիպականացումով», ինչպես նաև լինում են «տիպ չունեցող լեզուներ», որոնցից է, օրինակ՝ ծրագրավորման Forth լեզուն։

### Տվյալների կառուցվածքները

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

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

Ծրագրավորման լեզուների իմաստաբանությունը
----------------------------------------

Տարածված են ծրագրավորման լեզվի իմաստաբանությունը բնութագրող տարատեսակների երեք խումբ՝ օպերացիոն, դերիվացիոն (աքսիոմատիկ) և դենոտացիոն (մաթեմատիկական)։

* «օպերացիոն» մոտեցման շրջանակներում իմաստաբանությունը նկարագրելու ժամանակ սովորաբար ծրագրավորման լեզվի կառուցվածքների կատարումը մեկնաբանվում է ինչ-որ մի երևակայական ԷՀՄ-ի օգնությամբ։
* «դերիվացիոն» իմաստաբանությունը նկարագրում է տրամաբանության լեզվի ու նախա- և ետպայմաններ առաջադրելու օգնությամբ լեզվի կառուցվածքների կատարման հետևանքները։
* «դենոտացիոն» իմաստաբանությունը կատարում է այնպիսի պատկերացումներով գործողություններ, որոնք բնորոշ են մաթեմատիկային՝ բազմություններ, համապատասխանություններ, նաև՝ դատողություններ, պնդումներ և այլն։

### Առաջին և բարձր կարգի լեզուներ

#### Նախնական տեղեկություններ

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

#### Արտահայտչություն

Առաջին կարգի լեզուները թույլ են տալիս իրականացնել ալգորիթմներ որպես կոդ, բայց ոչ ծրագրային ճարտարապետություն։ Ըստ Ստրեյչիի, այս սահմանափակումն ալգոլյան լեզվով է ժառանգել դասական մաթեմատիկայից, որտեղ օգտագործվում են միայն մշտական գործողություններ և գործառույթներ, որոնք համատեքստից դուրս եզակի ճանաչելի են, և գործառույթներով կամայական աշխատանքի համար համակարգային նշում չկա:Առաջին կարգի լեզուներով ծրագրերի համար բաղադրիչների (պրոցեդուրաների, գործառույթների, օբյեկտների, գործընթացների և այլն) փոխգործակցության սխեմաները կարող են գոյություն ունենալ միայն պայմանական մակարդակի վրա, ինքնուրույն ծրագրերից դուրս:Ժամանակի ընթացքում հայտնաբերվեցին բազմակի կրկնվող նմանատիպ նախշեր, որոնց արդյունքում դրանց շուրջ կառուցվեց անկախ մեթոդաբանություն ՝ ձևավորման ձևեր:Արդյունքում ՝ որոշումներ, որոնք առաջին կարգի լեզուներով կարող են ներկայացվել ծրագրերի բեկորներով (երբեմն բավականին բարդ և ծանրաբեռնված), բարձր կարգի լեզուներով կարելի է կրճատել մեկ հրամանի կամ նույնիսկ ինքնուրույն լեզվական իմաստային տարրի օգտագործումը, որը չունի շարահյուս արտահայտություն:Օրինակ ՝ «Հրամանի» օրինակը, որը հաճախ օգտագործվում է առաջին կարգի լեզուներով, ուղղակիորեն համարժեք է առաջին կարգի գործառույթի գաղափարին:Նույնը վերաբերում է լեզուների ավելի բարձր շերտերին:Այնուամենայնիվ, տարբեր բնույթի որոշ լեզուներ նաև ապահովում են ավելի բարձրակարգ ծրագրավորման հնարավորություններ։

#### Ուսումնասիրություն

Ներկայացնելով «առաջին և երկրորդ կարգի սուբյեկտների» տերմինաբանությունը ՝ Ստրեյշին անմիջապես ուշադրություն հրավիրեց այն փաստի վրա, որ շատ մարդկանց հետ անձնական փորձից և քննարկումներից համոզվել է, որ անհավատալիորեն դժվար է դադարեցնել մտածելը գործառույթների մասին ՝ որպես երկրորդ կարգի օբյեկտներ,այսինքն ՝ լեզվի կարգը ունի արտահայտված հոգեբանական ազդեցություն:Բարձր մակարդակի լեզուների տիրապետումը կօգնի ծրագրավորողին մտածել ավելի բարձր մակարդակի աբստրակցիաների առումով:Ցածր մակարդակի լեզուները կարող են պարտադրել հակառակը, որի կապակցությամբ լայնորեն հայտնի է հետևյալ հայտարարությունը։

Գործնականորեն անհնար է սովորեցնել լավ ծրագրավորում այն ուսանողներին, ովքեր ունեն BASIC- ի փորձառություն. Որպես հավանական ծրագրավորողներ, նրանք հոգեկան աղավաղված են `առանց վերականգնման հույս ունենալու։

Սա նշանակում է, որ ավելի բարձր կարգի լեզվի օգտագործումն ինքնին չի նշանակում ճարտարապետության փոփոխություն և վերօգտագործման գործոնի ավելացում. Որոշիչ գործոնը որոշակի մշակողի ՝ համապատասխան ապուշների օգտագործման ունակությունն է:Հասկանալով բարձր մակարդակի կոնստրուկցիաների հնարավորություններն ու սահմանափակումները, դրանց իրականացման հիմնական սկզբունքները ոչ միայն ծրագրավորողին հնարավորություն են տալիս առավել արդյունավետ օգտագործել իր սովորած լեզուն, այլև թույլ է տալիս Ձեզ ստեղծել և օգտագործել նմանատիպ մեխանիզմներ զարգացման դեպքում `այնպիսի լեզվով, որտեղ դրանք չեն իրականացվում:Ավելի հեշտ կլինի ծրագրավորողի համար, ով գիտի ծրագրավորման լեզուների լայն տեսականի, ընտրել դրանց շարքում այն գործիքը, որն առավելագույնս հարմար է իր խնդիրը լուծելու համար, անհրաժեշտության դեպքում, ուսումնասիրել նոր լեզու կամ իրականացնել տիրույթի հատուկ լեզու, օրինակ, կարող է ներառել բավականին բարդ ծրագրի հրամանի տողի միջերեսը։

### Ծրագրավորման պարադիգմ

Լեզուներին պարադիգմներին վերագրելը կարող է իրականացվել մի քանի հիմքերով, որոնցից մի քանիսը համապատասխանում են լեզուների հատուկ տեխնիկական բնութագրերին, իսկ մյուսները շատ կամայական են:Տեխնիկապես, լեզուները բաժանվում են, օրինակ, կողմնակի էֆեկտների և կապի թափանցիկության:Երկրորդ դեպքում ասում են, որ լեզուն պատկանում է «զուտ ֆունկցիոնալ պարադիգմին»:Տիպային համակարգի որոշակի հատկություններ և լեզու հաշվարկելու ռազմավարություններ երբեմն համարվում են որպես պարադիգմ, օրինակ ՝ պարամետրային բազմամորֆ տիպային համակարգերի համար, նրանք հաճախ խոսում են ընդհանուր ծրագրավորման պարադիգմի իրականացման մասին:Մեկ այլ օրինակ `համասեռականության հատկությունն է, որը բացում է մետրոպոգրամանման սորտերի մի ամբողջ սպեկտր:Կան բազմաթիվ «լեզուներ, որոնք ժառանգվել են մաթեմատիկայից», որոնցից շատերը կազմում են եզակի պարադիգմներ:Ավելի պայմանականորեն լեզուները բաժանվում են սերունդների:Առաջին երկու սերունդը ցածր մակարդակի վրա է, այսինքն, կենտրոնացած են հատուկ ապարատների առանձնահատկությունների վրա, և սկզբունքորեն դրանք չեն համապատասխանում որևէ պարադիգմի:Երրորդ սերնդի հետ միասին նրանք ձևավորում են հրամայական ծրագրավորման պարադիգմ, իսկ հաջորդ սերունդները ՝ դեկլարատիվ:Շատ դեկլարատիվ լեզուներ ներառում են որոշակի հրամայական հնարավորություններ, երբեմն էլ հակառակը:Ծրագրերի չափի և բարդության բարձրացմամբ, երկրորդ սերնդի լեզուները օգտագործելիս սկսեց ձևավորվել ընթացակարգային ծրագրավորման պարադիգմը,պահանջելով մեծ ընթացակարգերի տարանջատում հիերարխիկորեն կապված փոքր ավելի փոքր շղթաների մեջ:Միևնույն ժամանակ, հայտնվեցին առաջին երրորդ սերնդի լեզուները, և կառուցվածքային ծրագրավորումն առաջին հերթին ձևավորվեց ՝ որպես ընթացակարգային, իսկ հետո ՝ մոդուլային ուղիղ զարգացում:Ժամանակի ընթացքում հայտնվեցին հսկայական թվով տարբեր եղանակներ ՝ լուծելու հիմնահարցը զարգացող ծրագրային համակարգերը ինտեգրելու սկզբնական հրամայական մոտեցումը:Որոշ դեպքերում ձեռք է բերվել էական ազդեցություն զարգացման արագության և որակի ցուցանիշների վրա, բայց ընդհանուր առմամբ, ինչպես նշվեց վերևում, երրորդ սերնդի լեզուները վերացական են մեքենայական տրամաբանությունից միայն որոշակի մակարդակի վրա և մի փոքր ենթակա են համարժեք վերափոխումների:Մինչ օրս լեզուների երրորդ սերունդը ներկայացված է բազմազան պարադիգմների առավել լայն շրջանակով:Ֆունկցիոնալ լեզուները վերաբերում են չորրորդ սերնդին, որից առանձնանում են «զուտ ֆունկցիոնալ», իսկ մնացածները կոչվում են «ոչ զուտ ֆունկցիոնալ»:Հինգերորդ սերունդը ներառում է տրամաբանական ծրագրավորման լեզուներ, որոնցում, բացի ավանդականից, առանձնանում են մի քանի հատուկ ձևեր, օրինակ ՝ ծրագրավորումն ըստ սահմանափակումների:Փաստորեն, հինգերորդ սերնդի լեզուները չորրորդ սերնդի լեզուներն են ՝ լրացված գիտելիքների բազայով, հետևաբար այս կատեգորիան, ինչպես արդեն նշվեց վերևում, ընդհանուր առմամբ ընդունված չէ:Բազմաթիվ պարադիգմներ պայմանականորեն հռչակված մեթոդներ են ՝ ծրագրի կառուցվածքը կազմակերպելու համար և կիրառելի են մեծ թվով լեզուների համար:Լայն ընդգրկումը կառուցվածքային և մոդուլային է. Դրանք օգտագործվում են ինչպես հրամայական, այնպես էլ դեկլարատիվ լեզուներով:Այլ պարադիգմները սերտորեն կապված են տեխնիկական հատկությունների հետ։ Օրինակ, C ++ լեզվի ենթաբազմությունը `կաղապարներ - կարող է պաշտոնապես համարվել որպես Turing- ի ամբողջական զուտ ֆունկցիոնալ լեզու, բայց C ++- ը չունի հատկություններ, որոնք բնորոշ են ֆունկցիոնալ լեզուներին:Արդյունքում, ֆունկցիոնալ լեզուների կազմման մեջ օգտագործված ալգորիթմները չեն կարող կիրառվել C ++- ի համար, ուստի ֆունկցիոնալ պարադիգմի առաջատար հետազոտողները շատ թերահավատորեն են վերաբերվում C ++- ին։

### Ծրագրավորման լեզուները փոքր և մեծ մասշտաբներով

Ծրագրերը կարող են լուծել տարբեր չափերի խնդիրներ,մի ծրագիր է ստեղծում ժամանակացույցը տվյալ գործառույթի համար, իսկ մյուսը ղեկավարում է խոշոր ձեռնարկության աշխատանքային հոսքը:Ծրագրավորման տարբեր լեզուներ նախատեսված են խնդրի տարբեր սկզբնական մասշտաբի համար և, որ ավելի կարևոր է, տարբեր կերպ են գործ ունենում ծրագրային համակարգերի աճող բարդության հետ:Լեզուի հիմնական որակը, որը որոշում է, թե ինչպես զարգանում է զարգացման բարդությունը, քանի որ համակարգը մեծանում է, աբստրակցիան է, այսինքն ՝ համակարգի բաղադրիչի իմաստը (պահվածքը) առանձնացնելու ունակությունը դրա իրականացման եղանակից:Սկզբնաղբյուրի համար որակական չափիչները, ինչպիսիք են ստուգելիությունը և փոփոխելիությունը, ակնհայտորեն որոշվում են վերօգտագործման գործոնով:Սա կարող է նշանակել միևնույն բաղադրիչի վրա տարբեր գործառույթներ կիրառելը, ինչպես նաև նույն գործառույթը տարբեր բաղադրիչներին կիրառելու ունակությունը:Պարամետրային բազմամորֆային (հատկապես արտանետվող) և դինամիկ տիպի համակարգերը զգալիորեն բարձրացնում են վերօգտագործման գործակիցը.Օրինակ, մի գործառույթ, որը հաշվարկում է զանգվածի երկարությունը, կկիրառվի զանգվածի տիպերի անսահման թվով:Բարձր կարգի լեզուները թույլ են տալիս տարբերակել գործառույթների փոխգործակցության սխեմաները բազմիցս կոչված կոդ բլոկի մեջ, և վերօգտագործումը հասնում է իր բարձրագույն արժեքների ՝ ավելի բարձր մակարդակի լեզու տեղափոխվելիս - անհրաժեշտության դեպքում, հատուկ մշակված այս առաջադրանքի համար - տվյալ դեպքում լեզուն վերաօգտագործվում է ոչ միայն մեկ ֆունկցիա, այլև զարգացումը:Լեզուն կարող է պահպանվել կազմողի բաղադրիչների ինտենսիվ վերաօգտագործմամբ:Լեզուների զարգացման հետ մեկտեղ հայտնվեցին հատուկ (բացառապես ծրագրավորման բնութագրիչ, որը նախկինում չի պահանջվում մաթեմատիկայում) բաղադրիչների և կախվածության կարգեր.մոնադներ, տիպի դասեր, պոլիմորֆային ճյուղեր, ասպեկտներ և այլն, դրանց օգտագործումը թույլ է տալիս ավելի մեծ ֆունկցիոնալություն արտահայտել նույն քանակի կոդով ՝ դրանով իսկ լայնածավալ ծրագրավորումը փոքր մասշտաբով թարգմանելով:Այլ հիմնական հիմնախնդիրները, որոնք կապված են խոշոր համակարգերի բարդության հետ, բխում են հենց ծրագրերից դուրս:Լեզվաբանական իմաստաբանության հատկություններից բացի, վերաօգտագործումը հնարավոր է հասնել համակարգչային համակարգի կամ բարդույթի մոդուլային կառուցվածքի միջոցով:Ավելին, անկախ նրանից, թե որքան ճկուն է լեզուն, աշխատելով հսկայական ծածկագրերով, հատկապես շատ մարդկանց, պահանջում է դրանց տարրալուծումը մոդուլների այս կամ այն ձևով:Մոդուլային կառուցվածքը ենթադրում է ոչ միայն ծրագրի մոնոլիտ աղբյուրի կոդը տրոհել շատ տեքստային ֆայլերի, այլև ավելի մեծ մասշտաբի վերացում, այսինքն ՝ ցանկացած տրամաբանորեն ամբողջական հատվածի համար ինտերֆեյսի սահմանում և թաքցնել դրա իրականացման մանրամասները:Կախված լեզվից կիրառվող շրջանակի կանոններից, լեզուն կարող է կամ չի կարող թույլ տալ ավտոմատ կախվածության հայտնաբերում:Եթե, ըստ կանոնների, հնարավոր է անվանման կոնֆլիկտ, ապա կախվածության ինքնագլխումն անհնար է, և այդ դեպքում մոդուլի վերնագրում դուք պետք է բացահայտորեն նշեք այն մոդուլների անունները, որոնց բաղադրիչները օգտագործվում են դրանում:Որոշ լեզուներ կենտրոնացած են բացառապես փոքր, կառուցվածքայինորեն պարզ ծրագրերի մշակման վրա:Դրանք չեն ապահովում ոչ մոդուլների մշակված համակարգ, ոչ էլ հատուկ բեկորների ճկունություն:C լեզուն ստեղծվեց որպես «բարձր մակարդակի հավաքույթ», որն ինքնին չի ենթադրում բարդությունների որոշակի շեմից վերև գտնվող համակարգերի զարգացում, հետևաբար, դրանում ներառված չէր նաև լայնածավալ ծրագրավորմանն աջակցելը:Բարձր և գերհզոր մակարդակի որոշ լեզուներ (Erlang, Smalltalk, Prolog) հասկացությունները տրամադրում են որպես հիմնական պարզունակ տարրեր, որոնք այլ լեզուներում, կարծես, կառուցողական և ալգորիթմիկ բարդ են (գործընթացներ, դասեր, գիտելիքների հիմքեր) - նման են մի շարք մաթեմատիկական հաշվարկների:Հետևաբար, նման լեզուները հաճախ դիտարկվում են որպես առարկայական:Այնուամենայնիվ, այս լեզուներում այլ ասպեկտների ֆունկցիոնալության ընդլայնումը կարող է դժվար լինել:Ժամանակի ընթացքում կառուցվել են տարբերակներ ՝ դրանք միասին միավորելու համար:Շատ այլ լեզուներ պարունակում են նաև մոդուլային համակարգեր, բայց դրանց մեծ մասը առաջին կարգի մոդուլի լեզուներ են:Lisp- ի և չորրորդ լեզուները թույլ են տալիս ձեզ ստեղծել կամայականորեն և անսահմանափակ համակարգեր, ներառյալ թույլ տալով, որ դուք ինքներդ ձեր մեջ ստեղծեք ներկառուցված առարկայի հատուկ լեզուներ, հետևաբար դրանք հաճախ կոչվում են մետաղալեզու:Այսօր բարդության հիմնախնդրի լուծման ամենատարածված մոտեցումը օբյեկտիվ ուղղվածություն ունեցող ծրագրավորումն է, չնայած դրա կիրառման հաջողությունն իր գոյության տասնամյակների ընթացքում մի քանի անգամ ենթարկվել է թերահավատության, և դեռևս չկա հուսալի ապացույց, որ այն բերում է օգուտներ `համեմատած այլ մոտեցումների հետ:Այն ուղեկցվում է բաղադրիչների միջև կախվածությունը կարգավորելու տարբեր տեխնոլոգիաներով ՝ մետաքսազերծում, պայմանագրեր, նախատիպեր, կեղտազերծում, տեսակներ և այլն:Metaprogramming- ի տարբեր ձևերի, այսինքն ՝ զարգացման գործընթացի ավտոմատացումը տարբեր մակարդակներով օգտագործումը պատմականորեն համարվել է առավել հզոր մոտեցում:Սկզբունքորեն տարբերվող մետրոպոգրաֆիկացումը լեզվից դուրս և ինքնին մատչելի լեզվով:Առաջին կարգի լեզուներ օգտագործելիս ՝ աճող ծրագրային համակարգերի բարդությունը արագորեն գերազանցում է մարդու կողմից տեղեկատվության ընկալման և մշակման ունակության շեմը, հետևաբար, նախնական տեսողական ձևավորման արտաքին միջոցներն օգտագործվում են բարդ սխեմաները պարզեցված ձևով և իջեցված մասշտաբով դիտելու համար, այնուհետև ինքնաբերաբար առաջացնում են ծածկագրի շրջանակ:Բարձր կարգի լեզուներ օգտագործող մշակողների համայնքներում գերակշռում է ճիշտ հակառակ մոտեցումը `կանխել բարդության հնարավորությունը վերահսկողությունից դուրս գալը` տեղեկատվական մոդելները անկախ բաղադրիչներին բաժանելով և միջոցներ մշակելով որոշ մոդելներ մյուսներին ինքնաբերաբար վերածելու համար։

### Ֆորմալ փոխակերպում և օպտիմիզացում

ցանկացած ֆորմալացված լեզվի առավելությունները որոշվում են ոչ միայն այն բանի կողմից, թե որքանով է դա հարմար անձի կողմից ուղղակի օգտագործման համար, այլ նաև այն աստիճանի, թե որքանով են այս լեզվով տեքստերը պարտադրում իրենց ձևական վերափոխումները:Օրինակ, տեղեկատուի թափանցիկությունը նշանակում է, որ զանգից առաջ գործառույթների պարամետրերը չեն պահանջվում գնահատել, փոխարենը, իրականում փոխանցված արտահայտությունը կարող է ամբողջությամբ փոխարինվել գործառույթի փոփոխականին, և գործառույթի պահվածքը չի փոխվի:Սա բացում է գրեթե կամայական ավտոմատ ծրագրի փոխարկումների հնարավորությունը:Հնարավոր է վերացնել տվյալների անհարկի միջանկյալ ներկայացուցչությունները, հաշվարկների բարդ շղթաները կարող են կրճատվել, կարող են ընտրվել զուգահեռ գործընթացների օպտիմալ քանակը, հնարավոր է մտցնել հուշագրումը և այլն:Մյուս կողմից, սա նշանակում է կողմնակի էֆեկտների լիակատար բացակայություն, և սա ստիպում է որոշ ալգորիթմների իրականացումն ակնհայտորեն ավելի քիչ արդյունավետ, քան փոխադարձ վիճակը օգտագործելիս:Փոքր և պարզ ծրագրերի համար բարձր մակարդակի լեզուները առաջացնում են ավելի մեծ մեքենայի կոդ և կատարում են ավելի դանդաղ:Այնուամենայնիվ, ալգորիթմական և կառուցվածքային բարդ ծրագրերի համար առավելությունը կարող է լինել որոշ բարձր մակարդակի լեզուների կողքին, քանի որ մարդը ֆիզիկապես ի վիճակի չէ արտահայտելու բարդ հասկացություններ ՝ հաշվի առնելով դրանց արդյունավետ կատարումը մեքենայական լեզվով։

Կան բազմաթիվ առանձնահատուկ պատճառներ, թե ինչու է ավտոմատ օպտիմալացումը բարձր մակարդակի լեզուների թարգմանության ընթացքում, սկզբունքորեն, ավելի մեծ կատարման արագություն է տալիս, քան ցածր մակարդակի լեզուներով իրականացման մեթոդի գիտակցված հսկողություն:Օրինակ, առկա են հուսալի ապացույցներ այն մասին, որ հիշողության ավտոմատ կառավարումը ավելի արդյունավետ է, քան ձեռնարկը, միայն դինամիկ մեթոդը օգտագործելիս կա, և կա հավանականորեն ավելի արդյունավետ ստատիկ մեթոդ:Բացի այդ, յուրաքանչյուր միկրոհամակարգի համար անհրաժեշտ է բաժանել գրանցամատյանները ՝ հաշվի առնելով հիշողությունը հասանելիության նվազագույնի հասցնելու համար, և դա պահանջում է լուծել գծապատկերի գունավորման խնդիրը:Մեքենայական տրամաբանության այդպիսի շատ առանձնահատկություններ կան, ուստի տեղեկատվության ընդհանուր բարդությունը յուրաքանչյուր «աստիճանաբար» գնալով աճում է, և բարձր մակարդակի լեզու կազմելը կարող է ներառել տասնյակ նման քայլեր:Կան բազմաթիվ ավտոմատ օպտիմիզացման ռազմավարություններ:Ոմանք համընդհանուր են, մյուսները կարող են կիրառվել միայն որոշակի բնույթի լեզուների վրա, իսկ ոմանք էլ կախված են լեզուն գործածելու եղանակից:Սխեմաների լեզվի ստանդարտը պահանջում է յուրաքանչյուր գործողություն `դա երաշխավորելու համար:Բազմաթիվ ֆունկցիոնալ լեզուների համար այն սկզբունքորեն կիրառելի է, բայց դա անում են միայն օպտիմալացնող բաղադրիչները։ C կամ C ++ նման լեզուներով, դա կարող է իրականացվել միայն որոշակի դեպքերում և միայն գլոբալ հսկողության հոսքի վերլուծություն օգտագործելիս:Բարձր կարգի լեզուները շատ դեպքերում ստիպված են լինում ավելի դանդաղ գործադրել, քան առաջին կարգի լեզուները:Պատճառները կայանում են ինչպես գծային կոդը շղթայի մեջ, այնպես էլ գործառույթների և տվյալների ցածր մակարդակի ներկայացման արդյունքում:Այնուամենայնիվ, կան ծրագրերի ագրեսիվ օպտիմիզացման տեխնիկա, որոնք թույլ են տալիս նվազեցնել բարձրակարգ լեզուները առաջին կարգի լեզուներին։

### Լեզուների հանրաճանաչությունը

Դժվար է որոշել, թե որ ծրագրավորման լեզուն է ամենատարածվածը, քանի որ «հանրաճանաչություն» բառի իմաստը կախված է ենթատեքստից:Մեկ լեզու կարող է տևել առավելագույնը մարդկային ժամեր, մյուսը ՝ ամենամեծ թվով կոդերի տողեր, երրորդը ՝ առավելագույն պրոցեսորային ժամանակ, իսկ չորրորդը ՝ առավել հաճախ, ծառայում է որպես հետազոտական հիմք ակադեմիայում:Որոշ լեզուներ շատ տարածված են հատուկ առաջադրանքների համար։

Այլ լեզուներ պարբերաբար օգտագործվում են լայն կիրառական ծրագրերի ստեղծման համար։

Լեզուների ժողովրդականությունը չափելու համար կան տարբեր չափումներ, որոնցից յուրաքանչյուրը մշակվում է հանրաճանաչության հայեցակարգի որոշակի նշանակության հակումով։

* հաշվել լեզուն հիշատակող թափուր աշխատատեղերի քանակը.
* վաճառված գրքերի քանակը (դասագրքեր կամ տեղեկատու գրքեր).
* լեզվով գրված կոդերի տողերի քանակի գինը (որը հաշվի չի առնում լեզուների օգտագործման հազվադեպ հրապարակված դեպքերը).
* հաշվում են լեզվային տեղեկանքները որոնիչի հարցումներում։

Հարկ է նշել, որ այս ցուցանիշների վրա բարձր գնահատականները ոչ միայն չեն նշում լեզուն բարձր տեխնիկական մակարդակ և / կամ ծախսերի օպտիմիզացում այն օգտագործելիս, այլ, ընդհակառակը, երբեմն նրանք կարող են այլ կերպ ասել:Արդյունքում, կարճաժամկետ հեռանկարում «Քոբոլ» -ին աջակցող ծրագրերը շատ ավելի թանկ են, քան ժամանակակից լեզուների մեծ մասի ծրագրերը, բայց դրանք զրոյից վերաշարադրելը կպահանջի նշանակալից միանգամյա ներդրումներ, և դրանք կարելի է համեմատել միայն երկարաժամկետ ծախսերի հետ:Կոբոլի տեխնիկական անկատարությունը պայմանավորված է նրանով, որ այն մշակվել է առանց համակարգչային գիտության ոլորտում փորձագետների ներգրավման:.

Տես նաև
-------

* Ծրագրավորման լեզուների ցանկ

Ծանոթագրություն
---------------

1. ↑  ISO/IEC/IEEE 24765:2010 Systems and software engineering — Vocabulary
2. ↑  ISO/IEC 2382-1:1993, Information technology — Vocabulary — Part 1: Fundamental terms
3. ↑  «Ծրագրավորման լեզուների ցանկը» (անգլերեն). Արխիվացված է օրիգինալից 2011 թ․ օգոստոսի 21-ին.
4. ↑  François Labelle. «Programming Language Usage Graph». *SourceForge*. Արխիվացված է օրիգինալից 2006 թ․ հունիսի 17-ին. Վերցված է 2006 թ․ հունիսի 21-ին.
5. ↑  Paulson, Lawrence C. (1996). *ML for the Working Programmer*. Cambridge, Great Britain: Cambridge University Press. էջ 492. ISBN ISBN 0-521-57050-6. `{{cite book}}`: Check `|isbn=` value: invalid character (օգնություն)
6. ↑  Mitchell, John (2004). *Concepts in Programming Languages*. Cambridge University Press. ISBN ISBN 0-511-04091-1 (eBook in netLibrary). `{{cite book}}`: Check `|isbn=` value: invalid character (օգնություն)
7. ↑  Reynolds. John C (1998). *Theories of programming languages*. Cambridge University Press. ISBN ISBN 978-0-521-59414-1 (hardback), 978-0-521-10697-9 (paperback).. `{{cite book}}`: Check `|isbn=` value: invalid character (օգնություն)
8. ↑  Mernik, Marjan (2012). *Formal and Practical Aspects of Domain-Specific Languages*. IGI Global. ISBN ISBN 978-1-4666-2092-6.. `{{cite book}}`: Check `|isbn=` value: invalid character (օգնություն)
9. ↑  *Richard L. Conner* Cobol, your age is showing(անգլ.) // *Computerworld* : magazine. — International Data Group, 1984. — Т. 18. — № 20. — С. ID/7—ID/18. — ISSN 0010-4841.
10. ↑  Robert L. Mitchell (2006 թ․ հոկտեմբերի 4). «Cobol: Not Dead Yet». *Computerworld*. Վերցված է 2014 թ․ ապրիլի 27-ին.

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

* 8512 ծրագրավորման լեզուներից բաղկացած ցանկ Արխիվացված 2011-02-20 Wayback Machine(անգլ.) (+ դրանց տոհմածառը)
* The Language ListԱրխիվացված 2011-09-02 Wayback Machine(անգլ.) - ավելի քան 2500 լեզուների համառոտ բնութագրություններ
* Computer Languages History(անգլ.) - ծրագրավորման լեզուների պատմությունը (1954-ից մինչև 2004-ի մայիս) (ներառում է հաճախակի թարմացվող դիագրամմա)
* Examples Արխիվացված 2004-04-04 Wayback Machine (անգլ.) - ծրագրավորման օրինակներ 162 լեզուներով
* Programming Language Popularity Արխիվացված 2008-07-23 Wayback Machine(անգլ.) - ծրագրավորման լեզուների հանրահայտության ուսումնասիրությունները 2004-ի համար։
* 10 языков программирования, которые стоит изучать Արխիվացված 2011-11-09 Wayback Machine(ռուս.) ― 10 ծրագրավորման լեզուներ, որոնք արժե ուսումնասիրել, 2006 թ․
* Programming Community Index Արխիվացված 2007-11-29 Wayback Machine(անգլ.) - ծրագրավորման լեզուների հանրահայտության հաճախակի թարմացվող վարկանիշ
* Computer Language Shootout Benchmarks Արխիվացված 2018-05-29 Wayback Machine(անգլ.) - ծրագրավորման լեզուների արդյունավետության համեմատումը
* Прогопедия Արխիվացված 2010-11-19 Wayback Machine(ռուս.) - ծրագրավորման լեզուների հանրագիտարան

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * դ
* ք
* խ
Հիմնական ծրագրավորման լեզուները (համեմատումը  • IDE  • պատմությունը  • ժամանակագրութունը) |
| --- |
|  |
| Օգտագործվողլեզուները | 
Ada •
APL •
Ասեմբլեր •
ActionScript •
ABAP/4 •
AutoIt •
AWK •
Basic •
C •
Կոբոլ •
C++ •
C# •
Cω •
Clarion •
Clojure •
ColdFusion •
Common Lisp •
D •
dBase •
Delphi •
Eiffel •
Erlang •
Euphoria •
F# •
Fort •
Fortran •
Gambas •
Go •
Groovy •
HAL/S •
Haskell •
Icon •
Ջավա •
ՋավաՍկրիպտ •
Limbo •
Lua •
Mudula-3 •
Object Pascal •
Objective-C •
OCaml •
Oz •
Parser •
Pascal •
Perl •
PHP •
PowerBASIC •
Python •
PL/1 •
Prolog •
R •
Ruby •
Scala •
Scheme •
Smalltalk •
SQL •
Standard ML •
PL/SQL •
Tcl •
Vala •
Visual Basic
(.NET)
 |
|  |
| Ուսումնական | 
Agda •
Clean •
Curry •
Լոգո •
ML •
REFAL •
Simula •
Օբերոն
 |
|  |
| IEC 61131-3 | 
Instruction List •
ST •
FBD •
Ladder Diagram (LD) •
SFC
 |
|  |
| Այլ | 
Modula-2 •
Miranda •
Hope •
Rexx
 |
|  |
| Էզոտերիկ | 
HQ9+/HQ9++ •
INTERCAL •
Brainfuck •
Brainfork •
Befunge •
Malbolge •
Piet •
Spoon •
Unlambda •
Whitespace •
FALSE •
LOLCODE
 |
|  |
| Վիզուալ | 
G
(LabVIEW) •
Microsoft VPL •
Sikuli •
VisSim •
Scratch
 |

 |

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * դ
* ք
* խ
Լեզվաբանություն |
| --- |
|  |
| Ընդհանուր տեղեկություններ | Լեզու  · Նշանների լեզու  · Արհեստական լեզու  · Ծրագրավորման լեզու  · Մեռած լեզու |
|  |
| Տեսական տեղեկություններ | Լեզուների դասակարգում  · Լեզվաընտանիք  · Լեզվախումբ  · Լեզվաճյուղ  · Լեզվի մակարդակներ |
|  |
| Լեզվաբանական տեղեկություններ | Լեզվաբանություն Լեզվաբանական աշխարհագրություն  · Լեզվաբանական վիճակագրություն  · Լեզվաբանական հնեաբանություն   · Լեզվաբանական դպրոցներ  · Լեզվաբանական ուղղություններ  · Լեզուների ցեղակցություն  · Լեզուների խաչավորում |
|  |
| Լեզուների ցանկեր | Աշխարհի լեզուներ  · Արհեստական լեզուների ցանկ  · Ծրագրավորման լեզուների ցանկ  · Լեզվաընտանիքների ցանկ  · Նշանային լեզուների ցանկ  · Միջազգային լեզուների ցանկ  · Պետականորեն ընդունված լեզուների ցանկ |

 |

|  |
| --- |
| *Այս հոդվածի կամ նրա բաժնի որոշակի հատվածի սկզբնական կամ ներկայիս տարբերակը վերցված է Քրիեյթիվ Քոմմոնս Նշում–Համանման տարածում 3.0 (Creative Commons BY-SA 3.0) ազատ թույլատրագրով թողարկված Հայկական սովետական հանրագիտարանից  (հ․ 5, էջ 144)։*  |