Modula-2

**Modula­2**֊ը ծրագրավորման լեզու է, որը 1977­-1985 թթ. նախագծվել և իրակկանացվել է Նիկլաուս Վիրտի կողմից՝ Շվեյցարիայի դաշնային տեխնոլոգիական ինստիտուտում (Ցյուրիխ)։ Modula-2 լեզուն պետք է կօգտագործվեր որպես Լիլիթ ԷՀՄ֊ի Օպերացիոն համակարգի և ծրագրային ապահովան ստեղծման միակ ծրագրավորման լեզու։ Լեզուն ի սկզբանե նախագծվել է որպես համակարգային ծրագրավորման միջոց, որը թույլ կտար գրել ապահով, հասկանալի և հարմար ծրագրեր։ Միևնույն ժամանակ այն պետք է մնար խիստ տիպիզացված բարձր կարգի լեզու, ապահով ծրագրավորման բոլոր միջոցների աջակցությամբ, թույլ տար անմիջականորեն դիմել սարքավորումներին, ստեղծել համակարգային ծրագյաին ապահովում, ինչպիսին օրինակ ընդհատումներ մշակող ծրագրերն են։ Այն Պասկալ և Մոդուլա ծրագրավորման լեզուների զարգացումն է։

Ըստ Վիրտի, լեզվի ստեղծման վրա նաև իր ազդեցությունն է ունեցել Mesa լեզուն, որը ստեղծվել է Xerox PARC֊ում։

## Ընդհանուր բնութագիր
Մոդուլա-2-ը ստրուկտուրային, մոդուլյար ծրագրավորման լեզու է, որը շարահյուսորեն շատ նման է Պասկալին, սակայն զգալիորեն բարելավված և մշակված է։

Հինական գաղափարներ՝
* ծրագիրը իրենից ներկայացնում է առանձին մոդուլների հավաքածու, որոնք կարող են կոմպիլացվել իրարից անկախ։ Ընդ որում ծրագրային մոդուլը կարող է (պարտադիր չէ) բաղկացած լինել երկու մասից՝ սահմանման մոդուլ և իրականացման մոդուլ։ Սահմանման մոդուլը դա մոդուլի արտաքին ինտերֆեյսն է՝ արտաքին մոդուլներին հասանելի հաստատունների, փոփոխականների անուններ, ֆունկցիաների և պրոցեդուրաների վերնագրեր։ Իրականացման մոդուլը պարունակում է ծրագրային կոդ, այսինքն սահմանումների մոդուլում նկարագրված ինտերֆեյսի իրականացումները։ Օրինակ որևէ տիպ սահմանելու համար անհրաժեշտ է սահմանումների մոդուլում նկարագրել միայն անունը, իսկ իրականացման մոդուլում՝ ամբողջ ստրուկտուրան։ Այդ դեպքում արտաքին մոդուլները կարող են ստեղծել նշված տիպի արժեքներ, կանչել այդ արժեքի հետ աշխատող ֆունկցիաներ և պրոցեդուրաներ՝ չունենալով ուղղակի հասանելիություն ամբողջ ստրուկտուրային, քանի որ այդ ստրուկտուրան գրված չէ սահմանման մոդուլում։ Հետևաբար, եթե հենց այդ նույն ստրուկտուրան նկարագրվի սահմանումենրի մոդուլում, ապա այն հասանելի կդառնա արտաքին մոդուլներին։
* Այլ մոդուլներում նկարագրված սահմանումների կցագրումը ամբողջությամբ ղեկավարվում է․ կարելի է կցել մոդուլի սահմանումը ամբողջությամբ, բայց լեզվի շարահյուսությունը թույլ է տալիս զգալիորեն կոնկրետացնել կցվող ցուցակը։ Օրինակ մոդուլից կցել միայն կոնկրետ անհրաժեշտ հաստատուններ, պրոցեդուրաներ կամ ֆունկցիաներ։
* Բոլոր մուտքի և ելքի միջոցները հանված են լեզվից։ Դրա փոխարեն կարելի է օգտածործել գրադարանային մոդուլներ, որոնց վրա էլ դրված է մուտքի/ ելքի խնդիրների կատարումը կոնկրետ համակարգերի համար։ Սակայն գոյություն ունեն ստանդարտացված մուտքի/ելքի գրադարաններ, որոնք տրամադրում են մուտքի/ելքի ֆունկցիաներ ստանդարտ տիպերի համար (մուտքագրել տարրական տիպի տվյալներ տեքստային տերմինալներից, ինչպես նաև ֆայլային մուտք/ելք)։
* ծրագրում ավելացված են մինիմալ հասկացություններ բազմահոսք ծրագրավորման համար։ Ինչպես նաև ստանդարտ գրադարան, որը տալիս է զուգահեռ ծրագրավորման հնարավորություն։
* Ներդրված է անմիջական հասանելիություն համակարգչի սարքերին, մասնավորապես կարելի է անմիջապես հասցեով դիմել հիշողությանը։
	
