Язык программирования Algol 60, Algol 68, pl/1: этапы эволюции и современное состояние



Дата09.01.2018
Размер92.4 Kb.
Название файлаПрограммирование курсач.docx
ТипКурсовая



МИНИСТЕРСТВО СЕЛЬСКОГО ХОЗЯЙСТВА РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ОБРАЗОВАНИЯ

РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ АГРАРНЫЙ УНИВЕРСИТЕТ – МСХА

имени К.А. Тимирязева
(ФГОУ ВО РГАУ - МСХА имени К.А. Тимирязева)


КАФЕДРА ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ И ПРИКЛАДНОЙ МАТЕМАТИКИ



Курсовая работа

По теме: «Язык программирования Algol 60, Algol 68, PL/1: этапы эволюции и современное состояние»

Выполнила студентка I курса112 группы дневного

отделения факультета Экономики и финансов

Бут Елена Геннадьевна

Научный руководитель: Никаноров Михаил Сергеевич


Допускается к рецензированию:







(науч. рук.ФИО)

Оригинальность текста курсовой работы







(науч. рук.ФИО)

Рецензент







(ФИО, подпись)

Оценка защиты курсовой работы







(ФИО членов комиссии, подпись)

Москва, 2016 г.

СОДЕРЖАНИЕ

Стр.


ВВЕДЕНИЕ ……………………………………………………………………….3

1. ПЕРВЫЙ ЭТАП РАЗВИТИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ (1940-1960 гг.) ……………………………………………………………………………4

1.1 Первые языки программирования высокого уровня ……………………4

1.2 Язык программирования ALGOL…………………………………………5

1.3 Синтаксис языка Algol 60………………………………………………….6

1.4 Cвойства языка. Его достоинства и недостатки………………………...12

1.4.1 Примеры программ на ALGOL 60……………………………………..14

1.5 Язык программирования ALGOL 68…………………………………….18

1.6 Особенности языка ALGOL 68…………………………………………..20

1.7 Выводы по данному периоду развития языков программирования…..23


2. ВТОРОЙ ЭТАП РАЗВИТИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ (1960-1970 гг.) …………………………………………………………………...26

2.1 Общий обзор исследуемого периода…………………………………….26

2.2 Язык программирования PL/1…………………………………………....26

2.3 Синтаксис языка PL/1 ……………………………………………………29

2.4 Вывод по данному периоду развития языков программирования……29
Введение
Быстрое и широкое развитие IT-сферы повлекло за собой создание множества языков программирования (ЯП), решающих проблему общения человека с компьютером. Это создает множество вопросов и проблем требующих ответов и решений. Одной из наиболее интересных и важных является проблема дальнейшего развития языков, путей по которым их эволюция может пойти, какие языки будут более значимы в будущем. Приступая к работе необходимо четко обозначить цель: выявление преимуществ наиболее перспективных ЯП с точки зрения выявления дальнейшей положительной эволюции. Но как известно, чтобы предугадать что-либо в будущем, нужно знать историю развития, проанализировав которую, можно выявить тенденции дальнейшего развития.

Сначала было программирование в машинных кодах, когда программист являлся единственным посредником между остальными смертными и Машиной, которая занимала почти целый этаж[1]Затем появились мнемонические представления машинного кода, ассемблер и, наконец, макроассемблер. В конце 50-х возникли языки формульного программирования, из которых наиболее замечательным был Фортран, позже в 60-х, произошло смещение к нечисленным методам — появился АЛГОЛ, и наконец к 70-м годам произошла структурная революция – АЛГОЛ-Wи Паскаль. На очереди "модульное" программирование — Модула и Модула-2.



1. ПЕРВЫЙ ЭТАП РАЗВИТИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ (1940 – 1960 ГГ.)
Прогресс компьютерных технологий определил процесс появления новых разнообразных знаковых систем для записи алгоритмов – языков программирования. Смысл появления такого языка – упрощение программного кода.

С каждым днём наш мир становиться более мобильным и информационным. Всё больше и больше компьютеры вступают в нашу повседневную жизнь и чтобы облегчить наше общение с ними создаётся новое ПО с помощью различных языков программирования.

Языки программирования принято делить на пять поколений. В первое поколение входят языки, созданные в начале 50-х годов, когда первые компьютеры только появились на свет. Это был первый язык ассемблера, созданный по принципу «одна инструкция - одна строка».
1.1 Первые языки программирования высокого уровня
Середина 50-х гг. характеризуется стремительным прогрессом в области программирования. Роль программирования в машинных кодах стала уменьшаться, стали появляться языки программировании нового типа, выступающие в роли посредника между машинами и программистами. Наступило время второго и третьего поколений языков программирования

С середины 50-ых гг. XX в. начали создавать первые языки программирования высокого уровня (high-levellanguage). Эти языки были Машино независимыми (не привязаны к определенному типу ЭВМ).

Но для каждого языка были разработаны собственные компиляторы - программа, выполняющая компиляцию.

Компиляция - трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера)


