Алгол

**Алгол** (  сөзі   — алгоритмдік  және  — тіл деген мағынаны білдіреді) — ғылыми-техникалық мәселелерді ЭЕМ-де шешу үшін қолданылатын бағдарламаларды құруда пайдаланылатын  бағдарламалау тілдерінің қатары атауы.  1958—1960 жж. IFIP - жоғары дәрежелі бағдарламалау тілдері комитетімен құрылған (Алгол-58, Алгол-60); 1964—1968 жж. (Алгол 68) жетілдірілді. Алгол  жоғары дәрежелі бағдарламалау тілдеріне жатады және алгебралық формулаларды бағдарламалау нұсқауларына оңай аударуға болады. Алгол тілі Еуропа, соның ішінде КСРО-да кең таралса,сол уақытта оған ұқсас тіл Фортран АҚШ пен Канадада қанат жайды.  Кейінірек жасап шығарылған императивті бағдарламалау тілдеріне, соның ішінде  Pascal тіліне, елеулі әсерін тигізді.

Жалпы  **Алгол** (нұсқасын нақтылаусыз) деп  Алгол-60 тілін айтады, ал Алгол 68 жеке тіл ретінде қарастырылады.

## Тарихы
Алгол 1958 жылы, ETH (Цюрих, Швейцария), апталық конференция барысында қолданылу аясы кең әмбебап бағдарламалау тілі ретінде жасап шығарылды,содан кейін Халықаралық ақпарат өңдеу федерциясы (IFIP) құрған комитет тілді жетілдіріп, аяқтады.Бұл комитет құрамына Еуропа мен Американың жетекші ғалымдары мен бағдарламалау тілін жасаушы инженерлер кірді. Солардың ішінде: Джон Бэкус — Фортран тілін жасаушылардың бірі, Джозеф Уэгстен — кейінірек Кобол тілін жасаушылар комитетін басқарды, Джон Маккарти — Алголмен бірге пайда болған Лисп тілінің авторы, Петер Наур — кейінірек «Бэкустың қалыпты түрін» жетілдіріп, аяқтады, Эдсгер Дейкстра — нидерландтық ғалым, кейінірек құрылысдық бағдарламалау мен бағдарламалауға математикалық тәсілін жақтаушылардың бірі ретінде кеңінен танымал болды, келешек Тьюринг премиясының иегері.

Басында бұл бастама принципиалды сипаттағы емес өте үлкен қиындықтарға тап болды. Мысалға, комитеттің бір мүшесінің еске алуы бойынша америкалық және еуропалық ғалымдар арасында санның бүтін және ондық бөлігін айыратын таңба жөнінде үлкен дау туған. Америкалықтар нүкте десе, еуропалықтар Еуропадағы дәстүрлі түрде қолданылатын үтірді қабылдау керек деді. Осы дау себебінен ары қарайғы жұмыс тоқтап қалудың алдында болды. Осындай даулардан қашу үшін Алголдың сипаттамасы үш сатылы: сипаттау, жариялау және орындау түрінде болады деп шешілді. Үтір, нүкте немесе қолданылатын әліпби сияқты ұсақ мәселелер екінші, үшінші сатыларға шығарылды, осы жағдай принципиалды даулардың шешімін оңай табуға септігін тигізді. Кейінірек қабылданған жариялау сатысында ұлттық кілтсөздер мен ақпарат көрінісі үлгілерін (соның ішінде айырма нүкте) қолдануға рұқсат етілді, ал орындау сатысын тіл бүтіндей өзі анықтайды, оған сәйкес трансляторлар құрылуы керек.

1958 жылы Алгол-58 тілінің бірінші нұсқасы сипаттамасының қабылдануынан кейін (алғашында тілді  IAL — International Algebraic Language деп атамақшы болды, бірақ кейін ол ойдан бас тартты) салыстырмалы түрде аз уақытта шешімін таппаған мәселелер анықталып , оларды шешу үшін комитет жаңа үлгінің нұсқасын ұсынды, ол Алгол-60 еді; тілдің осы нұсқасы «классикалық » Алгол деген атпен танымал болды. 1959 жылы Джон Бэкус «Бэкустың қалыпты түрін»  ұсынды — алгоритмдік тілдерді сипаттаудың формалды жолы. Сипаттамасы «Бэкустың қалыпты түрінде» жазылған бірінші тіл Алгол-58 болды. Кейінірек, Питер Наур ұсынған жетілдірулерден соң, «Бэкус-Наурдың қалыпты түрі» ұсынылды және Алгол-60-тың өмірге келу барысында-ақ сипаттамаларда қолданылды.

Жаңа тілді жақтаушылармен қатар даттаушылар да көп болды. АҚШ-та Алгол тілін суық қарсы алды, ол тек академиялық ортада ғана танымал болды, оның өзінде барлық жерде емес. Ал Алголды жүзеге асырмақшы болғандар бірқатар қиындықтарға тап болды. Мысалға, сол кездегі болған бірде-бір компьютер Алгол тілі әліпбиінің 116 қаріпінің бәрін бірдей енгізіп-шығара алмады.

