Ցածր և բարձր մակարդակի լեզուներ.
Սովորաբար, «լեզվի մակարդակը» նշանակում է.
- այն աստիճանի, որով լեզվի իմաստաբանությունը տարբերվում է թիրախային պրոցեսորային ճարտարապետության մեքենայական ծածկագրից. այլ կերպ ասած, այն փոքրագույն փոխակերպումները, որոնք ծրագրի կոդը պետք է ենթարկվեն նախքան դրա իրականացումը
- այն աստիճանը, որով լեզվի իմաստաբանությունը հաշվի է առնում մարդու մտածողության առանձնահատկությունները, այլ ոչ թե մեքենայական, այսինքն ՝ լեզվի մակարդակը «ավելի ցածր է», այնքան ավելի «մեքենային մոտ է», իսկ «ավելի բարձր» ՝ այն «ավելի մոտ է մարդուն»։
Ցածր մակարդակի լեզուները հիմնականում ներառում են մեքենայական լեզուներ,այսինքն ՝ լեզուները, որոնք իրականացվում են ուղղակիորեն ապարատային մակարդակի վրա.Դրանք պատկանում են ծրագրավորման լեզուների առաջին սերնդին։ Շատ չանցած ՝ հայտնվեցին երկրորդ սերնդի լեզուները ՝ այսպես կոչված, «հավաքագրական լեզուներ».Ամենապարզ դեպքում նրանք կատարում են mnemonics- ը մեքենայական լեզվով `հրամաններ և դրանց պարամետրեր գրելու համար,բացի այդ, հավաքույթների շատ լեզուներ ներառում են խիստ զարգացած մակրո լեզու:Առաջին և երկրորդ սերնդի լեզուները թույլ են տալիս ճշգրիտ կերպով վերահսկել, թե ինչպես է գործարկվելու պահանջվող գործառույթը այս պրոցեսորի վրա ՝ հաշվի առնելով դրա ճարտարապետության առանձնահատկություններըթ:Մի կողմից ՝ սա ապահովում է ծրագրերի մեծ արագություն և կոմպակտություն, բայց մյուս կողմից ՝ ծրագիրը մեկ այլ ապարատային հարթակ տեղափոխելու համար, այն պետք է վերամշակվի զրոյից:«Բարձր մակարդակի» լեզուներով ծրագրերը շատ ավելի հեշտ են փոփոխել և շատ հեշտությամբ փոխանցվել համակարգչից համակարգիչ։ Գործնականում առավել լայնորեն կիրառվում են երրորդ սերնդի լեզուները, որոնք միայն պնդում են, որ կոչվում են «բարձր մակարդակի», բայց միայն այն «բարձր մակարդակի» կոնստրուկցիաները, որոնք գտնում են միանշանակ համապատասխանություն ֆոն Նեյման[5] մեքենայում։ Չորրորդ սերնդի լեզուներն ընդգրկում են ավելի բարձր կարգի լեզուներ,չորրորդ լեզուները երբեմն առանձնանում են որպես հինգերորդ սերնդի լեզուների կատեգորիա, բայց այն ընդհանուր առմամբ ընդունված չէ. Երկրորդ սերնդի «գերհամակարգ մակարդակի լեզու» տերմինը հաճախ օգտագործվում է բարձր կարգի լեզուներին վերաբերելու համար։ Սրանք լեզուներ են, որոնց իրականացումը պարունակում է էական ալգորիթմական բաղադրիչ.
Կարևոր կատեգորիա են տիրույթի հատուկ լեզուները:Լեզվի նշանակումը այս կատեգորիայի համար շատ պայմանական և հաճախ հակասական է. գործնականում այս տերմինը կարող է կիրառվել լեզուների երրորդ, չորրորդ և հինգերորդ սերունդների ներկայացուցիչների համար:Լեզուների առաջին երեք սերունդները կազմում են ծրագրավորման հրամայական պարադիգմը, իսկ հաջորդը `դեկլարատիվ:«Հրամայական» տերմինը նշանակում է «հրամանի կարգ», այսինքն ՝ ծրագրավորում մեքենայի քայլ առ քայլ հանձնարարականով կամ մանրամասն ցուցում այն մասին, թե ինչպես է ծրագրավորողն արդեն հորինել մեթոդ ՝ տեխնիկական բնութագրերի իրականացման համար:«Դեկլարատիվ» տերմինը նշանակում է «նկարագրություն», այսինքն `ծրագրավորում` տեխնիկական բնութագրերի ձևակերպում `ավտոմատ փոխակերպումների համար հարմար ձևով, լեզվի թարգմանչի համար ընտրության ազատությամբ:Ստիպողական լեզուները ուղղված են նկարագրելու, թե ինչպես հասնել արդյունքի, մինչդեռ ավելի բարձր մակարդակի լեզուները ուղղված են նկարագրել այն, ինչ պահանջվում է որպես արդյունք:Շատ դեպքերում, բարձր մակարդակի լեզուները առաջացնում են ավելի մեծ մեքենայի կոդ և կատարում են ավելի դանդաղ:Այնուամենայնիվ, ալգորիթմական և կառուցվածքային բարդ ծրագրերի համար բարձր մակարդակի որոշ լեզուներ կարող են զգալի առավելություն տալ արդյունավետության մեջ, երկրորդը `միայն ցածր և միջին մակարդակի, փոքր և պարզ ծրագրերում:Այլ կերպ ասած, լեզվի հնարավոր արդյունավետությունը փոխվում է `իր« մակարդակը »ոչ գծային և ընդհանուր առմամբ երկիմաստորեն բարձրացնելով:Հետևաբար, այսօր ցածր մակարդակի լեզուները օգտագործվում են միայն համակարգային ծրագրավորման առաջադրանքներում:Լայնորեն համարվում է, որ այն առաջադրանքներում, երբ ռեսուրսների ճշգրիտ վերահսկողություն է պահանջվում, լեզուն ինքնին պետք է հնարավորինս քիչ փոխակերպումներ կատարի, հակառակ դեպքում ծրագրավորողի բոլոր ջանքերն ապարդյուն կլինեն։
Ապահով և անվտանգ լեզուներ
Ժամանակակից համակարգիչները ներկայացնում են բարդ աշխարհի իրական բարդությունները `որպես համակարգչային հիշողության թվեր,սա ներմուծում է մարդկային գործոնի ռիսկը ծրագրավորման կարգապահության մեջ, ներառյալ հիշողության հասանելիության սխալների հավանականությունը:Հետևաբար, ծրագրավորման շատ լեզուներ ուղեկցվում են երկուական տվյալների վրա գործողությունների նշանակությունը վերահսկելու միջոցներով, որոնք հիմնված են ուղեկցող տրամաբանական տեղեկատվության վրա-տիպային համակարգ:Լեզուների տիպի համակարգերը բաժանված են դինամիկ և ստատիկ, իսկ վերջիններս, իր հերթին, բաժանված են ոչ բազմիմֆորիկ և բազմամորֆային:Բացի այդ, դրանք բաժանվում են հստակ, այլ կերպ ասած, որոնք պահանջում են արտահայտված տիպի հայտարարագրեր ծրագրի օբյեկտների համար կամ դրանք ստատիկորեն բխելով ինքնուրույն:Ընդհանրապես, լեզուն անվանում են անվտանգ, եթե դրա վրա եղած ծրագրերը, որոնք կազմողը կարող է ընդունվել ինչպես ճիշտ կառուցված, դինամիկայում երբեք չի անցնում ընդունելի վարքի սահմաններից:Սա չի նշանակում, որ նման ծրագրերն ընդհանրապես չեն պարունակում սխալներ:«Ծրագրի լավ պահվածք» տերմինը նշանակում է, որ նույնիսկ եթե ծրագիրը պարունակում է որոշակի սխալ, այն այնուամենայնիվ, ի վիճակի չէ խախտել տվյալների ամբողջականությունը և խորտակել։
Սխալների վերահսկման աստիճանը և նրանց նկատմամբ լեզվի արձագանքը կարող են տարբեր լինել:Ամենապարզ տիպի համակարգերը արգելում են, օրինակ, տողն իջեցնել ամբողջ թվից:Այնուամենայնիվ, միլիմետրերը և դյույմները կարող են ներկայացվել որպես ամբողջ թվեր, բայց տրամաբանական սխալ կլիներ միլիմետրերից դյույմները հանելը:Առաջադեմ տիպի համակարգերը թույլ են տալիս նման տրամաբանական տեղեկությունները ներառել ծրագրի մեջ։
C լեզուներն ու նրա սերունդ C ++ -ը անվնաս են[6]։ Նրանց համար նախատեսված ծրագրերում լայնորեն հանդիպում են տպագրության թուլացման և դրա ուղղակի խախտման իրավիճակները, ուստի հիշողության հասանելիության սխալները դրանցում վիճակագրական նորմ են:Նրանց համար ստատիկ վերլուծության ամենաուժեղ համակարգերը ի վիճակի են հայտնաբերել ոչ ավելի, քան 70 - 80% սխալներ, բայց դրանց օգտագործումը դրամական առումով շատ թանկ է:Այս լեզուներով ծրագրերի հուսալիության երաշխավորումը անհնար է, առանց դիմելու պաշտոնական ստուգմանը, ինչը ոչ միայն թանկ է, այլև պահանջում է հատուկ գիտելիքներ:Չորրորդ լեզուն չի պնդում, որ «անվտանգ է», բայց, այնուամենայնիվ, գործնականում գրեթե բացառվում է ծրագրերի առկայությունը, որոնք կարող են կոռումպացված տվյալներ, քանի որ ծրագիրը, որը պարունակում է հավանական վտանգավոր սխալի խափանում, իր առաջին փորձարկման ընթացքում վթարի է ենթարկում, ստիպելով շտկել կոդով աղբյուրը։
Ծրագրավորման լեզուների իմաստաբանությունը
Տարածված են ծրագրավորման լեզվի իմաստաբանությունը բնութագրող տարատեսակների երեք խումբ՝ օպերացիոն, դերիվացիոն (աքսիոմատիկ) և դենոտացիոն (մաթեմատիկական)։
- «օպերացիոն» մոտեցման շրջանակներում իմաստաբանությունը նկարագրելու ժամանակ սովորաբար ծրագրավորման լեզվի կառուցվածքների կատարումը մեկնաբանվում է ինչ-որ մի երևակայական ԷՀՄ-ի օգնությամբ։
- «դերիվացիոն» իմաստաբանությունը նկարագրում է տրամաբանության լեզվի ու նախա- և ետպայմաններ առաջադրելու օգնությամբ լեզվի կառուցվածքների կատարման հետևանքները։
- «դենոտացիոն» իմաստաբանությունը կատարում է այնպիսի պատկերացումներով գործողություններ, որոնք բնորոշ են մաթեմատիկային՝ բազմություններ, համապատասխանություններ, նաև՝ դատողություններ, պնդումներ և այլն։
Առաջին և բարձր կարգի լեզուներ
Նախնական տեղեկություններ
Այս տերմինաբանությունը(առաջին և բարձր կարգի լեզուներ), բնականաբար, ժառանգվում է համակարգչային գիտության կողմից ՝ ձևավորելով համապատասխան իմաստաբանություն ՝ առաջին և ավելի բարձր կարգի:Առաջին կարգի լեզուները թույլ են տալիս սահմանել միայն առաջին կարգի հարաբերությունները քանակների միջև:Բարձր կարգի լեզուները թույլ են տալիս սահմանել կախվածությունը կախվածության միջև:Ավելին, շատ դեպքերում նրանք ասում են, որ նման լեզուն կախվածությունը (գործառույթները) համարում է առաջին դասի օբյեկտներ, այլ կերպ ասած, ընդունում է առաջին կարգի գործառույթները:Բարձր կարգի լեզուները պարունակում են գրեթե բոլոր ֆունկցիոնալ լեզուները։
Արտահայտչություն
Առաջին կարգի լեզուները թույլ են տալիս իրականացնել ալգորիթմներ որպես կոդ, բայց ոչ ծրագրային ճարտարապետություն[7]։ Ըստ Ստրեյչիի, այս սահմանափակումն ալգոլյան լեզվով է ժառանգել դասական մաթեմատիկայից, որտեղ օգտագործվում են միայն մշտական գործողություններ և գործառույթներ, որոնք համատեքստից դուրս եզակի ճանաչելի են, և գործառույթներով կամայական աշխատանքի համար համակարգային նշում չկա:Առաջին կարգի լեզուներով ծրագրերի համար բաղադրիչների (պրոցեդուրաների, գործառույթների, օբյեկտների, գործընթացների և այլն) փոխգործակցության սխեմաները կարող են գոյություն ունենալ միայն պայմանական մակարդակի վրա, ինքնուրույն ծրագրերից դուրս:Ժամանակի ընթացքում հայտնաբերվեցին բազմակի կրկնվող նմանատիպ նախշեր, որոնց արդյունքում դրանց շուրջ կառուցվեց անկախ մեթոդաբանություն ՝ ձևավորման ձևեր:Արդյունքում ՝ որոշումներ, որոնք առաջին կարգի լեզուներով կարող են ներկայացվել ծրագրերի բեկորներով (երբեմն բավականին բարդ և ծանրաբեռնված), բարձր կարգի լեզուներով կարելի է կրճատել մեկ հրամանի կամ նույնիսկ ինքնուրույն լեզվական իմաստային տարրի օգտագործումը, որը չունի շարահյուս արտահայտություն:Օրինակ ՝ «Հրամանի» օրինակը, որը հաճախ օգտագործվում է առաջին կարգի լեզուներով, ուղղակիորեն համարժեք է առաջին կարգի գործառույթի գաղափարին:Նույնը վերաբերում է լեզուների ավելի բարձր շերտերին:Այնուամենայնիվ, տարբեր բնույթի որոշ լեզուներ նաև ապահովում են ավելի բարձրակարգ ծրագրավորման հնարավորություններ։
Ուսումնասիրություն
Ներկայացնելով «առաջին և երկրորդ կարգի սուբյեկտների» տերմինաբանությունը ՝ Ստրեյշին անմիջապես ուշադրություն հրավիրեց այն փաստի վրա, որ շատ մարդկանց հետ անձնական փորձից և քննարկումներից համոզվել է, որ անհավատալիորեն դժվար է դադարեցնել մտածելը գործառույթների մասին ՝ որպես երկրորդ կարգի օբյեկտներ,այսինքն ՝ լեզվի կարգը ունի արտահայտված հոգեբանական ազդեցություն:Բարձր մակարդակի լեզուների տիրապետումը կօգնի ծրագրավորողին մտածել ավելի բարձր մակարդակի աբստրակցիաների առումով:Ցածր մակարդակի լեզուները կարող են պարտադրել հակառակը, որի կապակցությամբ լայնորեն հայտնի է հետևյալ հայտարարությունը։
Գործնականորեն անհնար է սովորեցնել լավ ծրագրավորում այն ուսանողներին, ովքեր ունեն BASIC- ի փորձառություն. Որպես հավանական ծրագրավորողներ, նրանք հոգեկան աղավաղված են `առանց վերականգնման հույս ունենալու։
Սա նշանակում է, որ ավելի բարձր կարգի լեզվի օգտագործումն ինքնին չի նշանակում ճարտարապետության փոփոխություն և վերօգտագործման գործոնի ավելացում. Որոշիչ գործոնը որոշակի մշակողի ՝ համապատասխան ապուշների օգտագործման ունակությունն է:Հասկանալով բարձր մակարդակի կոնստրուկցիաների հնարավորություններն ու սահմանափակումները, դրանց իրականացման հիմնական սկզբունքները ոչ միայն ծրագրավորողին հնարավորություն են տալիս առավել արդյունավետ օգտագործել իր սովորած լեզուն, այլև թույլ է տալիս Ձեզ ստեղծել և օգտագործել նմանատիպ մեխանիզմներ զարգացման դեպքում `այնպիսի լեզվով, որտեղ դրանք չեն իրականացվում:Ավելի հեշտ կլինի ծրագրավորողի համար, ով գիտի ծրագրավորման լեզուների լայն տեսականի, ընտրել դրանց շարքում այն գործիքը, որն առավելագույնս հարմար է իր խնդիրը լուծելու համար, անհրաժեշտության դեպքում, ուսումնասիրել նոր լեզու կամ իրականացնել տիրույթի հատուկ լեզու, օրինակ, կարող է ներառել բավականին բարդ ծրագրի հրամանի տողի միջերեսը։
Ծրագրավորման պարադիգմ
Լեզուներին պարադիգմներին վերագրելը կարող է իրականացվել մի քանի հիմքերով, որոնցից մի քանիսը համապատասխանում են լեզուների հատուկ տեխնիկական բնութագրերին, իսկ մյուսները շատ կամայական են:Տեխնիկապես, լեզուները բաժանվում են, օրինակ, կողմնակի էֆեկտների և կապի թափանցիկության:Երկրորդ դեպքում ասում են, որ լեզուն պատկանում է «զուտ ֆունկցիոնալ պարադիգմին»:Տիպային համակարգի որոշակի հատկություններ և լեզու հաշվարկելու ռազմավարություններ երբեմն համարվում են որպես պարադիգմ, օրինակ ՝ պարամետրային բազմամորֆ տիպային համակարգերի համար, նրանք հաճախ խոսում են ընդհանուր ծրագրավորման պարադիգմի իրականացման մասին:Մեկ այլ օրինակ `համասեռականության հատկությունն է, որը բացում է մետրոպոգրամանման սորտերի մի ամբողջ սպեկտր:Կան բազմաթիվ «լեզուներ, որոնք ժառանգվել են մաթեմատիկայից», որոնցից շատերը կազմում են եզակի պարադիգմներ:Ավելի պայմանականորեն լեզուները բաժանվում են սերունդների:Առաջին երկու սերունդը ցածր մակարդակի վրա է, այսինքն, կենտրոնացած են հատուկ ապարատների առանձնահատկությունների վրա, և սկզբունքորեն դրանք չեն համապատասխանում որևէ պարադիգմի:Երրորդ սերնդի հետ միասին նրանք ձևավորում են հրամայական ծրագրավորման պարադիգմ, իսկ հաջորդ սերունդները ՝ դեկլարատիվ:Շատ դեկլարատիվ լեզուներ ներառում են որոշակի հրամայական հնարավորություններ, երբեմն էլ հակառակը:Ծրագրերի չափի և բարդության բարձրացմամբ, երկրորդ սերնդի լեզուները օգտագործելիս սկսեց ձևավորվել ընթացակարգային ծրագրավորման պարադիգմը,պահանջելով մեծ ընթացակարգերի տարանջատում հիերարխիկորեն կապված փոքր ավելի փոքր շղթաների մեջ:Միևնույն ժամանակ, հայտնվեցին առաջին երրորդ սերնդի լեզուները, և կառուցվածքային ծրագրավորումն առաջին հերթին ձևավորվեց ՝ որպես ընթացակարգային, իսկ հետո ՝ մոդուլային ուղիղ զարգացում:Ժամանակի ընթացքում հայտնվեցին հսկայական թվով տարբեր եղանակներ ՝ լուծելու հիմնահարցը զարգացող ծրագրային համակարգերը ինտեգրելու սկզբնական հրամայական մոտեցումը:Որոշ դեպքերում ձեռք է բերվել էական ազդեցություն զարգացման արագության և որակի ցուցանիշների վրա, բայց ընդհանուր առմամբ, ինչպես նշվեց վերևում, երրորդ սերնդի լեզուները վերացական են մեքենայական տրամաբանությունից միայն որոշակի մակարդակի վրա և մի փոքր ենթակա են համարժեք վերափոխումների:Մինչ օրս լեզուների երրորդ սերունդը ներկայացված է բազմազան պարադիգմների առավել լայն շրջանակով:Ֆունկցիոնալ լեզուները վերաբերում են չորրորդ սերնդին, որից առանձնանում են «զուտ ֆունկցիոնալ», իսկ մնացածները կոչվում են «ոչ զուտ ֆունկցիոնալ»:Հինգերորդ սերունդը ներառում է տրամաբանական ծրագրավորման լեզուներ, որոնցում, բացի ավանդականից, առանձնանում են մի քանի հատուկ ձևեր, օրինակ ՝ ծրագրավորումն ըստ սահմանափակումների:Փաստորեն, հինգերորդ սերնդի լեզուները չորրորդ սերնդի լեզուներն են ՝ լրացված գիտելիքների բազայով[8], հետևաբար այս կատեգորիան, ինչպես արդեն նշվեց վերևում, ընդհանուր առմամբ ընդունված չէ:Բազմաթիվ պարադիգմներ պայմանականորեն հռչակված մեթոդներ են ՝ ծրագրի կառուցվածքը կազմակերպելու համար և կիրառելի են մեծ թվով լեզուների համար:Լայն ընդգրկումը կառուցվածքային և մոդուլային է. Դրանք օգտագործվում են ինչպես հրամայական, այնպես էլ դեկլարատիվ լեզուներով:Այլ պարադիգմները սերտորեն կապված են տեխնիկական հատկությունների հետ։ Օրինակ, C ++ լեզվի ենթաբազմությունը `կաղապարներ - կարող է պաշտոնապես համարվել որպես Turing- ի ամբողջական զուտ ֆունկցիոնալ լեզու, բայց C ++- ը չունի հատկություններ, որոնք բնորոշ են ֆունկցիոնալ լեզուներին:Արդյունքում, ֆունկցիոնալ լեզուների կազմման մեջ օգտագործված ալգորիթմները չեն կարող կիրառվել C ++- ի համար, ուստի ֆունկցիոնալ պարադիգմի առաջատար հետազոտողները շատ թերահավատորեն են վերաբերվում C ++- ին։
Ծրագրավորման լեզուները փոքր և մեծ մասշտաբներով
Ծրագրերը կարող են լուծել տարբեր չափերի խնդիրներ,մի ծրագիր է ստեղծում ժամանակացույցը տվյալ գործառույթի համար, իսկ մյուսը ղեկավարում է խոշոր ձեռնարկության աշխատանքային հոսքը:Ծրագրավորման տարբեր լեզուներ նախատեսված են խնդրի տարբեր սկզբնական մասշտաբի համար և, որ ավելի կարևոր է, տարբեր կերպ են գործ ունենում ծրագրային համակարգերի աճող բարդության հետ:Լեզուի հիմնական որակը, որը որոշում է, թե ինչպես զարգանում է զարգացման բարդությունը, քանի որ համակարգը մեծանում է, աբստրակցիան է, այսինքն ՝ համակարգի բաղադրիչի իմաստը (պահվածքը) առանձնացնելու ունակությունը դրա իրականացման եղանակից:Սկզբնաղբյուրի համար որակական չափիչները, ինչպիսիք են ստուգելիությունը և փոփոխելիությունը, ակնհայտորեն որոշվում են վերօգտագործման գործոնով:Սա կարող է նշանակել միևնույն բաղադրիչի վրա տարբեր գործառույթներ կիրառելը, ինչպես նաև նույն գործառույթը տարբեր բաղադրիչներին կիրառելու ունակությունը:Պարամետրային բազմամորֆային (հատկապես արտանետվող) և դինամիկ տիպի համակարգերը զգալիորեն բարձրացնում են վերօգտագործման գործակիցը.Օրինակ, մի գործառույթ, որը հաշվարկում է զանգվածի երկարությունը, կկիրառվի զանգվածի տիպերի անսահման թվով:Բարձր կարգի լեզուները թույլ են տալիս տարբերակել գործառույթների փոխգործակցության սխեմաները բազմիցս կոչված կոդ բլոկի մեջ, և վերօգտագործումը հասնում է իր բարձրագույն արժեքների ՝ ավելի բարձր մակարդակի լեզու տեղափոխվելիս - անհրաժեշտության դեպքում, հատուկ մշակված այս առաջադրանքի համար - տվյալ դեպքում լեզուն վերաօգտագործվում է ոչ միայն մեկ ֆունկցիա, այլև զարգացումը:Լեզուն կարող է պահպանվել կազմողի բաղադրիչների ինտենսիվ վերաօգտագործմամբ:Լեզուների զարգացման հետ մեկտեղ հայտնվեցին հատուկ (բացառապես ծրագրավորման բնութագրիչ, որը նախկինում չի պահանջվում մաթեմատիկայում) բաղադրիչների և կախվածության կարգեր.մոնադներ, տիպի դասեր, պոլիմորֆային ճյուղեր, ասպեկտներ և այլն, դրանց օգտագործումը թույլ է տալիս ավելի մեծ ֆունկցիոնալություն արտահայտել նույն քանակի կոդով ՝ դրանով իսկ լայնածավալ ծրագրավորումը փոքր մասշտաբով թարգմանելով:Այլ հիմնական հիմնախնդիրները, որոնք կապված են խոշոր համակարգերի բարդության հետ, բխում են հենց ծրագրերից դուրս:Լեզվաբանական իմաստաբանության հատկություններից բացի, վերաօգտագործումը հնարավոր է հասնել համակարգչային համակարգի կամ բարդույթի մոդուլային կառուցվածքի միջոցով:Ավելին, անկախ նրանից, թե որքան ճկուն է լեզուն, աշխատելով հսկայական ծածկագրերով, հատկապես շատ մարդկանց, պահանջում է դրանց տարրալուծումը մոդուլների այս կամ այն ձևով:Մոդուլային կառուցվածքը ենթադրում է ոչ միայն ծրագրի մոնոլիտ աղբյուրի կոդը տրոհել շատ տեքստային ֆայլերի, այլև ավելի մեծ մասշտաբի վերացում, այսինքն ՝ ցանկացած տրամաբանորեն ամբողջական հատվածի համար ինտերֆեյսի սահմանում և թաքցնել դրա իրականացման մանրամասները:Կախված լեզվից կիրառվող շրջանակի կանոններից, լեզուն կարող է կամ չի կարող թույլ տալ ավտոմատ կախվածության հայտնաբերում:Եթե, ըստ կանոնների, հնարավոր է անվանման կոնֆլիկտ, ապա կախվածության ինքնագլխումն անհնար է, և այդ դեպքում մոդուլի վերնագրում դուք պետք է բացահայտորեն նշեք այն մոդուլների անունները, որոնց բաղադրիչները օգտագործվում են դրանում:Որոշ լեզուներ կենտրոնացած են բացառապես փոքր, կառուցվածքայինորեն պարզ ծրագրերի մշակման վրա:Դրանք չեն ապահովում ոչ մոդուլների մշակված համակարգ, ոչ էլ հատուկ բեկորների ճկունություն:C լեզուն ստեղծվեց որպես «բարձր մակարդակի հավաքույթ», որն ինքնին չի ենթադրում բարդությունների որոշակի շեմից վերև գտնվող համակարգերի զարգացում, հետևաբար, դրանում ներառված չէր նաև լայնածավալ ծրագրավորմանն աջակցելը:Բարձր և գերհզոր մակարդակի որոշ լեզուներ (Erlang, Smalltalk, Prolog) հասկացությունները տրամադրում են որպես հիմնական պարզունակ տարրեր, որոնք այլ լեզուներում, կարծես, կառուցողական և ալգորիթմիկ բարդ են (գործընթացներ, դասեր, գիտելիքների հիմքեր) - նման են մի շարք մաթեմատիկական հաշվարկների:Հետևաբար, նման լեզուները հաճախ դիտարկվում են որպես առարկայական:Այնուամենայնիվ, այս լեզուներում այլ ասպեկտների ֆունկցիոնալության ընդլայնումը կարող է դժվար լինել:Ժամանակի ընթացքում կառուցվել են տարբերակներ ՝ դրանք միասին միավորելու համար:Շատ այլ լեզուներ պարունակում են նաև մոդուլային համակարգեր, բայց դրանց մեծ մասը առաջին կարգի մոդուլի լեզուներ են:Lisp- ի և չորրորդ լեզուները թույլ են տալիս ձեզ ստեղծել կամայականորեն և անսահմանափակ համակարգեր, ներառյալ թույլ տալով, որ դուք ինքներդ ձեր մեջ ստեղծեք ներկառուցված առարկայի հատուկ լեզուներ, հետևաբար դրանք հաճախ կոչվում են մետաղալեզու:Այսօր բարդության հիմնախնդրի լուծման ամենատարածված մոտեցումը օբյեկտիվ ուղղվածություն ունեցող ծրագրավորումն է, չնայած դրա կիրառման հաջողությունն իր գոյության տասնամյակների ընթացքում մի քանի անգամ ենթարկվել է թերահավատության, և դեռևս չկա հուսալի ապացույց, որ այն բերում է օգուտներ `համեմատած այլ մոտեցումների հետ:Այն ուղեկցվում է բաղադրիչների միջև կախվածությունը կարգավորելու տարբեր տեխնոլոգիաներով ՝ մետաքսազերծում, պայմանագրեր, նախատիպեր, կեղտազերծում, տեսակներ և այլն:Metaprogramming- ի տարբեր ձևերի, այսինքն ՝ զարգացման գործընթացի ավտոմատացումը տարբեր մակարդակներով օգտագործումը պատմականորեն համարվել է առավել հզոր մոտեցում:Սկզբունքորեն տարբերվող մետրոպոգրաֆիկացումը լեզվից դուրս և ինքնին մատչելի լեզվով:Առաջին կարգի լեզուներ օգտագործելիս ՝ աճող ծրագրային համակարգերի բարդությունը արագորեն գերազանցում է մարդու կողմից տեղեկատվության ընկալման և մշակման ունակության շեմը, հետևաբար, նախնական տեսողական ձևավորման արտաքին միջոցներն օգտագործվում են բարդ սխեմաները պարզեցված ձևով և իջեցված մասշտաբով դիտելու համար, այնուհետև ինքնաբերաբար առաջացնում են ծածկագրի շրջանակ:Բարձր կարգի լեզուներ օգտագործող մշակողների համայնքներում գերակշռում է ճիշտ հակառակ մոտեցումը `կանխել բարդության հնարավորությունը վերահսկողությունից դուրս գալը` տեղեկատվական մոդելները անկախ բաղադրիչներին բաժանելով և միջոցներ մշակելով որոշ մոդելներ մյուսներին ինքնաբերաբար վերածելու համար։
Ֆորմալ փոխակերպում և օպտիմիզացում
ցանկացած ֆորմալացված լեզվի առավելությունները որոշվում են ոչ միայն այն բանի կողմից, թե որքանով է դա հարմար անձի կողմից ուղղակի օգտագործման համար, այլ նաև այն աստիճանի, թե որքանով են այս լեզվով տեքստերը պարտադրում իրենց ձևական վերափոխումները:Օրինակ, տեղեկատուի թափանցիկությունը նշանակում է, որ զանգից առաջ գործառույթների պարամետրերը չեն պահանջվում գնահատել, փոխարենը, իրականում փոխանցված արտահայտությունը կարող է ամբողջությամբ փոխարինվել գործառույթի փոփոխականին, և գործառույթի պահվածքը չի փոխվի:Սա բացում է գրեթե կամայական ավտոմատ ծրագրի փոխարկումների հնարավորությունը:Հնարավոր է վերացնել տվյալների անհարկի միջանկյալ ներկայացուցչությունները, հաշվարկների բարդ շղթաները կարող են կրճատվել, կարող են ընտրվել զուգահեռ գործընթացների օպտիմալ քանակը, հնարավոր է մտցնել հուշագրումը և այլն:Մյուս կողմից, սա նշանակում է կողմնակի էֆեկտների լիակատար բացակայություն, և սա ստիպում է որոշ ալգորիթմների իրականացումն ակնհայտորեն ավելի քիչ արդյունավետ, քան փոխադարձ վիճակը օգտագործելիս:Փոքր և պարզ ծրագրերի համար բարձր մակարդակի լեզուները առաջացնում են ավելի մեծ մեքենայի կոդ և կատարում են ավելի դանդաղ:Այնուամենայնիվ, ալգորիթմական և կառուցվածքային բարդ ծրագրերի համար առավելությունը կարող է լինել որոշ բարձր մակարդակի լեզուների կողքին, քանի որ մարդը ֆիզիկապես ի վիճակի չէ արտահայտելու բարդ հասկացություններ ՝ հաշվի առնելով դրանց արդյունավետ կատարումը մեքենայական լեզվով։
Կան բազմաթիվ առանձնահատուկ պատճառներ, թե ինչու է ավտոմատ օպտիմալացումը բարձր մակարդակի լեզուների թարգմանության ընթացքում, սկզբունքորեն, ավելի մեծ կատարման արագություն է տալիս, քան ցածր մակարդակի լեզուներով իրականացման մեթոդի գիտակցված հսկողություն:Օրինակ, առկա են հուսալի ապացույցներ այն մասին, որ հիշողության ավտոմատ կառավարումը ավելի արդյունավետ է, քան ձեռնարկը, միայն դինամիկ մեթոդը օգտագործելիս կա, և կա հավանականորեն ավելի արդյունավետ ստատիկ մեթոդ:Բացի այդ, յուրաքանչյուր միկրոհամակարգի համար անհրաժեշտ է բաժանել գրանցամատյանները ՝ հաշվի առնելով հիշողությունը հասանելիության նվազագույնի հասցնելու համար, և դա պահանջում է լուծել գծապատկերի գունավորման խնդիրը:Մեքենայական տրամաբանության այդպիսի շատ առանձնահատկություններ կան, ուստի տեղեկատվության ընդհանուր բարդությունը յուրաքանչյուր «աստիճանաբար» գնալով աճում է, և բարձր մակարդակի լեզու կազմելը կարող է ներառել տասնյակ նման քայլեր:Կան բազմաթիվ ավտոմատ օպտիմիզացման ռազմավարություններ:Ոմանք համընդհանուր են, մյուսները կարող են կիրառվել միայն որոշակի բնույթի լեզուների վրա, իսկ ոմանք էլ կախված են լեզուն գործածելու եղանակից:Սխեմաների լեզվի ստանդարտը պահանջում է յուրաքանչյուր գործողություն `դա երաշխավորելու համար:Բազմաթիվ ֆունկցիոնալ լեզուների համար այն սկզբունքորեն կիրառելի է, բայց դա անում են միայն օպտիմալացնող բաղադրիչները։ C կամ C ++ նման լեզուներով, դա կարող է իրականացվել միայն որոշակի դեպքերում և միայն գլոբալ հսկողության հոսքի վերլուծություն օգտագործելիս:Բարձր կարգի լեզուները շատ դեպքերում ստիպված են լինում ավելի դանդաղ գործադրել, քան առաջին կարգի լեզուները:Պատճառները կայանում են ինչպես գծային կոդը շղթայի մեջ, այնպես էլ գործառույթների և տվյալների ցածր մակարդակի ներկայացման արդյունքում:Այնուամենայնիվ, կան ծրագրերի ագրեսիվ օպտիմիզացման տեխնիկա, որոնք թույլ են տալիս նվազեցնել բարձրակարգ լեզուները առաջին կարգի լեզուներին։
Լեզուների հանրաճանաչությունը
Դժվար է որոշել, թե որ ծրագրավորման լեզուն է ամենատարածվածը, քանի որ «հանրաճանաչություն» բառի իմաստը կախված է ենթատեքստից:Մեկ լեզու կարող է տևել առավելագույնը մարդկային ժամեր, մյուսը ՝ ամենամեծ թվով կոդերի տողեր, երրորդը ՝ առավելագույն պրոցեսորային ժամանակ, իսկ չորրորդը ՝ առավել հաճախ, ծառայում է որպես հետազոտական հիմք ակադեմիայում:Որոշ լեզուներ շատ տարածված են հատուկ առաջադրանքների համար։
Այլ լեզուներ պարբերաբար օգտագործվում են լայն կիրառական ծրագրերի ստեղծման համար։
Լեզուների ժողովրդականությունը չափելու համար կան տարբեր չափումներ, որոնցից յուրաքանչյուրը մշակվում է հանրաճանաչության հայեցակարգի որոշակի նշանակության հակումով։
- հաշվել լեզուն հիշատակող թափուր աշխատատեղերի քանակը.
- վաճառված գրքերի քանակը (դասագրքեր կամ տեղեկատու գրքեր).
- լեզվով գրված կոդերի տողերի քանակի գինը (որը հաշվի չի առնում լեզուների օգտագործման հազվադեպ հրապարակված դեպքերը).
- հաշվում են լեզվային տեղեկանքները որոնիչի հարցումներում։
Հարկ է նշել, որ այս ցուցանիշների վրա բարձր գնահատականները ոչ միայն չեն նշում լեզուն բարձր տեխնիկական մակարդակ և / կամ ծախսերի օպտիմիզացում այն օգտագործելիս, այլ, ընդհակառակը, երբեմն նրանք կարող են այլ կերպ ասել:Արդյունքում, կարճաժամկետ հեռանկարում «Քոբոլ» -ին աջակցող ծրագրերը շատ ավելի թանկ են, քան ժամանակակից լեզուների մեծ մասի ծրագրերը, բայց դրանք զրոյից վերաշարադրելը կպահանջի նշանակալից միանգամյա ներդրումներ, և դրանք կարելի է համեմատել միայն երկարաժամկետ ծախսերի հետ:Կոբոլի տեխնիկական անկատարությունը պայմանավորված է նրանով, որ այն մշակվել է առանց համակարգչային գիտության ոլորտում փորձագետների ներգրավման[9][10]:.