Первый язык высокого уровня был создан в период с 1954 по 1957 года группой программистов под руководством Джона Бэкуса в корпорации IBM и это стало следующим этапом развития языков программирования. Это был язык программирования FORTRAN. Он предназначался для научных и технических расчетов. Название Fortran является сокращением от FORmulaTRANslator (переводчик формул).
1.2 Язык программирования ALGOL (АЛГОЛ).

ALGOL это язык программирования, первоначально разработанный в 1958 году, который был назван по названию "АЛГОритмический процесс" основной проблемы программирования. Это краткое имя алгоритмического языка. В некотором смысле, это была реакция на Fortran, этот язык был предшественником Паскаля. Он использует слова в качестве ограничителей блоков и был первым, кто использовал пару "begin" и "end".

Существовали три основные версии официального Алгола: Алгол 58, Алгол 60 и Алгол 68. Из них, язык программирования Алгол 60 был самым влиятельным (Алгол 60 был предком Algol W, который был использован Никлаусом Виртом для разработки Паскаля). Каждая официальная версия Алгола названа в честь года, в котором она была опубликована.

Алгол был разработан совместно с Комитетом европейских и американских компьютерных ученых. Этот язык имеет, по крайней мере, три различных синтаксиса: ссылочный синтаксис, синтаксис публикации, и синтаксис исполнения. Для разного синтаксиса разрешено использовать различные имена ключевых слов, разрешено использовать разные разделители целой и дробной части (запятую или точку) для различных стран как основу программирования.

Язык программирования Алгол 60 был выпущен в 1960 году Джоном Бэкусом и Питером Наурос, которые служили в комитете, который разработал АЛГОЛ.

Algol 60 вдохновил разработчиков многих языков, которые создавались позже.

В официальном языке программирования Algol 60 не были оределены средства ввода / вывода; конкретные реализации языка обязательно должны были добавить какие-то свои, но они варьировались от одной реализации к другой.

Алгол-68, возможно, преодолел этот недостаток отсутствия объектов ввода / вывода (или "transput").Algol 60 разрешал два типа передачи параметров: вызов по значению, и инновационной вызов по имени, от которого было впоследствии отказались языки-преемники. Вызов по имени имел определенные ограничения в отличие от вызова по ссылке, что делает его нежелательной особенностью языкового дизайна. Например, в Алгол 60 невозможно создать процедуру, которая будет менять значения двух параметров, если в качестве фактических параметров, которые передаются будут выступать целочисленная переменная и массив, индексированный по этой же целочисленной переменной.

Джон Бэкус разработал метод нормальной формы описания языков программирования, специально для Алгола 58. Он был пересмотрен и расширен Питером Науром в метод Бэкуса-Наура для Алгола 60. Алгол 68 был определен с использованием двухуровневой грамматики, которую изобрел Адриан ван Вейнгаардена и которая носит его имя. Грамматика ван Вейнгаардена использует контекстно-свободную грамматику, порождающую бесконечное множество реализаций, которые будут отражать частности Алгола 68 как программы.

1.3 СИНТАКСИС ЯЗЫКА ALGOL 60

Особенности языка Алгол стали типичными для большинства

императивных языков, созданных позднее него. Именно в Алголе появилось

представление о программе не как о свободной последовательности команд,

а как о блочной структуре, состоящей из чётко описанных и отделённых друг

от друга частей. Основной блок программы на Алголе — это сама главная

программа. Она содержит свою исполняемую часть, заключённую в блок,

ограниченный парой ключевых слов begin и end, а также описания

подпрограмм. Каждая подпрограмма — это программа в миниатюре,

имеющая собственные, описанные внутри неё данные, однозначно

определённый интерфейс в виде имени и списка формальных параметров, и

блок кода. При этом в блоке могут выделяться подблоки.

Были выделены структурные управляющие конструкции: ветвления,

циклы, последовательные участки, исполняющие условно или многократно

вложенные наборы операторов, также ограниченные теми же ключевыми

словами begin и end, что дало возможность описывать логику программы без

использования безусловных переходов —оператора goto, способствующего

запутыванию программы.

Крайне важным свойством Алгола стала возможность организации

рекурсивных процедур, до этого у промышленных языков отсутствовавшая

(у лидеров рынка — Фортрана и Кобола, — рекурсия прямо запрещена), но

широко использовавшаяся в Лиспе. Использование рекурсивных вычислений

в ряде случаев способно значительно упростить структуру программы и

сделать её более понятной за счёт близости к математическому описанию

алгоритма решения задачи.

В Алголе было предложено два способа передачи параметров в

подпрограмму — по имени и по значению. Если второй способ возражений

не вызывает (он широко используется в абсолютном большинстве языков по

сей день), то первый (он предполагает, что в процедуру передаётся имя

фактического параметра, и процедура работает так, как будто в точке

обращения записан её код, где вместо формального параметра написано имя

фактического) приводил к трудностям реализации компиляторов и

появлению труднообнаруживаемых ошибок.

В эталонном языке АЛГОЛ используется 116 основных символов. По

своему назначению они объединены в 4 основных группы:

1. Буквы латинского алфавита строчные и прописные

a, b, c, ... , z, A, B, C, ... , Z