SHARE — IBM компьютерлері қолданышыларының американдық ассоциациясы , — Алголды өз компьютерлеріне сай етуді талап етті,  бірақ пайда болған IBM OS/360-қа арналған компилятор пайдалануда өте ыңғайсыз болды — бұл түсінікті де еді,  өйткені  Фортран тіліне үлкен көлемде қаражат салған кәсіпорын, жаңа бағдарлмалық тіл жасауды қаламады, себебі ол өзіндегі бар тілмен бәсекеге түсу қаупінен қорықты. Сол уақытта  Фортранның кем тұстары IBM-ді оған басқа тіл жасауға итермелеп, PL/I  тілінің пайда болуына әкеліп соқты. Фортранның мұрагері болған бұл тілде Алголдың әсер еткен тұстары өте көп болды.

Ал сол мезетте Еуропада Алголды қызығушылықпен қарсы алды. Ол аз уақытта академиялық ортада атақ тауып, барлық жерде компиляторлар құрастырылды, олардың көбісін іске асырудың қиындықтарына қарамастан олар өте таынмал болды. Алгол Ұлыбританиядан Қиыр Шығысқа дейін таралды, ғылыми мақалалар алгоритмдерінің сипаттамасын жазатын әмбебап тіл және нақты бағдарламалау құралы болды.

Алгол тілі Burroughs Corporation фирмасымен олардың компьютерлерінде іске асырылып, B5000 моделінен бастап бұл тіл Elliott ALGOL деген ат алды. LGP-30 компьютерлерінде Dartmouth ALGOL 30 тілі қолданылды.

Бағдарламалаудан шығып қалғанның өзінде Алгол тілі ұзақ уақыт бойы алгоритм жариялаудың ресми тілі болып қалды.

## Алгол тілінің сипаттамасы
Алгол тілінінің ерекшеліктері одан кейін құрылған императивті тілдердің  ажырамас бөлігі болды. Нақ осы Алголда бірінші рет бағдарлама нұсқаулардың еркін тізбесі емес, айқын сипатталған, бір-бірінен аластатылған блок-құрылым ретінде ұсынылды. Алголда негізгі блок сол басты бағдарламаның өзі болады.  Ол **<code>begin</code>**  және **<code>end</code>** кілтсөздерімен жабылған негізгі орындалатын блоктан, сонымен қатар бағынышты бағдарламаларды сипаттайтын бөлімнен тұрады. Әр бағынышты бағдарлама бұл - өз ішінде сипатталған ақпараты, формалды  параметрлер тізімі мен атаулары анықталған интерфейсі, нұсқаулар тізімі бар кішірейтілген ішкі бағдарлама. Сонымен қатар блогтың ішінде де бағынышты блогтар болуы мүмкін.

Конструкцияның құрылымдық  басқарушылары да бөліп көрсетілді: тармақтану , цикл, тізбектелген аумақтар, шартты және көпқайталамалы операторлар жиынтығын орындайтын, сонымен қатар **<code>begin</code>**  және **<code>end</code>** кілтсөздерімен жабылған операторлар, мұның бәрі бағдарламаны шартсыз өту аса жақсы атты емес goto операторынсыз құруға мүмкіндік берді. goto - құрылымы аса жақсы емес бағдарламаның басты айыпкері болатын.

Қазіргі кездегі бағдарламалаушыларға бұл құрылым өз-өзінен анықталып қойған, кей жерде  ескірген, ал кейде ыңғайсыз ( Паскалде қолданылатын, шексіз қайталанатын **<code>begin</code>** — **<code>end</code>**  жиі сынға алынатын осы бір ерекшелік Алголдан алынған болатын) болып көрінгенмен, өз заманында бұл елеулі қадам еді. Бағдарламалар біртекті қайталанатын бола бастады, бұл олардың көлемін өсіруге мүмкіндік беріп қана қоймай, сонымен қатар көрнекті, түсінікті, сараптау мен жөндеуге икемді етті. Нақ Алгол мен мұрагерлер-тілдерде бағдарламалардың дұрыстығын сараптау арқылы дәлелдеуде сәтті жұмыстар істелді. 

Алголдың аса маңызды ерекшелігі рекурсивті процедураларды ұйымдастыру мүмкіндігі болды. Рекурсивті процедураларға нарық көшбасшылары Фортран мен  Коболда тікелей тиым салынса, Лиспте олар кеңінен қолданылды. Рекурсивті процедураларды қолдану кейбір жағдайларда бағдарлама құрылымын қарапайым етіп, алгоритмнің математикалық сипаттамасына жақын болғандықтан түсініктірек те қылды.

