Основы функционального программирования/Вводная лекция: различия между версиями

м
Добавлены ссылки, убраны повторные ссылки
м (Кавычки "" -> «», пробелы т.д. -> т. д.)
м (Добавлены ссылки, убраны повторные ссылки)
 
*<math>P (x_{1},\, x_{2},\, \ldots, \,x_{n})</math> — некоторая процедура.
*<math>x_{1} = a_{1},\:; x_{2} = a_{2}</math> — известные значения параметров.
*<math>x_{3},\, \ldots,\, x_{n}</math> — неизвестные значения параметров.
 
'''2.&nbsp;Построение математического описания функций.'''
 
Пусть имеется программа <math>P</math>. Для неё определены входные значения <math>\langle x_{1},\, \ldots,\, x_{n} \rangle</math> и выходные значения <math>\langle y_{1},\, \ldots,\, y_{m} \rangle</math>. Требуется построить математическое описание функции
 
<center><math>f : D_{x_{1}} \times \ldots \times D_{x_{n}} \rightarrow D_{y_{1}} \times \ldots \times D_{y_{m}}</math>.</center>
В этом разделе приведено краткое описание некоторых языков функционального программирования (очень немногих). Дополнительную информацию можно почерпнуть, просмотрев ресурсы, перечисленные в следующем разделе.
 
#'''[[w:Лисп|Лисп]]''' (List processor). Считается первым функциональным языком программирования. Поддерживает [[w:Динамическая типизация|динамическую]] и факультативно [[w:Статическая типизация|статическую типизацию]]. Содержит массу императивных свойств, однако в общем поощряет именно функциональный стиль программирования. При вычислениях использует вызов-по-значению. В стандарт [[w:Common Lisp|Common Lisp]] входит [[w:CLOS|Common Lisp Object System (CLOS)]] - объектная система Common Lisp, которая по многим параметрам превосходит объектные системы в других языках (поддерживает метаобъектный протокол, [[w:Мультиметод|мультиметоды]] и т.&nbsp;д.).
#'''[[w:ISWIM|ISWIM]]''' (If you See What I Mean). Функциональный язык-прототип. Разработан Питером Ландиным в 60-х&nbsp;годах XX&nbsp;ве́ка для демонстрации того, каким может быть язык функционального программирования. Вместе с языком П.&nbsp;Ландин разработал и специальную [[w:Виртуальная машина|виртуальную машину]] для исполнения программ на ISWIM’е. Эта виртуальная машина, основанная на вызове-по-значению, получила название [[w:SECD-машина|SECD-машины]]. На синтаксисе языка ISWIM базируется синтаксис многих функциональных языков. На синтаксис ISWIM похож синтаксис ML, особенно Caml.
#'''[[w:Scheme|Scheme]]'''. Диалект Lisp’а, предназначенный для научных исследований в области computer science. При разработке Scheme был сделан упор на элегантность и простоту языка. Благодаря этому язык получился намного меньше, чем Common Lisp.
#'''[[w:ML|ML]]''' (Meta Language). Семейство строгих языков с развитой полиморфной системой типов и параметризуемыми модулями. ML преподаётся во многих западных университетах (в некоторых даже как первый язык программирования).
#'''Standard ML'''. Один из первых типизированных языков функционального программирования. Содержит некоторые императивные свойства, такие как ссылки на изменяемые значения и поэтому не является чистым. При вычислениях использует вызов-по-значению. Очень интересная реализация модульности. Мощная полиморфная система типов. Последний стандарт языка — Standard ML-97, для которого существует формальные математические определения синтаксиса, а также статической и динамической семантик языка.
#'''[[w:Caml Light|Caml]] Light]]''' и '''Objective Caml'''. Как и Standard ML принадлежит к семейству ML. Objective Caml отличается от Caml Light в основном поддержкой классического объектно-ориентированного программирования. Также как и Standard ML строгий, но имеет некоторую встроенную поддержку отложенных вычислений.
#'''[[w:Miranda (язык программирования)|Miranda]]'''. Разработан [[w:Тёрнер, Дэвид|Дэвидом Тёрнером]], в качестве стандартного функционального языка, использовавшего отложенные вычисления. Имеет строгую полиморфную систему типов. Как и ML преподаётся во многих университетах. Оказал большое влияние на разработчиков языка Haskell.
#'''[[w:Haskell|Haskell]]'''. Один из самых распространённых нестрогих языков. Имеет очень развитую систему типизации. Несколько хуже разработана система модулей. Последний стандарт языка — Haskell-98.
#'''Gofer''' (GOod For Equational Reasoning). Упрощённый диалект Haskell’а. Предназначен для обучения функциональному программированию.
#'''Clean'''. Специально предназначен для параллельного и распределённого программирования. По синтаксису напоминает Haskell. Чистый. Использует отложенные вычисления. С компилятором поставляется набор библиотек (I/O libraries), позволяющих программировать графический пользовательский интерфейс под [[w:Windows API|Win32]] или MacOS[[w:Mac OS|Mac OS]].
 
=== Сайты о функциональном программировании ===
#[http://cm.bell-labs.com/cm/cs/what/smlnj/ http://cm.bell-labs.com/cm/cs/what/smlnj/] — Standard ML of New Jersey. Очень хороший компилятор. В бесплатный дистрибутив помимо компилятора входят утилиты MLYacc и MLLex и библиотека Standard ML Basis Library. Отдельно можно взять документацию по компилятору и библиотеке.
#[http://www.harlequin.com/products/ads/ml/ http://www.harlequin.com/products/ads/ml/] — Harlequin MLWorks, коммерческий компилятор Standard ML. Однако в некоммерческих целях можно бесплатно пользоваться версией с несколько ограниченными возможностями.
#[http://caml.inria.fr/ http://caml.inria.fr/] — институт INRIA. Домашний сайт команды разработчиков языков Caml Light и Objective Caml. Можно бесплатно скачать дистрибутив Objective Caml, содержащий интерпретатор, компиляторы [[w:Байт-код|байт-кода]] и машинного кода, Yacc и Lex для Caml, [[w:Отладчик|отладчик]] и [[w:Профайлер|профайлер]], документацию, примеры. Качество компилированного кода у этого компилятора очень хорошее, по скорости опережает даже Standard ML of New Jersey.
#[http://www.cs.kun.nl/~clean/ http://www.cs.kun.nl/~clean/] — содержит дистрибутив компилятора с языка Clean. Компилятор коммерческий, но допускается бесплатное использование в некоммерческих целях. Из того, что компилятор коммерческий, следует его качество (очень быстр), наличие среды разработчика, хорошей документации и стандартной библиотеки.