2. Десять арабских цифр от 0 до 9

3. Логические значения булевских переменных true и false

4. Ограничители

а) Знаки арифметических операций (+,-,×,/, ÷- разделить на цело, ↑ -

возвести в степень). 14

Логические операции (∧ - и,∨ - или, ⊃ -влечет , ≡- эквивалентно,¬ -не).

Операции отношения (<, >, ≤ , ≥ , =, ≠ ).

Операции следования (go to, if, then, else, for, do).

б) Скобки (, ), [, ], begin, end, ‘, ‘.

в) Разделители: , - запятая, . –десятичная точка, 10 - основание степени,

:, ;, :=, C - пробел, step, until, while, comment – примечание.

г) Описатели: own - собственный, Boolean, integer, real, switch -

переключатель, procedure.

д) Спецификаторы: string, label, value.

Идентификатор – это либо последовательность букв, либо

последовательность букв и цифр, причем цифра не может быть первой.

В Алголе различают простые переменные и переменные с индексами.

Простая переменная – это величина, значением которого может быть

либо число (типа integer или real), либо логическое значение (Boolean).

Переменная с индексами означает отдельное значение, которое

является элементом массива.

Для элементарных функций математического анализа в Алголе

предусмотрены особые правила, облегчающие их применение. Список

стандартных функций в эталонном языке не устанавливается постоянным,

однако рекомендуется, чтобы он включал следующие функции:

abs(E) - модуль значения выражения E;

sign(E) - знак значения Е;

sqrt(E) - квадратный корень из значения Е;

sin(E) - синус значения Е;

cos(E) - косинус значения Е;

arctan(E) - арктангенс значения Е;

ln(E) - натуральный логарифм значения Е;

exp(E) - показательная функция значения Е;

Также среди стандартных функций рекомендуется иметь функцию

выделения целой части – entier(E) – наибольшее целое, не превышающее

значения Е.

Алгол-60 разрешает производить описание переменных только в

начале блока.

Синтаксис описания типа задается формулами:

<описание типа>::= <тип> <список типа>

<список типа>::= <простая переменная> | <простая переменная>,

<список типа>

< тип>::= real | integer | Boolean

Описание массива имеет вид:



<тип> array <идентификатор массива> [<список граничных пар>]

<список граничных пар>::= <граничная пара> | <список граничных

пар>, <граничная пара>



<граничная пара>::= <Арифметическое выражение>:<Арифметическое

выражение>

Оператор цикла может иметь несколько форм: 15

for I:=<список значений> do <оператор>



<список значений>::= <значение>|<значение>, <список значений>

Цикл выполняется до тех пор, пока не будут перебраны все значения.

for I:=<арифметическое выражение> while <логическое выражение> do

<оператор>

Цикл продолжается до тех пор, пока истинно логическое выражение. На

каждом шаге пересчитывается арифметическое и проверяется истинность

логического выражения.

for I:=<арифметическое выражение1> step <арифметическое

выражение2> until <арифметическое выражение3> do <оператор>

На каждом шаге цикла параметр I увеличивается на значение

арифметического выражения2 до тех пор, пока параметр не превысит

арифметическое выражение3.

Также может быть комбинация всех трех форм цикла.

Синтаксически процедура в программе может оформляться как

процедура или как процедура-функция.

Описание процедуры:

<описание процедуры>::= procedure <заголовок процедуры> <тело

процедуры>



<тело процедуры>::=< оператор> | <код>

Т.к. на языке Алгол некоторые операции и алгоритмы не реализуются,

то под <кодом> понимается набор инструкций на языке конкретной

машины.


<заголовок процедуры>::= <идентификатор процедуры> <совокупность

формальных параметров>; <список значений> <совокупность

спецификаций>

<список значений> <совокупность спецификаций> - пояснительная

информация о формальных параметрах, является не обязательной.

Формальные параметры в списке в простейшем случае отделяются друг

от друга запятыми.

Например:

procedure p1(a, b, c);

begin



end



В совокупность спецификаций с помощью описателей и

спецификаторов задается информация о классах и типах формальных

параметров. Она нужна лишь затем, чтобы упростить и ускорить работу

транслятора.

procedure p1(a, b, c);

integer a,b; array c;

begin



end



Синтаксис списка значений определяется формулой 16

<список значений>::= value <список идентификаторов>; | <пусто>

procedure p1(a, b, c);

value a,b;

integer a,b; array c;

begin



end



Если в описании процедуры отсутствует <список значений>, то

формальные параметры заменяются в теле процедуры наименованиями

соответствующих им фактических параметров. При этом фактические

параметры там, где это допустимо, предварительно заключаются в круглые

скобки. Тело процедуры, полученное после такой замены параметров,

называют модифицированным. Такой способ модификации тела процедуры

называют вызову по имени.

Формальные параметры, включенные в список значений, обязательно

специфицируются.

Описание процедуры-функции аналогично, за исключением того, что перед

