Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 400107.doc
Скачиваний:
5
Добавлен:
30.04.2022
Размер:
568.32 Кб
Скачать
    1. Основные типы языков программирования.

      1. Процедурное программирование

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

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

Процедурные языки характеризуются:

- значительной сложностью;

- отсутствием строгой математической основы;

- необходимостью явного управления памятью, в частности, необходимостью описания переменных;

- малой пригодностью для символьных вычислений;

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

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

      1. Функциональное программирование

Сущность функционального (аппликативного) программирования определяется как способ составления программ, в которых единственным действием является вызов функции, единственным способом расчленения программы на части является введение имени для функции, а единственным правилом композиции - оператор суперпозиции функции. Никаких ячеек памяти, ни операторов присваивания, ни циклов, ни, тем более, блок-схем, ни передачи управления.

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

- классы констант, которыми могут манипулировать функции;

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

- правила построения новых функций из базовых;

- правила формирования выражений на основе вызова функций.

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

- вызовы базовых функций заменяются соответствующими значениями;

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

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

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

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

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

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

Самым первым функциональным языком явился lisp. Цель его создания состояла в удобстве обработки символьной информации. Существенная черта lisp'a - предельная унификация программных структур и структур данных (выражения записываются в виде списков) Язык долгое время рассматривался специалистами как основной язык программирования в области искусственного интеллекта. Lisp послужил стартовой площадкой для разработки языков реализации процедурных моделей знания.

Сейчас известно множество функциональных языков, значительно более мощных, чем lisp Перечислим основные возможности и особенности этих языков, относительно lisp'a:

- простота использования функций высших порядков;

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

- описание функции представляется не единым равенством (правилом, уравнением), а совокупностью условных равенств, накладывающих различные ограничения на структуру аргументов, что ведет к повышению компактности и наглядности программ;

- реализация функциональной трактовки ввод/вывода и работы с файлами (в том числе с базами данных), что обеспечивается подстановкой по необходимости,

- поддержка абстрактных типов данных;

- хороший синтаксис,

- непротиворечивость в математическом смысле (так называемая "проблема отладки" lisp'a затрудняла его параллельную реализацию).

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