Әлбетте, Алголдың барлық ерекшеліктерін сәтті және соңына дейін ойластырылған деп айта алмаймыз. Мысалға тілдің стандарттары енгізу-шығару мүмкіндіктерін жоққа шығарды. Тілді жасаушылар бұл мәселе тілді арнайы компьютер немесе пайданаланушының талаптарына сай шығарылатын тілдің жаңа нұсқасымен шешіледі деп тұжырымдады. Бірақ, екінші жағынан, ол кезде  стандартты кітапханалар қолданылатын модульдук бағдарламалау концепциясы әлі іске асырылмаған болатын, сондықтан енгізу-шығару құралдары тікелей тілдің өзіне қосылу керек болатын. Мұның бәрі әр нұсқа енгізу-шығаруды өз бетінше жасап, Алгол-бағдарламалар әр компиляторда бір-біріне мүлдем сәйкес келмейтін болды.

Алголда параметрді бағынышты бағдарламаға берудің екі жолы ұсынылды: аты бойынша, мәні бойынша. Егер екінші жолы ешқандай қарсылық тудырмаған болса (ол қазіргі тілдердің бәрінде дерлік қолдынылады), ал бірінші жолы компилятор жасауда үлкен қиындықтарға әкеліп, қиын анықталатын қателердің пайда болуына жол ашты.

## Алгол-60 тіліндегі кодтың мысалы
 **procedure** Absmax(a) Size:(n, m) Result:(y) Subscripts:(i, k);
     **value** n, m; **array** a; **integer** n, m, i, k; **real** y;
 **comment** n*m өлшемді a матрицасының максималды мүшесі
  y-дің нәтижесі түрінде, ал оның индексы — i және к түрінде беріледі;
 **begin** **integer** p, q;
     y := 0; i := k := 1;
     **for** p:=1 **step** 1 **until** n **do**
       **for** q:=1 **step** 1 **until** m **do**
         **if** abs(a[p, q]) > y **then**
         **begin** y := abs(a[p, q]);
           i := p; k := q
         **end**
 **end** Absmax

Алгол Elliott 803 ALGOL-дағы таблицаны басып шығаруға жіберу мысалы

 FLOATING POINT ALGOL TEST'
 BEGIN REAL A,B,C,D'
 
 READ D'
 
 FOR A:= 0.0 STEP D UNTIL 6.3 DO
 BEGIN
   PRINT PUNCH(3),££L??'
   B := SIN(A)'
   C := COS(A)'
   PRINT PUNCH(3),SAMELINE,ALIGNED(1,6),A,B,C'
 END'
 END'

PUNCH(3) мәтінді перфораторға емес, принтерге жібереді.
SAMELINE сызықшаны орнына қайтаруын жоққа шығарады.
ALIGNED(1,6)  форматты көрсетеді — 1 ондық үтірге дейін, 6 үтірден соң.

## Hello, World
**Hello, World** бағдарламасы, Dartmouth ALGOL 30-да орындалған
сілтемені қараңыз .

 BEGIN
 FILE F (KIND=REMOTE);
 EBCDIC ARRAY E [0:11];
 REPLACE E BY "HELLO, WORLD!";
 WHILE TRUE DO
   BEGIN
   WRITE (F, *, E);
   END;
 END.

Elliott Algol-дағы нұсқасы.

  **program** HiFolks;
  **begin**
     **print** "Hello, world";
  **end**;

IBM OS/360 ALGOL F.

 'BEGIN'
   OUTSTRING (1, '('HELLO, WORLD!')');
 'END'

## Йенсен әдісі

Алголдағы келесі бағдарламаланы қарастырайық:

 **begin**
   **procedure** p (a, b);
     **name** a, b; **integer** a, b;
   **begin**
     **for** a:=1 **step** 1 **until** 10 **do**
       b := 0
   **end** p;
   **integer** i; **integer** **array** s [1:10];
   p (i, s[i])
 **end**

 
Параметрді аты бойынша беруге сәйкес процедураны шақыру осы жағдайда s массивының барлық мүшелерінің нөлге тең болуына алып келуі тиіс. Параметрді аты бойынша беруді осылай қолдануды ұсынған бағдарламалаушының құрметіне орай бұл тәсіл «Йенсен әдісі» деп аталды. Шынтуайтына келгенде аты бойынша параметрді беру үшін компилятор арнайы аты жоқ, бұл өрнекті өз ішінде бөлек орындайтын, Санк деп аталатын функция істеу керек болатын.

## Сонымен қатар қараңыз
* ALGOL 68
* JOVIAL
* С
* С++
* Паскаль

## Әдебиеттер тізімі
* ISO 1538:1984 Programming languages — ALGOL 60
* 

## Сілтемелер
* ''Алгол-60'' Бағдарламалау тілі  
* Синтаксис  *ALGOL 60* в [Бэкус-Наур түрі].
* [http://www.billp.org/ccs/A104/ ''«803 ALGOL»''] — Elliott ''803 ALGOL'' бойынша нұсқау.]
* [http://chernykh.net/content/view/209/221/  ''Алгол-60''-тың пайда болу тарихы.]

[Санат:Техника