ключевым словом procedure указывается тип функции (Boolean, integer, real).
1.4 Свойства языка. Его достоинства и недостатки
В Алголе появилось представление о программе не как о свободной последовательности команд, а как о блочной структуре, состоящей из чётко описанных и отделённых друг от друга частей. Основной блок программы на Алголе — это сама главная программа. Она содержит свою исполняемую часть, заключённую в блок, ограниченный парой ключевых слов begin и end, а также описания подпрограмм. Каждая подпрограмма — это программа в миниатюре, имеющая собственные, описанные внутри неё данные, однозначно определённый интерфейс в виде имени и списка формальных параметров, и блок кода.

При этом в блоке могут выделяться подблоки.

Были выделены структурные управляющие конструкции: ветвления, циклы, последовательные участки, исполняющие условно или многократно вложенные наборы операторов, также ограниченные теми же ключевыми словами begin и end.

Современным программистам подобная структура программы кажется очевидной, кое в чём устаревшей и не всегда удобной , но на момент появления Алгола всё это было заметным шагом вперёд. Программы становились регулярными, это давало возможность наращивать их по объёму, сохраняя обозримыми, понятными, доступными анализу и исправлению. Именно на базе Алгола и его языков-потомков были выполнены успешные работы по аналитическому доказательству правильности программ.

В Алголе было предложено два способа передачи параметров в подпрограмму — по имени и по значению. Если второй способ возражений не вызывает (он широко используется в абсолютном большинстве языков по сей день), то первый (он предполагает, что в процедуру передаётся имя фактического параметра, и процедура работает так, как будто в точке обращения записан её код, где вместо формального параметра написано имя фактического) приводил к трудностям реализации компиляторов и появлению труднообнаруживаемых ошибок.

Пример программы на Алгол’е

begin

integer i, n;



real s;

real array x[1:n];

s:=0;

for i:=1 step 1 to n do



s:=s+x[i]; s:=s/n

end


Простейшая программа на Алголе-60, вычисляющая среднее арифметическое n чисел. Синтаксис Алгола-60 сформировал стандарт для всех последующих языков программирования
1.4.1 ПРИМЕРЫ ПРОГРАММ НА ALGOL 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 Максимальный элемент матрицы a, размера n на m

передаётся в виде результата в y, а его индексы — в

параметры i и k;

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 17

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 18

end p;


integer i; integer array s [1:10];

p (i, s[i])

end

В соответствии с определением способа передачи параметров по



имени, вызов процедуры p в данном случае должен приводить к обнулению

всех элементов массива s. Такое использование передачи параметра по имени

было названо «трюком Йенсена» в честь впервые предложившего его

программиста. Фактически для передачи по имени сложных выражений

компилятор должен был создавать специальную неименованную функцию,

вычисляющую это выражение в его собственной среде окружения, так

называемый санк.

Man or boy test

Данный тест был предложен Дональдом Кнутом как средство оценки

реализации языка Алгол-60. Цель теста состояла в том, чтобы отличить

компиляторы, которые правильно реализовывали "рекурсию и нелокальные

ссылки" от тех, которые этого не делали.

begin

real procedure A (k, x1, x2, x3, x4, x5);



value k; integer k;

begin


real procedure B;

begin k:= k - 1;

B:= A := A (k, B, x1, x2, x3, x4);

end;


if k <= 0 then A:= x4 + x5 else B;

end;


outreal (A (10, 1, -1, -1, 1, 0));

end;


Просчитать ответ вручную очень трудно. Правильный ответ в данном

случае -67, несмотря на то, что Кнут попытался просчитать его на бумаге и

получил -121.

Составлена таблица значений при различных k:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

1 0 -2 0 1 0 1 -1 -10 -30 -67 -138 -291 -642 -1446 -3250 19

При больших значениях k, даже современные машины быстро

исчерпывают стековое пространство.

Есть несколько особенностей языка, используемые в этой программе,

которые трудно реализовать должным образом в компиляторе:

1. Вложенные определения функций.

Так как B определяется в локальном контексте A, функция B имеет

доступ к локальным переменным A: k, x1, x2, x3, x4, и x5.

2. Ссылка на функцию.

B в вызове A(k, B, x1, x2, x3, x4) не является вызовом B, но является

ссылкой на B, который вызовется только тогда, когда он появится, как

x4 или x5, в операторе A: = x4+ x5;

3. Правильное определение транслятором класса и типа переменных

x1, x2, x3, x4, и x5, которые не описаны в совокупности

спецификации процедуры. Т.к. возможны два случая: либо вместо

формальных переменных могут стоять числовые константы, либо

ссылка на функцию, определение транслятором одного из вариантов

является нетривиальной задачей.

Правильно реализованный компилятор должен предоставлять

каждому вызову функции B доступ к именно тем локальным

переменным функции A, которая вызов B и породила. Компилятор

"boy" мог бы, например, вместо этого собрать программу так, чтобы B

всегда получила доступ к локальным переменным самого последнего



