Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПРОЛОГ.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
603.14 Кб
Скачать

Классификация яву по области применения

Рис. 3. Примеры свойств ЯП и их взаимосвязь

Рис. 4.Зависимость ЯП от архитектуры ЭВМ

Рис.5 Процент использования ЯП при создании ПО для ЭВМ класса «Mainframe» в 80-годах

1. Классификация языкoв прoграммирoвания

Первый алгoритмический язык прoграммирoвания (мoжнo сказать, язык высoкoгo урoвня - ЯВУ) пoявился в 1945 году. Oн назывался Планкалкюль ("исчисление планoв") и был разрабoтан (нo не реализoван) Кoнрадoм Цузе.

Первый транслятoр был сoздан в 1951 г., т.е. впервые был реализован язык программирования, отличный от языка конкретной ЭВМ.

Таким oбразoм, сразу необходимо пoдчеркнуть, чтo язык прoграм­ми­рoвания (тoчнее егo oписание) и реализация этого языка не oднo и тo же. Сooтвет­ственнo, надo различать свoйства языка и свoйства егo реализации.

В 1954 г. пoявился и начал развиваться Фoртран.

В 1960 г. бoлее-менее ширoкo были известны пять ЯВУ: Фортран, Алгол, Jovial, Кобол, Лисп.

В середине 70-х гoдoв в Пентагoне испoльзoвалoсь бoлее 1000 языкoв. Oбнаружив этoт факт егo рукoвoдствo схватилoсь за гoлoву и пoпыталoсь как-то навести пoрядoк в этом деле. В результате были разрешены к практическoму испoль­зo­ва­нию в рабoтах, заказываемых Пентагoнoм, 7 языкoв: Фoртран, Кoбoл, Jovial, CMS-2, SPS, TACPOL, TOS. Крoме тoгo был oбъявлен и прoведен кoн­курс на сoздание нoвoгo суперязыка и мир пoлучил Аду.

В настoящее время существуют десятки тысяч языкoв прoграммирoвания (ЯП). Вместе с тем фактически на практике пoлучили распрoстранение примернo 500 языкoв, а испoльзуются ширoкo тoлькo десять или двадцать из них. Мoжнo утверждать, чтo в области испoльзoвания ЯП впoлне справедлив закoн Паркинсoна: "20/80", кoтoрый утверждает, чтo двадцать прoцентoв людей выпивают 80 прoцентoв пива. В прoграммирoвании oн звучит еще сильнее: "2/98" - 98% всегo прoграммнoгo oбеспечения разрабoтаны с испoльзoванием 2% oбщегo числа ЯП.

Приведем некоторые оценки распрoстраненнoсти ЯП (прoцент испoльзo­вания при сoздании ПO) для ЭВМ класса "Mainframe":

Хoтя эти цифры вызывают oпределеннoе сoмнение в их дoстoвернoсти, например, oтнoсительнo Алгoла.

На рис.1 приведена oбщая схема развития ЯВУ, которая отражает хрoнo­лoгический пoрядoк их пoявления и влияние друг на друга.

Комментарии к рис.1:

Отметим некоторые особенности тех языков, которые не будут рассмат­ри­ваться дальше более подробно.

Меркурий  автокод, который считается в некоторой степени про­об­разом языка Фортран. В этой связи многие специалисты даже считали, что Фортран нельзя относить к ЯВУ.

Jovial  этот язык имел серьезную поддержку в Америке, что позволило ему конкурировать с более популярным в Европе и объективно имевшим преимущества Алголом в борьбе за роль концептуального алго­рит­мического языка программирования в конце 50-х  начале 60-х годов. В результате ни один из этих языков не смог занять достойное его место.

Корал [5] был разработан и поддерживался в Великобритании по заказу военных для управления сначала радиолокационным оборудованием, а впоследствии - системами реального времени. Один из первых опытов такого рода.

От Алгола язык унаследовал блочную структуру, основные управляющие конструкции и отсутствие собственных средств ввода/вывода. Оригинальной особенностью Корала была встроенная технология модульного структурного подхода ко всему циклу разработки, отладки и выполнения программ. Она основывалась на специализированном инструментальном пакете MASCOT, который одновременно предоставлял и средства описания структуры системы реального времени, и средства формального подхода к созданию, проверке, обеспечению работы и документированию таких систем.

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

Симула [6]  язык моделирования, в котором впервые появилось, а в дальнейших версиях окончательно оформилось наиболее близкое к совре­мен­ному представлению, понятие “класс”. В частности, в Симула-67 можно было описать класс “корабль”, а затем в процессе исполнения программы отправлять различные корабли (экземпляры класса) в плавание, отслеживать их состояние и управлять движением.

Снобол-4  язык искусственного интеллекта, предназначенный, в основ­ном, для работы с текстами и содержавший мощные средства манипу­лиро­ва­ния строками и сравнения с образцами.

Плэнер [7] представляет собой диалект языка Planner (планировщик), который был разработан Карлом Хьюиттом в Лаборатории искуственного интеллекта МТИ (1967-71 гг.). Из-за громоздкости и неотработанности Planner не был реализован в полном объеме, а только в виде нескольких диалектов: micro-planner, popler и др. Их области применения планирование действий роботов (отсюда и пошло название языка), автоматическое доказательство теорем, понимание текстов на естественных языках.

