Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры_ТП (с рамками)_2013.docx
Скачиваний:
0
Добавлен:
01.01.2020
Размер:
253.1 Кб
Скачать

4. Языки программирования высокого уровня. Поколения и топология языков программирования высокого уровня с примерами (по г. Бучу).

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

1. Перемещение акцентов от программирования отдельных деталей к программированию более крупных компонент.

2. Развитие и совершенствование языков программирования высокого уровня.

Большинство современных коммерческих программных систем существенно сложнее и объемнее, чем их предшественники. Рост сложности обусловил проведение серьезных исследований в области методологии проектирования программных систем; в частности, были разработаны методы декомпозиции, абстрагирования и построения иерархии. Кроме того, были созданы более выразительные языки программирования. Возникла тенденция перехода от процедурных языков программирования (описывающих действия) к декларативным языкам (описывающим ключевые абстракции проблемной области). Вэгнер следующим образом сгруппировал наиболее известные языки программирования высокого уровня в их поколения:

Первое поколение (вторая половина 50-ых годов):

FORTRAN I; ALGOL-58; Flowmatic; IPL V – все это математические формулы.

Второе поколение (начало 60-ых годов):

FORTRAN II: Подпрограммы, раздельная компиляция; ALCOL-60: Блочная структура, типы данных; COBOL: Описание данных, работа с файлами; Lisp: Обработка списков, указатели, сборка мусора

Третье поколение (вторая половина 60-ых, до начала 70-ых):

PL/1 (FORTRAN + ALGOL + COBOL); ALGOL-68: более строгий приемник ALGOL-60; Pascal: более простой приемник ALGOL-60; Simula: классы, абстрактные данные

Потерянное поколение (1970-1980) – Много языков созданных, но мало выживших.

Под топологией языков программирования высокого уровня понимаются основные элементы языка программирования и их взаимодействие.

Топология языков первого и начала второго поколения. Для таких языков, как FORTRAN и COBOL, основным строительным блоком является подпрограмма. Программы, реализованные на таких языках, имеют относительно простую структуру, состоящую только из глобальных данных и подпрограмм. В процессе разработки можно логически разделить разнотипные данные, но механизмы языков практически не поддерживают такого разделения. Ошибка в какой-либо части программы может иметь далеко идущие последствия, так как область данных открыта всем подпрограммам. В больших системах трудно гарантировать целостность данных при внесении изменений в какую-либо часть системы. В процессе эксплуатации уже через короткое время возникает путаница из-за большого количества перекрестных связей между подпрограммами, запутанных схем управления, неясного смысла данных, что угрожает надежности системы и определенно снижает ясность программы.

Топология языков позднего второго и раннего третьего поколения. Начиная с середины 60-х годов стали осознавать роль подпрограмм как важного промежуточного звена между решаемой задачей и компьютером. Использование подпрограмм как механизма абстрагирования имело три существенных последствия. Во-первых, были разработаны языки, поддерживавшие разнообразные механизмы передачи параметров. Во-вторых, были заложены основания структурного программирования, что выразилось в языковой поддержке механизмов вложенности подпрограмм и в научном исследовании структур управления и областей видимости. В-третьих, возникли методы структурного проектирования, стимулирующие разработчиков создавать большие системы, используя подпрограммы как готовые строительные блоки.

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