вызова A.
1.5 ЯЗЫК ПРОГРАММИРОВАНИЯ ALGOL 68
Атмосфера свободного поиска, без давления извне, в которой создавались языки АПЛ и Си, отнюдь не типична для разработок большинства языков программирования. Чаще рождение нового языка сопровождалось горячими дебатами.
В Европе с 60-х годов шли дискуссии вокруг спорных попыток усовершенствовать широко признанный язык программирования Алгол-60. В начале 1962 г. Международная федерация по обработке информации, ИФИП (IFIP, International Federation for Information Processing) сформировала новый комитет по Алголу.
Его задача состояла, во-первых, в разработке подмножества языка, в котором бы отсутствовали редко используемые конструкции Алгола-60, а во-вторых, в создании более совершенного языка преемника.
Хотя задача ставилась вполне определенная, обсуждение было длинным, шумным и бестолковым. В последствии К.А.Р. Хоар из Оксфордского университета, член комитета от Великобритании, поделился своей точкой зрения на шестилетнюю работу комитета.
Поводом для откровений послужила лекция, которую Хоар прочел в 1980 г. при вручении ему Тьюринговской премии, высшей награды за вклад в области информатики, учрежденной Ассоциацией по компьютеризации.
Хоар начал работу в комитете по Алголу, будучи многообещающим молодым программистом в небольшой фирме по производству компьютеров. «Я был рад представившейся мне возможности встретить и услышать мудрость многих оригинальных разработчиков языков, вспоминал он. - Но я был поражен до глубины души и даже обижен их обсуждениями. Очевидно, первоначально разработка Алгола-60 не проходила в том духе бесстрастного поиска истины, который я предполагал, основываясь на качестве языка».
Комитет с горем пополам согласовал требуемое подмножество; настоящие проблемы возникли, когда члены комитета занялись вопросом о языке-преемнике. В 1965 г. Хоар и швейцарский участник Никлаус Вирт (Niklaus Wirth), преподававший в Стэнфордском университете США, предложили умеренно модифицированную версию, которая, по мнению Хоара, «объединяла лучшие свойства Алгола-60 и не содержала его изъянов». Эта версия, получившая название Алгол-W в честь Вирта (Wirth), была в конце концов опубликована и приобрела большую популярность в университетских городках. Но комитет ее отверг.
Последовал ряд других предложений. По словам Хоара, каждое из них было «длинным и толстым документом, полным ошибок, исправляемых в последний момент. Все они описывали одинаково малопонятные, хотя и отличающиеся друг от друга языки». Мало кто из членов комитета воспринял критику Хоара «неясности, сложности и сверхамбициозности» вырабатываемого проекта. «По существу, - говорил Хоар, - члены комитета использовали постоянные задержки в его работе, чтобы втиснуть в будущий язык все более сложные конструкции, вместо того чтобы попытаться упростить его».
«Наконец, в декабре 1968 г., - продолжает Хоар, - в состоянии глубокого уныния я присутствовал на собрании в Мюнхене, на котором готов был родиться наш переношенный монстр, получивший имя Алгол-68». Хоар, Вирт и другие известные ученые высказывались против нового языка.

Они даже набросали небольшой доклад (позднее запрещенный руководством IFIP), где говорилось, что «как инструмент надежного создания сложных программ язык следует признать неудачным».


Как и предсказывалось, Алгол-68 оказался слишком громоздким и в отличие от своего предшественника Алгола-60 не получил признания в Европе. Опытные программисты с трудом понимали даже документ, определяющий новый язык. В течение многих лет только Британский королевский комитет по связи и радиолокации действительно использовал компилятор с Алгола-68.
1.6 ОСОБЕННОСТИ ЯЗЫКА ALGOL 68
Несмотря на схожесть названия и официальную преемственность по отношению к языку Алгол-60, Алгол-68 унаследовал от него лишь некоторые элементы синтаксиса и существенно отличается от языка-предшественника, прежде всего, наличием большого числа дополнительных синтаксических средств и изобразительных возможностей. В частности, он включает встроенные в язык средства организации параллельных вычислений, операции со структурами как с едиными объектами, матричные операции.
Наиболее характерной особенностью синтаксиса Алгола-68 является возможность переопределения синтаксиса и операторов — программист может активно расширять язык в требуемом направлении, создавать собственные операции. Целью включения таких средств в язык было достижение максимальной выразительности и получение возможности удобного описания максимально абстрактных алгоритмов. За эти возможности, а также за наличие мощных операторов для обработки структур и массивов Алгол-68 иногда называют «языком сверхвысокого уровня».
Формально Алгол-68 является процедурным языком программирования, ориентированным на описание последовательности команд, но благодаря развитым средствам описания типов и операций он может быть использован для написания программ практически в любом стиле. Так, в приведённом ниже примере программа на Алголе-68 написана в функциональном стиле.
Эта программа реализует классический алгоритм «Решето Эратосфена» для поиска всех простых чисел меньше 100. nil означает null pointer (нулевой указатель) в других языках. Нотация x of y означает «доступ к x как к элементу struct или union y».
begin # Algol-68 prime number sieve, functional style #
proc error = (string s) void:

(print(( newline, " error: ", s, newline)); goto stop);

proc one to = (int n) list:

(proc f = (int m,n) list: (m>n | nil | cons(m, f(m+1,n))); f(1,n));


mode list = ref node;

mode node = struct (int h, list t);