Լեզուն ունի համեմատաբար պարզ կառուցվածք։ Այն ունի 40 բանալի բառեր (Ada֊ում՝ 60)։ Լեզվի մասին պաշտոնական զեկույցը կազմում է ընդամենը 40 էջ (PL/I ծրագրավորման լեզվի զեկույցի կարճ տարբերակը 200 էջ է, իսկ ADA֊ինը՝ 400)։

## Շարահյուսական առանձնահատկություններ

Մոդուլա֊2֊ի շարահյուսական առանձնահատկությունները նկարագրելու լավագույն եղանակը պասկալի հետ համեմատելն է։ Գլխավոր տարբերություններ՝
* տառաշարազգայուն է – իդենտիֆիկատորներում մեծատառ և փոքրատառ նիշերը տարբերվում են։ Բանալի բառերը գրվում են մեծատառով։
* շարահյուսությունը ավելի հեշտացված է։ Բոլոր շարահյուսական կառուցվածքները, բացի `REPEAT֊UNTIL` ցիկլից, կազմված են հետևյալ սկզբունքով՝ բանալի բառով սկսվող կառուցվածքը ավարտվում է բանալի բառով։ Օրինակ, պայմանի օպերատորը ունի հետևյալ տեսքը՝ 

```modula2
IF պայման THEN
  օպերատորներ
ELSIF պայման THEN
  օպերատորներ
ELSIF պայման THEN
  օպերատորներ
…
ELSE
  օպերատորներ
END
```


* Դրա շնորհիվ վերանում է `BEGIN֊END` օպերանդների օգտագործման կարիքը։
* `WHILE` և `FOR` ցիկլերը նույնպես ենթադրում են օպերանդների բլոկ և ավարտվում են END բառով։
* Ավելացված է առանց պայմանի ցիկլ՝ `LOOP-END` 
* և՛ պրոցեդուրաները, և՛ ֆունկցիաները հայտարարվում են `PROCEDURE` բանալի բառով։
* Ավելացված է `BITSET` բիթային բառ տիպը
* Լեզվից հանվել է `GOTO` օպերատորը
 
## Առավելություններ և թերություններ

