Обзор литературы о функциональном программированииАлексей Отт |
Аннотация: За долгую историю развития функционального и декларативного программирования в мире было издано большое количество книг, посвященных теоретическим и практическим аспектам этих тематик, включая описания конкретных языков программирования. Достаточно много книг было издано также и на русском языке.В данной статье сделана попытка провести обзор имеющейся русскоязычной литературы. Кроме того, представлен небольшой обзор существующей англоязычной литературы, имеющей отношение к данным темам. В конце статьи приводится список рекомендуемой литературы как по теоретическим вопросам ФП, так и по конкретным языкам программирования.
1 Литература на русском языке
В 70—80-е гг. в СССР было выпущено достаточно большое количество литературы, касающейся функционального и декларативного программирования. Список книг включает не только переводные книги, но и книги и учебники отечественных авторов, работавших в данных областях. В 90-е годы издание такой литературы практически сошло на нет, но в последние годы эта ситуация стала исправляться — появились переводы хороших зарубежных книг1, а также вышло несколько книг русскоязычных авторов, в том числе и учебники, разработанные специально для вузов2.
Важно отметить, что большая часть описанных ниже старых книг доступна в электронном виде, что облегчает возможность использования их при изучении соответствующих языков программирования.
1.1 Общие вопросы ФП
В данном разделе рассматриваются книги и учебники, не посвященные конкретным языкам программирования, но дающие читателю возможность получить представление о функциональном программировании, его теоретических основах, и часто — о реализации языков.
1.1.1 «Функциональное программирование» (Харрисон/Филд)
В 1993 году издательство «Мир» выпустило перевод достаточно известной книги Functional Programming [17], написанной Петером Харрисоном (Peter G. Harrison) и Антони Филдом (Anthony J. Field) в 1988 году. На русском языке она называется «Функциональное программирование» [92].
Данная книга начинается с рассмотрения функций как таковых и использования функций высшего порядка, а также рассматривает виды вычислений, используемые при функциональном стиле программирования. Для демонстрации приемов программирования в книге вводится язык Hope. Помимо Hope, кратко описываются и другие языки программирования: Lisp, Miranda, FP.
За введением в ФП (функциональное программирование) следует основная часть книги, посвященная вопросам реализации языков программирования, начиная с основ лямбда-исчисления, системы вывода и проверки типов, вопросов интерпретации и компиляции кода, представления данных, сборки мусора, и заканчивая вопросами оптимизации программ (преобразование кода во время компиляции, оптимизация ленивого вычисления данных и т. п.).
Эту книгу можно рекомендовать всем тем, кто хочет не только досконально освоить ФП, но и разобраться во внутреннем устройстве языков программирования.
1.1.2 «Введение в функциональное программирование» (Харрисон)
Данный проект является переводом курса Introduction to Functional Programming [26] Джона Харрисона (John Harrison). Этот курс может использоваться для быстрого ознакомления с основами ФП и семейством языков ML. Он содержит в себе как описание теоретических основ ФП (от лямбда-исчисления до систем типов), так и примеры применения парадигм ФП для решения конкретных задач.
В данном курсе используется язык программирования Caml Light3, входящий в семейство языков ML. По мере прохождения данного курса читатель получает набор знаний, необходимый для освоения данного языка и написания на нем достаточно сложных программ.
Перевод может использоваться как основа курса лекций по ФП — помимо конспектов лекций (lecture notes) в нем содержатся переводы всех сопутствующих слайдов. Последняя версия перевода может быть загружена с сайта проекта.
1.1.3 «Структура и интерпретация компьютерных программ»
В 2006 году был выпущен перевод на русский язык классического учебника MIT по основам программирования «Структура и интерпретация компьютерных программ» [68] (Structure & Interpretation of Computer Programs, SICP[1]). Перевод был выполнен Георгием Бронниковым.
Данная книга содержит материалы по основам программирования; показывает, как с помощью композиции несложных процедур программист может строить сложные программные системы. Особый упор делается на показ преимуществ использования абстракций и модульности программ, а в качестве примеров рассматриваются построение языка программирования, включая компиляцию, обработка символьных данных, бесконечные потоки данных и т. п.
Книга отличается от других учебников тем, что в ней описываются разные подходы к композиции программ, демонстрируются преимущества функционального подхода к построению программ, использование функций высшего порядка и т. п., а в качестве основного языка программирования используется язык Scheme.
Качество перевода книги очень высокое, однако имеются недостатки, связанные с изданием самой книги: она вышла в мягком переплете, и ее не очень удобно читать, имеются проблемы верстки и опечатки, а главное — малый тираж (всего 1000 экземпляров), в связи с чем книгу уже тяжело найти в магазинах. В то же время, ее можно найти в электронном виде.
1.1.4 Учебные курсы проекта «Интуит»
Среди учебных курсов проекта «Интуит» имеется несколько курсов, которые посвящены вопросам функционального и декларативного программирования. Некоторые из них предлагают теоретическое изложение принципов ФП, другие посвящены конкретным языкам программирования. Эти курсы могут стать хорошим подспорьем при изучении ФП, поскольку материал рассчитан на людей, только начинающих знакомиться с соответствующими темами. Практически все курсы содержат задачи и упражнения, выполняя которые можно приобрести практический опыт применения полученных знаний.
В настоящее время опубликованы следующие курсы (материалы некоторых курсов доступны также в печатном виде — книги можно заказать с сайта проекта):
- «Стили и методы программирования» [87] — учебный курс, в котором систематически излагаются сведения о стилях программирования и их методах, а также обсуждаются вопросы сочетаемости различных методов в разработке программ.
- «Язык и библиотеки Haskell 98» — перевод известного учебника A Gentle Introduction To Haskell, описанного ниже, в разделе про Haskell (1.2.2).
- «Введение в программирование на Лиспе» [75] — вводный курс по программированию на языке Lisp с примерами решения задач на этом языке.
- «Основы функционального программирования» [73] — учебник по практическому программированию на языке Lisp.
- «Парадигмы программирования» [74] — курс, рассматривающий различные парадигмы программирования — функциональное, объектно-ориентированное, императивное и другие.
- «Введение в теорию программирования. Функциональный подход» [80] — еще один учебник по ФП. Здесь для примеров используется язык Standard ML.
- «Основы программирования на языке Пролог» [97] — учебный курс по логическому программированию и языку Пролог.
Стоит отметить, что материалы некоторых курсов пересекаются между собой, и некоторые курсы написаны достаточно сложно для самостоятельного изучения4.
1.1.5 «Типы в языках программирования» (Пирс)
Эта книга является переводом известной книги Types and Programming Languages Бенджамина Пирса (Benjamin C. Pierce) [55]. В книге рассматриваются различные аспекты использования типов в языках программирования: математические основы, различные типовые системы, вывод типов и т. д.
Этот перевод, также как и SICP, осуществляется Георгием Бронниковым. Бета-версии книги доступны в электронном виде, текущую версию вы можете найти на сайте проекта. Выход книги в печатном виде планируется после завершения работы над переводом, скорее всего в следующем году.
1.1.6 Другие книги, имеющие отношение к ФП
Помимо описанных выше, на русском языке было издано еще некоторое количество книг, имеющих отношение к функциональному программированию — о математических основах ФП, реализации языков и т. д. Ниже приведен краткий (и, вероятно, неполный) их список:
- В 1992 году был выпущен перевод известной книги Implementing functional languages: a tutorial [38], написанной Simon Peyton Jones & David Lester. На русском языке она называется «Реализация функциональных языков» [76]. Книга посвящена практическим вопросам реализации функциональных языков программирования. К сожалению, в настоящее время найти эту книгу ни в электронном, ни в бумажном виде не удаётся, поэтому доступным остаётся только английский оригинал.
- Перевод книги Питера Хендерсона «Функциональное программирование. Применение и реализация» [93] (Functional Programming: Application and Implementation [29]), вышедший в 1983 году. Книга не только знакомит с основами ФП, но и охватывает более сложные темы, включая тонкости реализации языков программирования (сборка мусора, компиляция кода и т. д.).
- В 1985 году был выпущен перевод книги Х. Барендрегта «Ламбда-исчисление: его синтаксис и семантика» [70] (The Lambda Calculus. Its Syntax and Semantics [4]). Книга посвящена теоретическим аспектам лямбда-исчисления, в ней рассматриваются классическое лямбда-исчисление, различные виды редукций и связанные с ними темы.
- Книга С. Маклейна «Категории для работающего математика» [85] (Categories for the Working Mathematician [44]), выпущенная в 2004 году, посвящена теории категорий, в рамках которой дается определение монад и других понятий и абстракций, нашедших применение в ФП. В книге всесторонне рассматриваются положения и концепции теории категорий.
- Учебное пособие В.М. Зюзькова «Математическое введение в декларативное программирование» [81] рассматривает математические основы декларативного и функционального программирования, лямбда-исчисление и методы доказательства теорем. Для примеров используются языки Prolog и Haskell.
1.2 О конкретных языках
Наряду с книгами, описывающими общие вопросы программирования на функциональных языках и математические основы лямбда-исчисления, в СССР и России издавались и книги по конкретным функциональным и декларативным языкам программирования. Достаточно широко представлена информация о языках Lisp, Haskell и Prolog, но к сожалению практически отсутствует литература по языку Erlang.
![]()
Рис. 1: Генеалогическое дерево семейств функциональных и декларативных языков
1.2.1 Lisp
Языку Lisp, являющемуся самым старым функциональным языком, в СССР было посвящено несколько публикаций (хотя их не так много, по сравнению с языком Пролог).
В 70-х гг. было выпущено сразу несколько книг по Лиспу:
- В 1976 году вышел перевод книги У. Маурера «Введение в программирование на языке ЛИСП» (Maurer W. D., The Programmer’s Introduction to LISP [47]), содержавшей описания языка Лисп и множество примеров и задач на его использование.
- Через год Московским Энергетическим Институтом было издано учебное пособие по программированию на языке Lisp 1.5, написанное Е. Семеновой. Пособие содержит описание языка Lisp 1.5 и примеры его использования для решения учебных задач.
- И в 1978 году была выпущена книга С.С. Лаврова и Г.С. Силагадзе «Автоматическая обработка данных. Язык ЛИСП и его реализация» [83], описывающая язык Лисп и рассматривающая вопросы реализации этого языка.
В 1990 году вышел в свет широко известный двухтомник «Мир Лиспа» [95], являющийся переводом одноименной книги финских авторов Э. Хювёнен и И. Сеппянен. В первом томе содержится описание языка Common Lisp, включая типы данных и наиболее часто используемые функции, ввод и вывод данных, обработку символьных данных и т. п. Кроме того, часть первого тома посвящена введению в методы ФП: использование рекурсии, функций высшего порядка, замыканий и макросов. Второй том содержит введение в другие методы программирования — логическое и объектное, описание среды программирования Лисп, а также большое количество примеров программ на этом языке, включая простой интерпретатор Лиспа.
1.2.2 Логическое программирование и язык Пролог
За последние тридцать лет в СССР (а затем и в России) было выпущено достаточно большое количество книг на темы логического программирования и искусственного интеллекта вообще и языка Пролог в частности (особенно много их было издано в 80-х гг.). Этот далеко не полный список включает следующие книги:
- Иван Братко. «Программирование на языке Пролог для искусственного интеллекта». Первое издание на русском языке вышло в 1990 году [71] . В настоящее время в магазинах доступно третье издание этой книги [72], выпущенное в 2004 году. Первая часть книги полностью посвящена языку Пролог и методам работы с ним, а во второй части рассматриваются прикладные вопросы использования данного языка: построение экспертных систем, решение задач поиска, обучение машин, обработка лингвистической информации и т. п.
- Клоксин У., Меллиш К. «Программирование на языке пролог» [91]. Эта книга, изданная в 1987 году, содержит только описание языка Пролог и особенностей его использования.
- А. Адаменко, А. Кучуков. «Логическое программирование и Visual Prolog» [69]. Книга издана в 2003 году и содержит небольшое введение в логическое программирование, в то время как основная часть книги посвящена вопросам программирования на Прологе с учетом особенностей Visual Prolog.
- Дж. Малпас. «Реляционный язык Пролог и его применение» [86]. Данная книга является подробным описанием языка Пролог и различных приемов программирования на этом языке (обработка текстов, представление знаний); содержит много примеров.
- С. Чери, Г. Готлоб, Л. Танка «Логическое программирование и базы данных» [96]. Книга рассматривает вопросы организации баз данных логических высказываний, включая краткое описание основ логического программирования и языков Пролог и Дейталог.
- Л. Стерлинг, Э. Шапиро. «Искусство программирования на языке Пролог» [89] (The Art of Prolog: Advanced Programming Techniques [62]). Выпущенная в 1990 году, книга английских ученых содержит материалы по теории логического программирования, достаточно подробно описывает язык Пролог и содержит большое количество примеров программирования на этом языке, включая систему для решения уравнений и компилятор простого языка программирования.
- Ц. Ин, Д. Соломон. «Использование турбо-пролога» [82]. Книга содержит описание принципов работы со средой программирования Турбо-Пролог, включая такие вопросы как использование машинной графики, создание многооконного интерфейса и т. п.
- Дж. Макаллистер. «Искусственный интеллект и Пролог на микроЭВМ» [84]. Книга в краткой форме содержит сведения по языку Пролог, логике, базам знаний и экспертным системам. В первую очередь предназначалась для владельцев небольших компьютеров серии Спектрум и т. п.
- Дж. Стобо. «Язык программирования Пролог» [90]. Данная книга является переводом книги «Problem Solving with Prolog» [63] () и описывает язык Пролог и его применение для решения различных задач — построения баз знаний, системы решения задач и других.
- Дж. Доорс, А.Р. Рейблейн, С. Вадера. «Пролог — язык программирования будущего» [77]. Книга содержит краткое описание языка Пролог, практических приемов работы с ним, а также решения некоторых логических задач.
1.2.3 Haskell
В настоящее время количество русскоязычных материалов по языку Haskell невелико. Только в последние годы стали появляться книги об этом языке (упомянутые далее в статье книги Р. Душкина и Н. Рогановой, курсы проекта «Интуит») и появились энтузиасты, работающие над переводом англоязычных книг и статей на русский язык в целях популяризации Haskell среди русскоязычных программистов.
Книги о Haskell Романа Душкина
В 2006—2007 гг. Роман Душкин, читавший в МИФИ в 2001—2006 гг. курсы по ФП, выпустил две книги, посвященные языку программирования Haskell.
Первая из них называется «Функциональное программирование на языке Haskell» [78] и является учебником по ФП, с примерами на языке Haskell, и используется в ряде вузов в качестве учебного пособия по ФП. В книге рассматриваются основы лямбда-исчисления, принципы построения программ на функциональных языках, а также описывается круг типовых задач, для которых использование функциональных языков является целесообразным. Использование монад, ввод/вывод данных, классы типов (включая стандартные классы языка Haskell) и другие вопросы иллюстрируются примерами на языке Haskell. В последних двух главах рассматриваются вопросы построения трансляторов и имеющиеся в Haskell средства для этого, а также обсуждаются подходы к решению некоторых задач искусственного интеллекта на языке Haskell.
Стоит отметить, что книга содержит достаточно большое количество математики и написана суховатым языком, что делает ее излишне теоретизированой с точки зрения программиста-практика и затрудняет восприятие. Кроме того, в книге не так много примеров, которые показывали бы применимость языка в повседневной разработке (если сравнивать с книгой Real World Haskell, которая является хорошим образцом в этом деле). Еще одной вещью, затрудняющей чтение книги является качество издания — верстки самой книги и бумаги, на которой она напечатана.
Вторая книга этого же автора называется «Справочник по языку Haskell» [79] и является дополнением к первой. Книга предназначена для читателей, уже знакомых с основами языка Haskell, поэтому она не должна рассматриваться как учебник по этому языку. Она содержит краткое описание синтаксиса языка Haskell, основных типов данных, а также (что важно!) основные приемы программирования на этом языке — использование различных видов рекурсии, функций высшего порядка и анонимных функций, защитных выражений и т. д.
Основная часть книги посвящена стандартным библиотекам, входящим в состав Hugs98 & GHC: начиная с Prelude и включая основные библиотеки (Control, System, Data, Text). Для каждой библиотеки приводится описание определенных в ней типов, классов и функций. Приводимые в справочнике определения функций могут использоваться в качестве примеров по написанию «правильного» кода на Haskell и являются хорошим подспорьем в работе.
«Функциональное программирование» (Роганова)
В 2002 году Институт ИНФО издал учебное пособие Н.А. Рогановой под названием «Функциональное программирование» [88]. В данном пособии основной упор делается на практическое применение ФП для решения конкретных задач (автор выбрала задачи обработки структур данных и различные математические задачи). В нем практически нет теории, изобилующей математикой, что отличает его от других учебников по ФП. Все вводимые понятия иллюстрируются примерами на языке Haskell, который описан достаточно подробно, поэтому данное учебное пособие можно рассматривать в качестве начального по данному языку.
К недостаткам пособия можно отнести то, что отсутствие материала по теоретическим основам ФП (лямбда-исчисление и т. п.) требует изучения дополнительных материалов (которые, к сожалению, не указаны в списке литературы). Кроме того, в части описания языка Haskell мало внимания уделено таким вопросам, как ввод/вывод данных, разбор данных и т. п.
Переводы документации
М. Ландина и В. Роганов в 2005 году выполнили перевод The Haskell 98 Report [39] — основного документа, который определяет синтаксис языка Haskell, а также состав основных библиотек этого языка. Перевод этого документа доступен с сервера haskell.ru как в варианте для печати, так и в online-версии.
Еще одна группа энтузиастов выполнила перевод на русский язык хорошо известного учебника по языку Haskell — Gentle Introduction To Haskell [33]. Данный учебник описывает основные возможности языка Haskell и наиболее часто используемые функции стандартных библиотек, включая ввод и вывод, и может использоваться для изучения основ языка. Перевод учебника доступен с сервера RSDN [94] и состоит из двух частей — часть 1 и часть 2.
1.2.4 Семейство языков ML
О семействе языков ML (Standard ML, Objective Caml, Caml Light) на русском языке существует сравнительно немного литературы. В качестве небольшого введения в программирование на языке Caml Light можно использовать курс лекций «Введение в функциональное программирование», описанный выше (1.1.1).
Кроме того, существует незаконченный перевод книги Developing Applications With Objective Caml [8] — переведено 11 глав, описывающих сам язык OCaml и базовые библиотеки, их можно использовать в качестве учебника по данному языку.
1.3 Планируется выпустить
Книга Сергиевского и Волчёнкова «Декларативное программирование» в настоящее время находится в процессе издания и должна появиться к концу этого года. Книга предназначена для использования в учебных заведениях. Она рассматривает вопросы функционального и логического программирования, включая теоретические вопросы ФП, доказательство свойств программ и т. д. Для примеров используются языки Lisp и Haskell. Отдельная часть учебника посвящена вопросам логического программирования с использованием языка Prolog.
Другие авторы также ведут работу над несколькими книгами, посвященными Haskell. Одна из них касается вопросов создания специализированных языков программирования (DSL) средствами языка Haskell, включая создание синтаксических анализаторов, а также ряда связаных с этим тем. Еще одна книга будет посвящена практическим аспектам использования Haskell с целью показать применимость языка Haskell для решения «реальных» задач.
Также в последнее время ведется работа над переводом на русский язык книги Practical Common Lisp. Книга содержит достаточно подробное введение в язык Common Lisp и содержит большое количество практических примеров, которые помогают начать использование этого языка в повседневной работе. Работа над переводом находится в заключительной стадии, а переведенный материал доступен на сайте проекта.
2 Англоязычная литература
На английском языке издано большое количество книг по ФП, его теоретическим основам, а также функциональным языкам программирования. Хотя некоторые книги и были переведены на русский, количество публикаций на английском языке гораздо больше. Краткие рецензии на некоторые из них приведены в этом разделе.
2.1 Общие вопросы ФП
В данном списке собраны книги, посвященные общим вопросам разработки ПО на функциональных языках, а также теоретическим вопросам ФП:
- Книга Programming Languages: Application and Interpretation [42] является учебником для курса «Языки программирования». В ней рассматриваются различные аспекты проектирования и разработки языков программирования. Для примеров используется язык Scheme.
- Purely Functional Data Structures [50] — отличная книга Криса Окасаки (Chris Okasaki) в которой описываются методы работы со сложными структурами данных в «чистых» функциональных языках.
- Книга The Functional Approach to Programming (Guy Cousineau, Michel Mauny) [11], описывающая все основные вопросы ФП, может использоваться в качестве учебника по ФП. Для примеров используется язык Caml.
- В книге Algorithms: A Functional Programming Approach [57] рассматриваются вопросы реализации различных алгоритмов на «чистых» функциональных языках, включая некоторые темы, описанные в книге «Purely Functional Data Structures». Для примеров используется Haskell.
- Книга Advanced Programming Language Design [18] (online-версия) содержит информацию о разных подходах к программированию, в том числе и несколько глав о функциональном и логическом программировании.
- Книга How to Design Programs: An Introduction to Programming and Computing [15] (имеющаяся в свободном доступе и поставляемая вместе с PLT Scheme), является учебником по программированию, демонстрирующим различные подходы к разработке программ. Для примеров в книге используется язык Scheme.
- Basic Category Theory for Computer Scientists [54] — данная книга рассматривает теорию категорий, лежащую в основе некоторых приемов, используемых в ФП (в частности, монад в языке Haskell).
2.2 Реализация языков программирования
Вопросы реализации функциональных языков программирования рассматриваются в некоторых описанных выше книгах, посвященных теории ФП, но кроме этого, существуют книги, посвященные исключительно вопросам реализации таких языков программирования:
- Книга Design Concepts in Programming Languages [66] посвящена теоретическим и практическим аспектам разработки языков программирования.
- Книга The Implementation of Functional Programming Languages [37], написанная Simon Peyton Jones и изданная в 1987 году, описывает такие темы, как лямбда-исчисление, вывод и проверка типов, сопоставление с образцом (pattern-matching), и использование этих приемов при реализации функциональных языков программирования.
- Книга Implementing functional languages: a tutorial [38], написанная Simon Peyton Jones & David Lester и изданная в 1992 году, рассматривает вопросы реализации функциональных языков программирования на примере реализации простого языка.
- Книга Garbage Collection: Algorithms for Automatic Dynamic Memory Management [36] посвящена описанию применяемых в функциональных языках программирования технологий «сборки мусора».
2.3 Конкретные языки ФП
Ниже перечислены наиболее интересные книги на английском языке, посвященные конкретным функциональным языкам программирования.
2.3.1 Haskell
Среди публикаций, посвященных языку Haskell, я хотел бы отметить следующие:
- Introduction to Functional Programming using Haskell Ричарда Бёрда [5] является учебником ФП, использующим Haskell в качестве основного языка. В нем рассмотрены базовые концепции ФП и их применение в Haskell. Книга содержит много примеров и упражнений для самостоятельного решения.
- Real World Haskell [51] является отличной книгой по языку Haskell, поскольку, кроме описания самого языка, содержит множество примеров, показывающих применение Haskell в реальной жизни: программирование баз данных и графических интерфейсов, разбор данных, тестирование приложений и многое другое. Эта книга находится в свободном доступе на официальном сайте.
- The Haskell Road To Logic, Maths And Programming [13] показывает применение Haskell в математике и логике.
- Programming in Haskell [34], написанная Graham Hutton, описывает язык Haskell немного суховато, но может использоваться в качестве справочника теми, кто уже знаком с этим или другими функциональными языками, например, OCaml или Standard ML.
- Книга Haskell: The Craft of Functional Programming [65] посвящена описанию языка Haskell и принципов программирования на нем и включает отдельные главы по работе с типами данных, классами типов и т. п.
- The Haskell School of Expression: Learning Functional Programming through Multimedia [32] показывает практические аспекты применения Haskell, при этом описывает достаточно сложные темы, такие как взаимодействие с внешним миром, проектирование программ на Haskell и т. д.
Кроме напечатанных книг и учебников, имеются и материалы, доступные online. К наиболее интересным можно отнести:
- Раздел на сайте проекта Wikibooks, посвященный Haskell, содержит очень большое количество материалов различной степени сложности.
- A Gentle Introduction to Haskell 98 [33] — учебник по языку Haskell 98.
- Yet Another Haskell Tutorial [35] — еще один учебник по Haskell, содержащий примеры использования языка и упражнения для самостоятельного решения.
- Write Yourself a Scheme in 48 Hours — данный учебник позволяет получить навыки программирования на Haskell на практическом примере написания интерпретатора языка Scheme.
- All About Monads — учебник, посвященный теории и вопросам практического применения монад в Haskell.
2.3.2 Erlang
Книга Programming Erlang. Software for a Concurrent World [2], написанная Джо Армстронгом (Joe Armstrong), является практически единственным доступным печатным изданием, посвященным языку Erlang, поскольку выпущенная ранее книга «Concurrent Programming in Erlang» [3] стала уже библиографической редкостью (в интернете можно найти первую часть этой книги). «Programming Erlang» описывает язык простым языком и знакомит читателя с его основным функционалом. Кроме самого языка, книга описывает более сложные темы: базы данных, использование OTP и т. п.
Кроме того, в этом году планируется выпуск следующих книг, посвященных как самому языку Erlang, так и применению его в конкретных задачах:
- Erlang Programming [7],
- Concurrent Programming with Erlang/OTP [46],
- Erlang Web Applications: Problem-Design-Solution [23].
2.3.3 Caml & Objective Caml
Вопросам программирования на языке Objective Caml (OCaml) посвящено несколько книг.
Наиболее известной является свободно доступная книга Developing Applications with Objective Caml [8], которая не только описывает сам язык OCaml, но и рассматривает различные вопросы программирования с его использованием.
Недавно также появилась свободно распространяемая книга Introduction to Objective Caml [30], которая содержит достаточно подробное описание языка и примеры его применения.
Книга OCaml for Scientists [27] посвящена вопросам использования OCaml для «научного программирования» — обработки данных, математических вычислений, визуализации данных и оптимизации кода для лучшей производительности.
Еще одна книга — Practical OCaml [60], описывает язык OCaml и приемы программирования на нем. К сожалению, по многочисленными отзывами читателей, книга написана не очень хорошо.
Технический отчет The ZINC experiment: an economical implementation of the ML language [45], написанный Xavier Leroy в 1990 году, представляет собой подробное описание реализации языка ML и может быть интересен тем, кто интересуется внутренним устройством Caml & OCaml.
2.3.4 F#
В настоящее время по языку F# написана серия книг.
Foundations of F# [53] описывает основы языка и показывает разные методы программирования на нем, включая создание пользовательских интерфейсов и работу с базами данных.
Книга Expert F# [64] в свою очередь посвящена более сложным вопросам применения F# для разработки программ, таким как взаимодействие с кодом, написанным на других языках, использование библиотек .Net, разбор данных, асинхронное программирование и т. д.
F# for Scientists [28] является версией книги «OCaml for Scientists», адаптированной для языка F#, и содержит информацию по разным аспектам применения F# в «научном программировании» — визуализации данных, работе с базами данных, обработке данных и т. д.
Также в скором времени планируется выпуск еще нескольких книг, посвященных программированию на языке F# : Beginning F#, The Definitive Guide to F# и Functional Programming for the Real World: With Examples in F# and C#.
2.3.5 Standard ML
По языку Standard ML также выпущено достаточно большое количество книг.
Книга ML for the Working Programmer [52] является практическим введением в этот язык, описывающим сам язык и демонстрирующим некоторые приемы программирования на нем.
Книга The Little MLer [16] является кратким справочником по языку с примерами программ.
Книга «Unix System programming with Standard ML» [59] посвящена демонстрации применимости функциональных языков в повседневной работе.
Книга Elements of ML Programming, ML97 Edition [67], также описывающая сам язык и методы программирования на нем, может использоваться как введение в язык Standard ML.
Несколько книг посвящены изложению стандарта языка. К ним можно отнести книги The Definition of Standard ML [48] и The Standard ML Basis Library [22], которые содержат подробную информацию о языке и стандартной библиотеке.
2.3.6 Lisp
Кроме описанных ранее русскоязычных книг по языку Lisp, существует большое количество книг на английском языке, посвященных Lisp и его диалектам:
- Paradigms of Artificial Intelligence Programming: Case Studies in Common LISP [49] — классическая книга Питера Норвига (Peter Norvig), посвященная вопросам искусственного интеллекта, показывает применение языка Common Lisp для решения некоторых задач искусственного интеллекта.
- ANSI Common Lisp [25], написанная Полом Гремом (Paul Graham), предназначена для начинающих программировать на Common Lisp. Книга содержит описание языка и примеры его использования.
- On Lisp [24], также написанная Полом Гремом, раскрывает более сложные вопросы программирования на Common Lisp: создание макросов, использование макросов для построения domain-specific languages (DSL) и т. п.
- Книги Object-Oriented Programming in Common Lisp: A Programmer’s Guide to CLOS [40] и The Art of Metaobject Protocol [41] содержат подробную информацию о программировании с использованием Common Lisp Object System. При этом, вторая книга в большей степени посвящена вопросам реализации Metaobject Protocol, лежащего в основе CLOS, и рекомендуется всем, кто интересуется вопросами объектно-ориентированного программирования (ООП).
- Книга Let Over Lambda [31] посвящена рассмотрению сложных тем программирования на Common Lisp — созданию и использованию макросов, правильному проектированию программ и т. п.
- Книга Common Lisp: The Language, 2ed [61] (также доступна online) является полным справочником по языку Common Lisp.
- Successful Lisp: How to Understand and Use Common Lisp [43] — еще одна книга для начинающих программировать на Lisp’е. Книга также имеет online версию.
- Lisp in Small Pieces [56] — достаточно известная книга по Lisp. В ней рассматриваются реализации языков Lisp и Scheme, включая программирование с использованием продолжений5, построение интерпретатора и компилятора этих языков, поддержку макросов и многое другое.
2.3.7 Scheme
По языку программирования Scheme также выпущено несколько книг, в настоящее время можно купить следующие из них:
- The Little Schemer [21],
- The Reasoned Schemer [19],
- The Seasoned Schemer [20],
- The Scheme Programming Language, 3ed [14].
Книги описывают как сам язык, так и различные аспекты его использования. Эти книги могут использоваться как справочники по языку и являются хорошим дополнением к книгам Structure and Interpretation of Computer Programs [1] и How to Design Programs [15], в которых язык Scheme использован для примеров.
2.3.8 Prolog
Количество англоязычных книг по Прологу достаточно велико. Ниже приведен лишь небольшой список имеющейся литературы — я старался отобрать наиболее интересные книги:
- Logic Programming with Prolog [6] — хорошая книга по Prolog начального уровня. В ней описываются основные принципы программирования на Prolog вместе с примерами решения конкретных задач.
- Книга The Art of Prolog, Second Edition: Advanced Programming Techniques [62] посвящена вопросам использования языка, которые обычно не рассматриваются в книгах, предназначенных для изучения самого языка: построение интерпретаторов и компиляторов, преобразование программ, теории логического программирования.
- Programming in Prolog: Using the ISO Standard [9] — еще один учебник по Прологу, демонстрирующий основные принципы программирования на этом языке.
- Clause and Effect: Prolog Programming for the Working Programmer [10] является небольшим введением в Пролог для программистов, владеющих другими языками.
- Prolog Programming in Depth [12] — еще одна книга, посвященная «сложным» аспектам применения Пролога: взаимодействию с внешним миром, императивному программированию на Прологе, построению экспертных систем и т. п.
3 Рекомендации
Если вы хотите познакомиться с принципами создания функциональных языков программирования, то на русском языке базовую информацию вы почерпнете из книг «Функциональное программирование» [92], «Функциональное программирование. Применение и реализация» (Хендерсон) и «Реализация функциональных языков». Из книг на английском языке я могу порекомендовать книги, перечисленные в разделе «Реализация функциональных языков программирования (2.1)».
Заинтересовавшиеся Common Lisp могут начать его изучение с книги Practical Common Lisp [58] (существующей и на русском языке), которая даст информацию по основным аспектам языка. Более сложные аспекты работы с Lisp описаны в On Lisp [24], The Art of Metaobject Protocol [41], Let Over Lambda [31], Lisp in Small Pieces [56] и других англоязычных книгах (2.3.5).
Для обучения функциональному программированию на языке Haskell можно порекомендовать книгу «Introduction to Functional Programming using Haskell» Ричарда Бёрда [5]. Для желающих узнать о практическом применении Haskell хорошим выбором будет книга Real World Haskell [51], в которой приводятся практические примеры использования Haskell. Среди учебников можно отметить Yet another Haskell tutorial [35] и A Gentle Introduction to Haskell 98 [33] (также доступный на русском языке), ну и конечно раздел о Haskell в проекте Wikibooks.
В настоящее время по языку Erlang доступно не так уж много литературы — только книга Programming Erlang. Software for a Concurrent World [2] и официальная документация. Книга может быть использована для ознакомления с языком и концепциями, лежащими в основе OTP, после чего можно переходить к изучению библиотек и фреймворков, входящих в состав дистрибутива языка. Хочется надеяться, что ситуация с литературой по данному языку улучшится с выходом новых книг (2.3.1).
Для ознакомления с языками семейства ML существует достаточно много литературы. Выбравшим OCaml лучше начать с книги Introduction to Objective Caml [30], используя её вместе со справочником по языку, а потом переходить к Developing Applications with Objective Caml [8] и другим книгам из списка выше (2.3.2). А изучение F# стоит начать с Foundations of F# [53] и продолжить чтением Expert F# [64] и F# for Scientists [28].
Для Prologа выбор книг достаточно велик — начать можно с книги Братко «Программирование на языке Пролог для искусственного интеллекта» [72], а затем переходить к книгам на английском языке, перечисленным выше (2.3.7).
4 Заключение
Хотелось бы отметить, что появившаяся тенденция к изданию на русском языке книг по тематике функционального/декларативного программирования не может не радовать. В печати появляются как переводы отличных зарубежных книг, так и публикации отечественных авторов. Некоторые книги зарубежных авторов переводятся силами энтузиастов, что часто позволяет получить очень качественный с технической точки зрения перевод.
Список литературы
- [1]
- Harold Abelson and Gerald J. Sussman. Structure and Interpretation of Computer Programs, 2nd Edition. The MIT Press, 1996.
- [2]
- Joe Armstrong. Programming Erlang: Software for a Concurrent World. Pragmatic Programmers, 2007.
- [3]
- Joe Armstrong, Robert Virding, Claes Wikström, and Mike Williams. Concurrent Programming in Erlang, Second Edition. Prentice-Hall, 1996.
- [4]
- H. P. Barendregt. The Lambda Calculus: its Syntax and Semantics. North-Holland, 1981.
- [5]
- R. S. Bird. Introduction to Functional Programming Using Haskell, 2nd Edition. Prentice-Hall, 2nd edition, 1998.
- [6]
- Max Bramer. Logic Programming with Prolog. Springer, 2005.
- [7]
- Francesco Cesarini and Simon Thompson. Erlang Programming. O’Reilly, 2009.
- [8]
- Emmanuel Chailloux, Pascal Manoury, and Bruno Pagano. Developing Applications With Objective Caml. O’Reilly, 2000.
- [9]
- W.F. Clocksin and C.S. Mellish. Programming in Prolog: Using the ISO Standard, 5th Edition. Springer, 2003.
- [10]
- William F. Clocksin. Clause and Effect: Prolog Programming for the Working Programmer. Springer, 2003.
- [11]
- Guy Cousineau and Michel Mauny. The Functional Approach to Programming. Cambridge University Press, 1998.
- [12]
- Michael A. Covington, Donald Nute, and Andre Vellino. Prolog Programming in Depth. Prentice Hall, 1996.
- [13]
- Kees Doets and Jan van Eijck. The Haskell Road to Logic, Maths and Programming. College Publications, 2004.
- [14]
- R.K. Dybvig. The Scheme Programming Language. The MIT Press, 3rd edition, 2003.
- [15]
- Matthias Felleisen, Robert Bruce Findler, Matthew Flatt, and Shriram Krishnamurthi. How to Design Programs: An Introduction to Programming and Computing. The MIT Press, 2001.
- [16]
- Matthias Felleisen and Daniel P. Friedman. The Little MLer. The MIT Press, 1997.
- [17]
- A. J. Field and P. G. Harrison. Functional Programming. Addison-Wesley, 1988.
- [18]
- Raphael Finkel. Advanced Programming Language Design. Addison Wesley, 1995.
- [19]
- Daniel P. Friedman, William E. Byrd, and Oleg Kiselyov. The Reasoned Schemer. The MIT Press, 2005.
- [20]
- Daniel P. Friedman and Matthias Felleisen. The Seasoned Schemer. The MIT Press, 1995.
- [21]
- Daniel P. Friedman, Matthias Felleisen, and Gerald J. Sussman. The Little Schemer, 4th Edition. The MIT Press, 1995.
- [22]
- Emden R. Gansner and John H. Reppy. The Standard ML Basis Library. Cambridge University Press, 2002.
- [23]
- N.G. Gerakines. Erlang Web Applications: Problem-Design-Solution. John Wiley and Sons, 2009.
- [24]
- Paul Graham. On Lisp. Prentice Hall, 1993.
- [25]
- Paul Graham. ANSI Common LISP. Prentice Hall, 1995.
- [26]
- John Harrison. Introduction to functional programming. Lecture notes, 1997.
- [27]
- Jon Harrop. OCaml for Scientists. 2007.
- [28]
- Jon Harrop. F# for Scientists. Wiley-Interscience, 2008.
- [29]
- P. Henderson. Functional Programming: Application and Implementation. Prentice-Hall, 1980.
- [30]
- Jason Hickey. Introduction to objective caml, 2008.
- [31]
- Doug Hoyte. Let Over Lambda. Lulu.com, 2008.
- [32]
- Paul Hudak. The Haskell School of Expression: Learning Functional Programming through Multimedia. Cambridge University Press, 2000.
- [33]
- Paul Hudak, John Peterson, and Joseph Fasel. A gentle introduction to haskell, version 98.
- [34]
- Graham Hutton. Programming in Haskell. Cambridge University Press, 2007.
- [35]
- Hal Daumé III. Yet another haskell tutorial. Учебник, http://darcs.haskell.org/yaht/yaht.pdf.
- [36]
- Richard Jones and Rafael Lins. Garbage Collection: Algorithms for Automatic Dynamic Memory Management. Wiley, 1996.
- [37]
- Simon L. Peyton Jones. The Implementation of Functional Programming Languages. Computer Science. Prentice-Hall, 1987.
- [38]
- Simon L. Peyton Jones and David Lester. Implementing functional languages: a tutorial. 1992.
- [39]
- Simon Peyton Jones. Haskell 98 language and libraries. the revised report, 2002.
- [40]
- Sonya E. Keene. Object-Oriented Programming in Common Lisp: A Programmer’s Guide to CLOS. Addison-Wesley Professional, 1989.
- [41]
- Gregor Kiczales, Jim des Rivieres, and Daniel G. Bobrow. The Art of the Metaobject Protocol. The MIT Press, 1991.
- [42]
- Shriram Krishnamurthi. Programming Languages: Application and Interpretation. 2003.
- [43]
- David B. Lamkins. Successful Lisp: How to Understand and Use Common Lisp. bookfix.com, 2004.
- [44]
- Saunders Mac Lane. Categories for the Working Mathematician. Springer Verlag, 1998.
- [45]
- Xavier Leroy. The zinc experiment: an economical implementation of the ml language. Technical report 117, INRIA, 1990.
- [46]
- Martin Logan, Eric Merritt, and Richard Carlsson. Concurrent Programming with Erlang/OTP. Manning, 2009.
- [47]
- W. D. Maurer. The programmer’s introduction to LISP. London, Macdonald, 1972.
- [48]
- R. Milner, M. Tofte, and B. Harper. The Definition of Standard ML. MIT Press, 1990.
- [49]
- Peter Norvig. Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp. Morgan Kaufmann, 1991.
- [50]
- Chris Okasaki. Purely Functional Data Structures. Cambridge University Press, 1998.
- [51]
- Bryan O’Sullivan, Donald Stewart, and John Goerzen. Real World Haskell. O’Reilly Media, Inc., 2008.
- [52]
- Lawrence C. Paulson. ML for the Working Programmer, 2ed. Cambridge University Press, 1996.
- [53]
- Robert Pickering. Foundations of F#. Apress, 2007.
- [54]
- Benjamin C. Pierce. Basic Category Theory for Computer Scientists. The MIT Press, 1991.
- [55]
- Benjamin C. Pierce. Types and Programming Languages. MIT Press, 2002.
- [56]
- Christian Queinnec. Lisp in Small Pieces. Cambridge University Press, 2003.
- [57]
- Fethi A. Rabhi and Guy Lapalme. Algorithms: A Functional Programming Approach. Addison Wesley, 1999.
- [58]
- Peter Seibel. Practical Common Lisp. Apress, 2005.
- [59]
- Anthony L. Shipman. Unix System Programming with Standard ML. 2001.
- [60]
- Joshua B. Smith. Practical OCaml. Apress, 2006.
- [61]
- Guy Steele. Common LISP. The Language, 2ed. Digital Press, 1990.
- [62]
- Leon Sterling and Ehud Shapiro. The Art of Prolog: Advanced Programming Techniques. The MIT Press, 1986.
- [63]
- John Stobo. Problem Solving with Prolog. Pitman, 1989.
- [64]
- Don Syme, Adam Granicz, and Antonio Cisternino. Expert F#. Apress, 2007.
- [65]
- Simon Thompson. Haskell: The Craft of Functional Programming, 2nd Edition. Addison-Wesley, 1999.
- [66]
- Franklyn A. Turbak and David K. Gifford. Design Concepts in Programming Languages. The MIT Press, 2008.
- [67]
- Jeffrey D. Ullman. Elements of ML Programming, ML97 Edition, 2ed. Prentice Hall, 1998.
- [68]
- Харольд Абельсон and Джеральд Джей Сассман. Структура и интерпретация компьютерных программ. М.: Добросвет, 2006.
- [69]
- А. Адаменко and А. Кучуков. Логическое программирование и Visual Prolog. БХВ-Петербург, 2003.
- [70]
- Х. Барендрегт. Ламбда-исчисление. Его синтаксис и семантика. М.: Мир, 1985.
- [71]
- И. Братко. Программирование на языке PROLOG для искусственного интеллекта. М.: Мир, 1990.
- [72]
- И. Братко. Алгоритмы искусственного интеллекта на языке Prolog. Вильямс, 2004.
- [73]
- Л. В. Городняя. Основы функционального программирования.
- [74]
- Л. В. Городняя. Парадигмы программирования.
- [75]
- Л. В. Городняя and Н.А. Березин. Введение в программирование на Лиспе.
- [76]
- С. П. Джонс and Д. Лестер. Реализация функциональных языков. 1992.
- [77]
- Дж. Доорс, А. Р. Рейблейн, and С. Вадера. Пролог - язык программирования будущего. М.: Финансы и статистика, 1990.
- [78]
- Р. В. Душкин. Функциональное программирование на языке Haskell. М.: ДМК Пресс, 2007.
- [79]
- Р. В. Душкин. Справочник по языку Haskell. М.: ДМК Пресс, 2008.
- [80]
- С. В. Зыков. Введение в теорию программирования. Функциональный подход.
- [81]
- В. М. Зюзьков. Математическое введение в декларативное программирование, 2003.
- [82]
- Ц. Ин and Д. Соломон. Использование Турбо-Пролога. М.: Мир, 1990.
- [83]
- С. С. Лаврова and Г. С. Силагадзе. Автоматическая обработка данных. Язык ЛИСП и его реализация. М.: Наука, 1978.
- [84]
- Дж. Макаллистер. Искусственный интеллект и Пролог на микроЭВМ. М.: Машиностроение, 1990.
- [85]
- С. Маклейн. Категории для работающего математика. Физматлит, 2004.
- [86]
- Дж. Малпас. Реляционный язык Пролог и его применение. М.: Наука, 1990.
- [87]
- Н. Н. Непейвода. Стили и методы программирования.
- [88]
- Н. А. Роганова. Функциональное программирование, 2002.
- [89]
- Л. Стерлинг and Э. Шапиро. Искусство программирования на языке Пролог. М.: Мир, 1990.
- [90]
- Дж. Стобо. Язык программирования Пролог. М.: Радио и связь, 1993.
- [91]
- Клоксин У. and Меллиш К. Программирование на языке пролог. М.: Мир, 1987.
- [92]
- А. Филд and П. Харрисон. Функциональное программирование. М.: Мир, 1993.
- [93]
- П. Хендерсон. Функциональное программирование. Применение и реализация. М.: Мир, 1983.
- [94]
- Пол Хьюдак, Джон Петерсон, and Джозеф Фасел. Мягкое введение в haskell. Учебник.
- [95]
- Э. Хювёнен and И. Сеппянен. Мир Лиспа. М.: Мир, 1990.
- [96]
- С. Чери, Г. Готлоб, and Л. Танка. Логическое программирование и базы данных. М.: Мир, 1992.
- [97]
- П. А. Шрайнер. Основы программирования на языке Пролог.
- 1
- Очень часто они переводились силами энтузиастов функционального программирования.
- 2
- Тут необходимо отметить серию учебников и учебных курсов проекта Интуит, описанных ниже.
- 3
- Хочется отметить, что ведется работа над версией курса лекций, адаптированной для языка OCaml, который является развитием Caml Light, но не полностью совместим с ним.
- 4
- Это, к сожалению, беда многих советских и российских учебников.
- 5
- Продолжение — continutation.
Этот документ был получен из LATEX при помощи HEVEA