proc cons = (int n, list l) list: heap node := (n,l);

proc hd = (list l) int: ( l is nil | error("hd nil"); skip | h of l );

proc tl = (list l) list: ( l is nil | error("tl nil"); skip | t of l );

proc show = (list l) void: ( l isnt nil | print((" ",whole(hd(l),0))); show(tl(l)));


proc filter = (proc (int) bool p, list l) list:

if l is nil then nil

elif p(hd(l)) then cons(hd(l), filter(p,tl(l)))

else filter(p, tl(l))

fi;
proc sieve = (list l) list:

if l is nil then nil

else

proc not multiple = (int n) bool: n mod hd(l) ≠ 0;



cons(hd(l), sieve( filter( not multiple, tl(l) )))

fi;
proc primes = (int n) list: sieve( tl( one to(n) ));


show( primes(100) )

end
Ещё одна интересная особенность языка Алгол-68 — его «мультиязычность» — в язык заложена возможность использования различных таблиц трансляции, что позволяет для каждого естественного языка определить свой набор ключевых слов Алгола-68. В результате программисты получают возможность писать программы ключевыми словами родного языка. Ниже приведён пример простейшей процедуры на Алголе-68, выполняющей вычисление даты, следующей за переданной в параметре, на двух языках: английском и немецком.


# Next day date - english variant

mode date = struct(Int day, string month, Int year);

proc the day following = (date x) date:

If day of x < length of month (month of x, year of x)

then (day of x + 1, month of x, year of x)

elif month of x = "December"

then (1, "January", year of x + 1)

else (1, successor of month (month of x), year of x)

fi;
# Nachfolgetag - Deutsche Variante

menge datum = tupel(ganz tag, wort monat, ganz Jahr);

funktion naechster tag nach = (datum x) datum:

wenn tag von x < monatslaenge(monat von x, jahr von x)

dann (tag von x + 1, monat von x, jahr von x)

wennaber monat von x = "Dezember"

dann (1, "Januar", jahr von x + 1)

ansonsten (1, nachfolgemonat(monat von x), jahr von x)

endewenn;

1.7 Выводы по данному периоду развития языков программирования
На заре компьютеризации (в начале 1950-х г.г.), машинный язык был единственным языком, большего человек к тому времени не придумал. Языки низкого уровня мало похожи на нормальный, привычный человеку язык. Большие, громоздкие программы на таких языках пишутся редко. Зато если программа будет написана на таком языке, то она будет работать быстро, занимая маленький объем и допуская минимальное количество ошибок. Чем ниже и ближе к машинному уровень языка, тем меньше и конкретнее задачи, которые ставятся перед каждой командой.

Для спасения программистов от сурового машинного языка программирования, были созданы языки высокого уровня (т.е. немашинные языки), которые стали своеобразным связующим мостом между человеком и машинным языком компьютера. Языки высокого уровня работают через трансляционные программы, которые вводят "исходный код" (гибрид английских слов и математических выражений, который считывает машина), и в конечном итоге заставляет компьютер выполнять соответствующие команды, которые даются на машинном языке.

С появлением языков высокого уровня программисты получили возможность больше времени уделять решению конкретной проблемы, не отвлекаясь особенно на весьма тонкие вопросы организации самого процесса выполнения задания на машине. Кроме того, появление этих языков ознаменовало первый шаг на пути создания программ, которые вышли за пределы научно-исследовательских лабораторий и финансовых отделов.

Подводя итог данному периоду развития языков программирования, можно сделать вывод, что языки программирования высокого уровня (FORTRAN, ALGOL и т.д. ) не похожи на язык ассемблера. Языки высокого уровня разработаны специально для того, чтобы можно было иметь дело непосредственно с задачей, решаемой программой. В этом качестве они иногда называются процедурными языками, поскольку описывают процедуру, используемую для решения задачи. Языки высокого уровня машинно-независимы. Программы же на языке ассемблера непосредственно относятся к той машине, на которой они должны выполняться.

Достоинства языков программирования высокого уровня:


  1. Алфавит языка значительно шире машинного, что делает его гораздо более выразительным и существенно повышает наглядность и понятность текста;

  2. Набор операций, допустимых для использования, не зависит от набора машинных операций, а выбирается из соображений удобства формулирования алгоритмов решения задач определенного класса;

  3. Конструкции операторов задаются в удобном для человека виде;

  4. Поддерживается широкий набор типов данных.

Недостатком языков высокого уровня является больший размер программ по сравнению с программами на языке низкого уровня. Поэтому в основном языки высокого уровня используются для разработок программного обеспечения компьютеров и устройств, которые имеют большой объем памяти. А разные подвиды ассемблера применяются для программирования других устройств, где критичным является размер программы.

2. второй этап развития языков программирования (1960— 1970 гг.)
2.1 Общий обзор исследуемого периода
Период 60-х, 70-х годов положил начало для развития нескольких десятков языков программирования, некоторые из которых применяются и сейчас, правда в учебных целях (например, Basic и Pascal), ведь эти 2 языка уже прожили больше 30 лет, а учебная необходимость в них так и не пропала. Не стоит забывать, что 1974му году мы обязаны за рождение SQL..

