Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 157
Текст из файла (страница 157)
Сравнение функциональных и императивных ЯЗЫКОВ Перейдем к краткому обсуждению преимушеств, некоторые из которых широко признаны, а некоторые — только предполагаются таковыми, функционального программирования и языков функционального программирования. Естественно сравнить функциональное программирование с программированием на императивных языках. Поскольку императивные языки основаны непосредственно на неймановской архитектуре компьютеров, программисты, используя их, должны иметь дело с управлением переменными и присваиванием значений этим переменным. В результате возрастает эффективность выполнения программ, но затрудняется их создание. В функциональном языке программисту не нужно связываться с переменными, поскольку в нем не требуется абстрактно представлять ячейки памяти.
Одним из результатов такого подхода является снижение эффективности выполнения программы. Другой результат, однако, заключается в более высоком уровне программирования, для которого требуется меньше усилий, чем при программировании на императивном языке. Многие думают, что это определенно является преимушеством функционального программирования. 610 Глава 14.
Функциональные языки программирования Функциональные языки могут иметь очень простую синтаксическую структуру. Примером этого является структура списка в языке ЬБР. Синтаксис императивных языков намного сложнее. Семантика функциональных языков также может быть простой по сравнению с семантикой императивных языков. Параллельное выполнение программ в императивных языках трудно проектировать и использовать. Рассмотрим модель задач в языке Аоа, в котором ответственность за взаимодействие межлу параллельно выполняемыми задачами возлагается на программиста. Функциональные программы могут выполняться путем предварительного перевода их в форму графов. Эти графы затем выполняются с помощью редукции графов, которая осуществляется большей частью параллельно, хотя это не было указано программистом. Представление программ в виде графов естественным образом раскрывает много возможностей для парачлельного выполнения.
Синхронизация взаимодействия в этом процессе не входит в обязанности программиста. Дальнейшее описание этого процесса выходит за рамки нашей книги. В императивном языке программирования программист должен выполнить статическое разбиение программы на параллельно выполняемые части, которые затем оформляются в виде задач. Это может быть сложным процессом. Программы на функциональных языках программирования могут динамически разделяться на параллельно выполняемые части системой выполнения программ, что делает этот процесс очень хорошо приспособленным к аппаратному обеспечению, на котором он должен выполняться. Анализ параллельных программ на императивных языках намного сложнее. Математические функции представляют собой именованные или неименованные отображения. использующие только условные выражения и рекурсию для управления их вычислениями.
Сложные функции можно построить с помощью функциональных форм, в которых функции используются как параметры, возвращаемые значения или и в том, и в другом качестве. Языки функшюнального программирования моделируют математические функции. В чиствм виде они не используют переменные или операторы присваивания лля получения результатов; вместо этого для управления выполнением программы они применяют функции, условные выражения и рекурсию, а также функциональные формы для построения сложных функций. Язык ЬБР появился как чисто функциональный язык программирования. однако вскоре он приобрел много свойств императивных языков, добавленных в него для того, чтобы повысить эффективность и облегчить использование.
Первая версия языка ЬБР возникла, поскольку в приложениях, связанных с созданием искусственного интеллекта, был необходим язык обработки списков. Язык ЬБР до сих пор остается наиболее широко используемым языком в этой области. Первая реализация языка ЬБР была связана со счастливым случаем.
Исходная версия функции ЕуАЬ была разработана исключительно лля демонстрации того, что можно написать универсальную функцию языка ЬБР. Поскольку и данные и программы на языке ЬБР имеют одинаковую форму, можно получить программу, создающую другую программу. Наличие функции ЕЧАЬ позволяет выполнять такие программы немедленно. 611 Резюме Язык БсЬеше — относительно простой диалект языка (.!БР. использующий исключительно статические области видимости. Полобно языку (.!БР к элементарным языковым конструкциям языка БсЬеше относятся функции для построения и разбиения на части списков, для условных выражений, а также простые предикаты для чисел, символов и списков. Язык БсЬеше обладает такими императивными операциями, как изменение элемента в заданном списке.
Язык СОММОХ (.1БР— это большой язык, основанный на языке !.1БР, который был разработан лля того, чтобы включить большинство свойств диалектов языка 1.1БР, возникших в начале 1980-х голов. Он допускает и статический, и динамический обзор данных, а также обладает многими императивными свойствами. Язык М(.— зто язык функционального программирования, имеющий статический обзор данных и строго типизированный. Он использует синтаксис, более похожий на синтаксис языка Рааса!, чем на синтаксис языка 1.1БР.
Язык МЬ содержит систему вывода типов и обработку исключительных ситуаций и позволяет реализовывать абстрактные типы данных. Язык Назйей похож на язык М(., но является чисто функциональным языком; он не имеет переменных и операторов присваивания. Все выражения на языке НазЬе!! вычисляются с помощью ленивого метода. С помощью полных списков язык НазЬе!! позволяет программам работать с бесконечными списками.
Первоначальной областью применения языка 1.1БР было создание искусственного интеллекта, однако он успешно использовался во многих других областях. Несмотря на возможные преимушества функциональных языков программирования над императивными языками, низкая эффективность выполнения программ, написанных на этих языках, на машинах с неймановской архитектурой во многих случаях не позволила рассматривать их в качестве замены императивных языков.
Впервые язык (.1БР был опубликован в работе ЧсСапЬу (1960). Версии, широко использовавшиеся с середины 1960-х до конца 1970-х годов, описаны в работах ЧсСапЬу е! а!. (1965) и %е(зшапп (1967). До некоторой степени стандартная современная версия языка СОММОЫ 1.1БР была описана в работе Б!ее!е (1984). Язык БсЬеше вместе с некоторыми своими новшествами и преимуществами обсуждался в работе йеез апг! С!1пйег (1986). Работа Г)уЬч18 (1996) является хорошим источником информации о программировании на языке БсЬеше. Язык МЬ описан в работе М11пег е! а!. (1990). Книга Ы1шап (!994) представляет собой прекрасный учебник по введению в язык М(..
Программирование на языке Найе(1 описано в работе ТЬошрзоп (1956). Детальное обсуждение функционального программирования можно найти в работе Непдегзоп (1980). Процесс реализации функциональных языков с помощью редукции графов подробно рассматривается в работе Реугоп 3опез(1987). 612 Глава 14. Функциональные языки программирования Дайте опрелеление фтнкционитьнок формы и прозрачности ссылок. Какие типы данных были частью исхолного языка Е!5Р? 1.
2. В чем заключается разница межд> ф>нкциями 53:, ЕГ'? и =". 3. 4. В чем заключается разница межлу методом вычислений БЕЕ:ИЕ. используюшим специальную форму языка 5спете, и методом вычислений, использующим элемен- тарные функции' ! 5. Каковы два вила функции )>ЕЕ:5Е? Опишите семантику функции СОИ!). Опишите семантику функции ЕЕТ. б. 7. Для чего во многие диалекты языка Е15Р были добавлены императивные свойства? В чем языки СОММОХ Е!5Р и 5сйеше противоположны друг другу? Какие правила видимости переменных используются в языке 5сйете? В языке СОММО)Ч1 !5Р? В языке М)? В языке Наз)се)!? 8. 9. 1О.
Назовите три особенности. которые отличают язык М! от языка 5спепзе. Что представляет собой вывол типов. используемый в языке МЕ? Назовите три особенности, которые значительно отличают язык Наз!сей от языка 5сйеше? 11. 12. 13. 14. В чем заключается смысл ленивых вычислений? Напишите на языке 5спеше функцию. которая получает список в качестве пара- метра и возврашает его. улачив из него второй от начала элемент.
Если заданный список не содержит хотя бы двух элементов. функция должна возврашать пустой список (). 613 Упраживния Напишите функцию на языке 5с)зете, возврашаюшую список, составленный в об- ратном порядке по сравнению с простым списком, являюшиися ее параметром. Напишите предикатную функцию на языке йспеше лля проверки структурной эк- вивалентности двух заданных списков. Два списка называются структурно эквива- лентными, если они имеют олннаковую структуру, несмотря на то. что их атомы могут отличаться лруг от друга. Напишите функцию на языке 5с)зеше. возврашаюш>ю объединение двух простых списков.