Modula-2

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

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

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

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

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

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