Начнем с периода 60-х годов, а именно с 1964-го года, когда компания IBM разработала язык программирования, который бы позволял объединять компьютеры, созданные для разных целей (одни для научных, другие — для бухгалтерских приложений) в одну целую систему, что бы позволило явно упростить работу на разных машинах.


2.2 Язык программирования ПЛ/1
Научные и бухгалтерские программы не только использовали разные компьютеры, но ещё и писались на разных языках: научные — на Фортране, бухгалтерские — в основном на Коболе. Целью ПЛ/1 было создание языка, подходящего для обоих типов приложений. Другой целью было добавление конструкций для структурного программирования, взятых из Алгола-60, не поддерживаемых в то время ни Коболом, ни Фортраном.

Для разработки ПЛ/1 был сформирован комитет, состоящий из программистов IBM и пользователей со всех концов США. Работа комитета длилась несколько месяцев. Изначально планировалось, что ПЛ/1 будет готов к использованию к моменту запуска System/360, но это не было выполнено.

Язык изначально был назван NPL (NewProgrammingLanguage — «новый язык программирования»), но эта аббревиатура уже использовалось британской Национальной физической лабораторией (NationalPhysicsLaboratory). Поэтому название изменили на ПЛ/1.

Поначалу ПЛ/1 вызвал большой энтузиазм, но оказался не так успешен, как планировалось, по следующим причинам:



  • Чрезвычайная сложность языка, в значительной мере потому, что язык был разработан комитетом, пытавшимся найти соглашение и удовлетворить нужды совершенно разных пользователей (научных и банковских).

  • Трудность реализации компилятора, и, как следствие, большое количество сбоев и ошибок и низкое качество первых компиляторов. Это возникало также из-за того, что ПЛ/1 содержал много почти не используемых большинством пользователей возможностей, вроде поддержки многозадачности.

  • Неоптимальность скомпилированного кода, что было очень критично для математических расчётов. Поэтому ПЛ/1 не смог заменить собой Фортран. Асинхронная модификация переменных (например, в результате конструкции onerror) крайне затрудняла оптимизацию.

  • Компиляторы языка ПЛ/1 реализовывали различные подмножества языка, что приводило к непереносимости программ.

Хотя ПЛ/1 и не смог вытеснить Фортран и КОБОЛ (или даже сравниться с ними по популярности), тем не менее, он широко использовался во второй половине 1960-х и в 1970-х годах, особенно для бухгалтерских приложений, в основном из-за отсутствия в то время лучшей альтернативы. Как Фортран, так и КОБОЛ были бедны по своим возможностям даже для задач того времени. ПЛ/1, напротив, представлял богатый набор средств.

Так, проект Multics, одна из первых попыток написать ОС на языке высокого уровня, использовал EPL (Early PL) — диалект ПЛ/1, разработанный в МТИ в 1964 году. Впоследствии для Multics был реализован «настоящий» ПЛ/1. Диалект XPL был использован для создания языка HAL/S, на котором программировались компьютеры космических кораблей проекта «Шаттл». Для ещё одного подмножества — PL/C — в Корнельском университете был создан уникальный компилятор CORC, который мог скомпилировать программу с любыми синтаксическими ошибками, путём исправления многих ошибок и преобразования оставшихся в объектный код (это свойство в значительной степени присуще также компиляторам IBM для мейнфреймов). Первая система резервирования авиабилетов, SABRE, была написана (по крайней мере, её предполагалось написать) на ПЛ/1. Ещё одним диалектом ПЛ/1 был PL/S, на котором фирма IBM написала в начале 1970-х годах операционную систему MVS. IBM до сих пор использует усовершенствованный PL/S (который ныне известен как PL/X) для работы над системами семейства z/OS для IBM System z. На базе ПЛ/1 был разработан язык PL/M, фактически представляющий собой приблизительный аналог языка Си с синтаксисом, близким к подмножеству ПЛ/1. Компилятор языка PL/M был разработан Гари Килдаллом, когда тот работал в Intel и использовался ею для написания операционной системы CP/M и большинства программного обеспечения под CP/M и MP/M. Позже Гари Килдалл основал фирму DigitalResearch, которая продавала компилятор к PL/M для CP/M и MS-DOS, который сам был написан на PL/M. PL/M широко использовался для написания программного обеспечения к компьютерам, использовавшим интеловские процессоры 8080, 8085 и Z-80.

В СССР ПЛ/1 также был популярен в 1970-х и до первой половины 1990-х годов благодаря широкой распространённости ЕС ЭВМ, совместимых с мейнфреймами IBM. Кроме того, ПЛ/1 был реализован на БЭСМ-6 и Эльбрусе.

ПЛ/1 был, вероятно, первым коммерческим языком, компилятор для которого писался на компилируемом языке.

(Подобные экспериментальные языки были и раньше: например, NELIAC был разработан как минимум за 5 лет до ПЛ/1).