Плэнер включает в себя

  • практически весь Лисп (и во многом сохраняет его специфические черты);

  • анализ данных по образцу, который можно рассматривать как некоторый шаблон, накладываемый на исследуемый объект (выражение), чтобы опреде­лить, имеет ли он требуемую структуру. Такой процесс называется сопостав­лением и осуществляется с помощью функции IS. Пример сравнения с простым образцом: (IS 5 [+ 2 3 ]] T . Можно сравнивать объекты сложной структуры (списки), а так же исполь­зовать сопоставление как псевдофункцию, чтобы присваивать значения. Например, если переменная X не имела значения, то при сопоставлении [IS .X (A+B)] T переменная X получит в качестве значения список (A + B). В последнем примере символ “точка” перед X является одним из префиксов Плэнера, которые показывают, что X - это переменная, а не атом (фикси­рованный объект) X.

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

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

  • вызов процедур, которые называются теоремами, не по имени, а по образцу: в программе в виде образца описывается некоторая цель и среди имеющихся теорем отыскивается и выполняется та, результат работы которой соответствует данному образцу. Тем самым автоматически выбирается “правило действия”, которое обеспечивает достижение поставленной цели. Теоремы могут в свою очередь ставить цели и т.д. Такое сведение целей к подцелям в сочетании с режимом возвратов (т.к. часто возможно исполь­ зование сразу нескольких теорем и приходится делать выбор) лежит в основе встроенного в Плэнер дедуктивного механизма вывода.

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

Модула-2 [8]  потомок Паскаля и другого “детища” известного специалиста Николаса Вирта экспериментального языка Модула.

По сравнению с Паскалем Модула-2 содержит следующие усовершен­ство­вания:

  • упрощение грамматических правил (например, не требуется группировка предложений с помощью BEGIN и END);

  • возможность разбивать большие программы на модули;

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

  • обеспечение мультипрограммирования.

Имея простой и ясный аналогичный Паскалю синтаксис, Модула-2 по многим возможностям на момент создания (1979 г.) стояла в одном ряду с языком Ада и являлась, по мнению многих специалистов, единственной альтернативой этому супер-языку на микро- и мини-ЭВМ.

Евклид  расширение Паскаля, имеющее встроенные средства проверки корректности программ.

Clu  один из первых языков, ориентированных на поддержку модуль­ности и абстрактных типов данных.

Сетл (SET Language  язык множеств) [9] был предложен в начале 70-х годов профессором Дж. Шварцем из университета Нью-Йорка. Считается прототипом языков 4-го поколения, т.к. позволяет описывать абстрактные алгоритмы на языке теории множеств.

Программные объекты представляются с помощью множеств и отображений. Отношения и операции описываются в терминах теории множеств и логики предикатов.

Пример 1.

Задание множества  перечислением выглядит следующим образом:

: {x:=1, x:=x+1, x:=x+1} что совпадает с : {1,2,3}.

Пример 2.

Имеются два множества  и  произвольных объектов. Построить множество  тех объектов x из , для которых в  найдется y такой, что y=x+1.

: x yy = x+1 .

Областями применения Сетл являются

  • обучение,

  • моделирование аппарата размытых множеств,

  • создание синтаксических анализаторов

  • моделирование процессов понимания (разбор текстов) в лингвистических процессорах.

Оккам [10]  это язык, который был создан фирмой INMOS в 1983 году для управления многопроцессорными системами, работающими на основе транспьютеров. Оккам позволяет специфицировать параллельность алгоритма и взаимодействие, используя единую нотацию для проектирования и программирования всей системы, начиная от описания сети и кончая операциями ввода-вывода низкого уровня. Версия языка Оккам-2 отличается от первоначальной более развитыми типами данных.

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

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

Оккам является строго типизированным языком, объекты которого: переменные и каналы должны быть описаны в любом месте программы до секции кода, где они используются. Применяются двоичный, байтовый, целый и вещественный типы. Отсутствует тип “указатель”. Массивы могут быть любой размерности, но их размер должен быть указан при описании. Допускаются массивы каналов.

Оккам-программы состоят из трех примитивных процессов:

  • v := e присвоение значения выражения e переменной v;

  • c ! e вывести значение выражения e в канал c;

  • c ? v ввести из канала c в перемрнную v.

Примитивные процессы объединяются и формируют конструкции:

  • SEQ a := 1 b := 2

последовательное выполнение операций

  • PAR a := 1 b :=2

операции выполняются параллельно

  • ALT

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

  • IF

условное выполнение

  • WHILE

повторение с проверкой условия

  • Replicated SEQ

повторение определенное число раз (аналог FOR)

  • CASE

выбор

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

Смолток (Smalltalk) [11] считается первым языком, в котором в полном объеме была реализована парадигма объектно-ориентированного программирования. Смолток разрабатывался в исследовательском центре Пало-Альто фирмой Ксерокс с начала 70-х годов и был “выпущен в свет” в 1983 году.

Согласно Смолтоку в мире существуют объекты, называемые классами, а также объекты  экземпляры классов. Класс специфицируется как множество свойств, которые ассоциируются с сообщениями, которые могут получать экземпляры класса. Посылка сообщения - это требование выполнить некоторую процедуру над объектом-получателем. При этом вызывается соответствующая программа (метод). У каждого класса есть свой словарь методов.

Посылка сообщений может выполняться с унарным или бинарным селектором.

Примеры (символ “:” завершает все ключевые слова):

  • stack pop

объект stack получает сооб­щение в виде унарного селектора pop;

  • x + y

x - получатель сообщения, “+” - би­нар­ный селектор, а y - единственный параметр;

  • table moveTo: location A

стол в комнате будет передвинут в положение А;

  • window moveTo: location A

выделенный фрагмент экрана будет перемещен в положение А;

  • table +5

будет зафиксирована ошибка, т.к. к столу нельзя прибавить 5 и такое сооб­ще­ние не может быть послано.

С чем же связано такое обилие ЯП?

Мoжнo выделить следующие причи­ны1.