Կարելի է հստակ ասել, որ Modula-2֊ը, պահպանելով Պասկալի դրական հատկանիշները, ունի մի շարք առանձնահատկություններ, որոնք լեզուն դարձնում են ավելի հզոր, հարմարված ինչպես համակարգային, այնպես էլ կիրառական ծրագրավորման համար։ Modula֊2֊ի հիմնական առավելությունները ժամանակակից լեզուների նկատմամբ հետևյալն են՝	
* Լեզվի սահմանման պարզությունն ու լակոնիկությունը։ Լեզվի ամբողջական EBNF ներկայացումը 13 էջ է, իսկ շարահյուսական գծագրերը՝ 12 էջ։
* Պարզ, տրամաբանական և միատարր կազմվածք։ Լեզուն մաքրված է ավելորդ կառուցվածքներից և էլեմենտներից, որոնք կարող են բերել սխալների։ Modula֊2֊ը առաջին իմպերատիվ լեզուն է, որտեղ չկա GOTO հրամանը։
* Լավ մշակված ծրագրի բաժանման մեխանիզմ՝ ակնհայտ նկարագրվող ինտրեֆեյսով և ամբողջությամբ ղեկավարվող կցման մեխանիզմով։
* Մուտքի/Ելքի ստանդարտ ֆունկցիաների հեռացումը լեզվից և նրանց՝ գրադարններ տեղափոխումը։ Դա պարզեցնում է լեզուն և կոմպիլյատորը, ինչպես նաև ծրագրավորողին տալիս է մուտք/ելքի գրադարանի ազատ ընտրության հնարավորություն։
* Ցածր մակարդակի ծրագրավորման մեխանիզմ։ Այդ թվում՝ չտիպիզացված տվյալների և ցուցիչի հիշողության հետ աշխատելու անուղղակի մեխանիզմ։ Դա թույլ է տալիս բարձր կարգի լեզվով գրել ցածր մակարդակի ծրագրեր, ինչպիսիք են ընդհատում մշակող ծրագրերը և շարժարկիչները։
* Զուգահեռ ծրագրավորման համար անհրաժեշտ մինիմալ գործիքները, որոնք հնարավորություն են տալիս ծրագրավորել ինչպես բազմապրոցեսորային, այպես էլ ժամանակի բաժանումով հարթակների համար։

Թերություններ՝
* Զուգահեռ ծրագրավորման մեխանիզմի թուլություն, մասնավորապես՝ զուգահեռ պրոցեսների համագործակցության կազմակերպման մեջ։ Այդ միջոցների իրականացումը դրված է համակարգային գրադարանների վրա, ընդ որում ստանդարտ գրադարանում կան միայն զուգահեռացման ղեկավարման պարզագույն միջոցներ։
* Ներդրված մոդուլների աջակցումը չարդարացված դժվարացնում է կոմպիլյատորը։ Այդ մոդուլների օգտագործման պատճառ են հանդիսանում սահմանափակ տեսանելիության տիրույթը և բարձր առաջնայնուըյուն ունեցող ծրագրի կտորների առանձնացումը՝ զուգահեռ ծրագրավորման ժամանակ սինխրոնիզացիա ապահովելու նպատակով։ Սակայն դա կարելի էր իրականացնել ավելի պարզ միջոցներով։
* Սահմանման և իրականացման մոդուլների բացահայտ առանձնացումը վիճարկելի լուծում է լեզվի համար։ Այն դժվարացնում է կոմպիլյատորի աշխատանքը և ստիպում է ծրագրավորողին համապատասխանեցնել փոփոխությունները երկու ֆայլում։ Հարկ է նշել նաև, որ Modula֊2 լեզվի հետնորդ Oberon֊ում հրաժարվել են առանձին սահմանման եւ իրականացման մուդուլներից՝ իրականացման մուդուլում հրապարակային տվյալները նշվում են աստղանիշով, իսկ սահմանման մոդուլի փոխարեն կոմպիլյատորը գեներացնում է սիմվոլային նիշք՝ կոմպիլյատորի համար հեշտ ընթերնելի ինտերֆեյսի ինդեքս։

Հետևյալ հնարավորությունները լեզվի ստեղծման պահին շատ հայտնի էին, բայց չեն ընդգրկվել լեզվի մեջ։ Սրանք կարելի դիտարկել և՛ որպես թերություն, և՛ որպես առավելություն․

* Բացակայում են դինամիկ զանգվածները և փոփոխական չափով տողերը։
* Չկան ներդրված բացառությունների մշակման միջոցներ։
 
## Արտաքին հղումներ
* Modula֊2֊ին նվիրված կայք
* Modula-2 կայքերի օղակ

Կատեգորիա:ISO ստանդարտի ծրագրավորման լեզուներ