2.3 CИНТАКСИС ЯЗЫКА PL/I


  1. Свободный синтаксис

  2. Ключевые слова и идентификаторы нечувствительны к регистру

  3. По умолчанию (в классических мэйнфреймовских версиях — всегда) передача параметров по ссылке

  4. Поддержка сложных структур с объединениями (в терминологии языка Паскаль — записи с вариантами)

  5. Чрезвычайно развитая система встроенных типов данных, при этом возможность неявных преобразований между большинством из них

  6. Несколько видов динамического выделения памяти

  7. Очень обобщенные операторы со многими вариантами синтаксиса

  8. Строго определённая семантика управляющих конструкций

  9. Операции с массивами

  10. Развитый механизм исключительных состояний

  11. Поддержка на уровне языка мультизадачности и асинхронного ввода-вывода

  12. Поддержка на уровне языка сложных методов доступа для ввода-вывода

  13. Очень развитый препроцессор, фактически сам являющийся подмножеством ПЛ/1

Пример программы "Hello world" на ПЛ/1

Test: procedure options(main);

declare My_String char(20) varying initialize('Hello, world!');

put skip list(My_String);

end Test;

2.4 Вывод по данному периоду развития языков программирования
Как мы видим период последнего описанного тридцатилетия положил начало для многих отраслей программирования, в частности, для учебного, были созданы все условия для того, чтобы будущий программист мог легко и постепенно привыкать к языкам программирования, появилось очень много языков, коды которых уже очень далеки от машинных кодов. Все это относится и к рассмотренным выше языкам программирования Algol-60, Algol-68, Pl/1.

ЗАКЛЮЧЕНИЕ

Проанализировав путь развития языков программирования на первых 2-х этапах развития, можно выделить следующие постоянно присутствующие, сменяющие друг друга тенденции:

• Смещение акцентов от частного (программирование деталей), к общему (программирование более крупных компонент)

• Развитие и совершенствование инструментария программиста (языков программирования высокого уровня и рабочей среды)

• Возрастание сложности программных и информационных систем

На данный момент самой важной в развитии языков программирования является тенденция: языки развиваются в сторону все большей и большей абстракции от реальных машинных команд. К чему это приведет? К увеличению скорости разработки программ, повышению уровня надежности программирования, сопровождающиеся при этом падением эффективности. Но это того стоит. С низкой эффективностью можно бороться путем создания более быстрых компьютеров. Если требования к памяти слишком высоки, можно увеличить ее объем. Это, конечно, требует времени и средств, но это решаемо. А вот с ошибками в программах можно бороться только одним способом: их надо исправлять. А еще лучше — не совершать. А еще лучше максимально затруднить их совершение. И именно на это направлены все исследования в области языков программирования. А с потерей эффективности придется смириться.

Можно определенно сказать, что наиболее перспективными являются языки программирования, приближенные к человеческой логике, ЯП которые позволят пользователям действительно общаться с компьютером на ты.

Не малую роль в таком процессе развития языков программирования сыграли языки программирования Алгол и ПЛ-1.

СПИСОК ЛИТЕРАТУРЫ



  1. В.М. Савинков, В.Д. Цальп. Программирование на Алголе.

Москва "Высшая школа" 1975г.

2. http://www.osp.ru/cw/1999/45/38679/ - Трансляторы с Алгола-60

3. http://ru.wikipedia.org/wiki/Algol

4. http://ru.wikipedia.org/wiki/Алгол_68

5. http://ru.wikipedia.org/wiki/JOVIAL

6. http://en.wikipedia.org/wiki/Man_or_boy_test

7. http://www.ershov.ras.ru/archive/eaindex.asp?lang=1&did=2711 -

"Сообщение об Алголе 60".

8. http://www.osp.ru/cw/2006/12/1153964/ - “Золотой век языков”.

9. http://chernykh.net/content/view/209/221/ - Алгол-60

10. http://chernykh.net/content/view/218/231/ - Алгол-68

11. http://www.osp.ru/cw/2004/29/78845/



12. http://schools.keldysh.ru/sch444/MUSEUM/LANR/chisl.htm

13. http://kolpakova-ea.narod.ru/program_languages.html

Поделитесь с Вашими друзьями:


База данных защищена авторским правом ©coolnew.ru 2019
обратиться к администрации

    Главная страница
Контрольная работа
Курсовая работа
Теоретические основы
Лабораторная работа
Методические указания
Общая характеристика
Рабочая программа
Теоретические аспекты
Пояснительная записка
Методические рекомендации
Практическая работа
Дипломная работа
Федеральное государственное
История развития
Основная часть
Учебное пособие
Общие сведения
государственное бюджетное
Теоретическая часть
Физическая культура
Направление подготовки
Самостоятельная работа
История возникновения
Методическая разработка
Практическое задание
Краткая характеристика
квалификационная работа
Выпускная квалификационная
Гражданское право
Название дисциплины
государственное образовательное
бюджетное учреждение
Общие положения
Российская академия
образовательное бюджетное
Уголовное право
теоретические основы
Понятие сущность
Общая часть
Современное состояние
история возникновения
образовательная организация
прохождении учебной
Методическое пособие
Финансовое право
Техническое задание
Правовое регулирование
Финансовое планирование
Фамилия студента
Физические основы
Административное право