Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие Функциональное и логическое программирование.docx
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
309.57 Кб
Скачать

Функциональные языки

Лисп остаётся наиболее широко используемым функциональным языком. За долгую историю своего развития язык Лисп породил множество диалектов. Несмотря на то, что почти все из них носят названия вида "Some Lisp", разница между ними бывает значительной, не меньше, чем между Алголом и Паскалем или между C и C++. Так что правильнее считать их разными языками.

Предпринимались попытки стандартизировать язык. Наиболее известная из них - стандарт ANSI Common Lisp (см. также CLtL2). К сожалению, язык получился слишком сложным. Его описание содержит более 1000 страниц. Доступны как коммерческие ( Allegro, Harlequin, Corman), так и бесплатные ( GnuCL, CLISP, CMUCL) реализации.

• ISLISP - очень компактный диалект Лиспа, принятый в качестве международного стандарта (ISO). Доступны реализации OpenLisp , TISL, OKI ISLISP.

• EuLisp разрабатывается группой европейских пользователей Лиспа в надежде создать развитую систему программирования, но не такую громоздкую как Common Lisp. Язык всё ещё в стадии разработки, но уже существует несколько реализаций ( EuScheme, Feel, Youtoo) включающие TELOS (The Eulisp Object System - аналог CLOS) .

• Scheme - римейк Лиспа, более простой и даже элегантный язык. Активно используется в исследовательских работах и для обучения. Сторонники Scheme любят подчёркивать, что объем "сообщения о языке" ( R4RS, R5RS ~50 страниц) меньше чем объем указателя к описанию Common Lisp. Существует более 50 реализаций Scheme . Некоторые имеют интегрированные среды ( DrScheme, WinScheme48, 3DScheme и EdScheme). Есть довольно эффективные компиляторы ( Gambit, Bigloo). Для обучения и экспериментов подойдут Scheme48, WinScheme48, XLISP, MzScheme, DrScheme.

• Erlang - интересный язык, разработанный компанией Ericsson. Подобно Лиспу бестиповый, но имеет очень выразительный синтаксис, основанный на сопоставлении с образцом и несколько напоминающий Пролог. Это делает его более легким в освоении. Специфика языка - ориентация на параллельное программирование систем реального времени. Язык включает средства для описания взаимодействующих процессов. Реализация содержит богатую библиотеку и довольно активно развивается.

Два языка из семейства ML: Standard ML и CAML (Categorical Abstract Machine Language). Функциональные языки с "энергичной" стратегией вычислений. Развитая система типов и модулей. Есть и типично императивные средства: присваивания, циклы, обработка исключений. Различия между двумя диалектами в основном синтаксические.

Standard ML:

• Moscow ML - популярный компилятор, созданный на основе CAML Light. Благодаря ему SML стал широко доступным.

• Poly/ML также неплохой инструмент для экспериментов с SML. Предлагается библиотека графического интерфейса, но она пока недостаточно стабильна (по крайней мере Windows версия).

• SML/NJ (Standard ML of New Jersey) - классическая реализация SML. Хорошо оптимизирующий, но довольно громоздкий компилятор.

• MLton обладает примерно теми же достоинствами и недостатками, что и SML/NJ.

• MLj - компилятор в байт-код JavaVM. Реализует подмножество SML и не очень качественно.

• SML.NET – Microsoft SML.

CAML:

• Objective CAML содержит компилятор в байт-код и оптимизирующий компилятор для объектно-ориентированного расширения CAML.

• CAML Light - компилятор в байт-код. В связи с появлением OCAML может считаться устаревшим, но продолжает развиваться. Широко применяется в учебных заведениях, поскольку очень быстр и нетребователен к ресурсам.

• F# - ещё один диалект ML, созданный на основе CAML специально для .NET.

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

• Hugs - интерпетатор Haskell. Для обучения лучше всего выбрать именно его.

• GHC (Glasgow Haskell Compiler) - наиболее эффективный компилятор, но медленный и весьма требователен к ресурсам.

• nhc98 не столь эффективен как ghc, зато предьявляет гораздо меньшие требования к компьютеру.

• HBC похоже заброшен авторами. Включает компилятор с Lazy ML. Самая интересная особенность - библиотека декларативного программирования пользовательских интерфейсов Fudgets. Сейчас она переносится на ghc.

• Mondrian позволяет компилировать код Haskell в MSIL для .NET.

На www.haskell.org есть описание Haskell и учебные материалы. На основе Haskell создано уже немало языков. В основном это расширения языка параллельными (DFH, GPH, pH, Goffin, Eden) или императивными (Mondrian) средствами. Есть попытки добавить возможности ООП ( O'Haskell) или другими способами повысить выразительность системы типов (PolyP, Cayenne). Очень похожий на Haskell язык Clean разработан в Неймегенском университете. Эффективный компилятор и неплохая библиотека (в частности графического интерфейса) делают его вполне пригодным для решения реальных задач.