Лекция 3: Функциональный подход к программированию

advertisement
Функциональный подход
к программированию
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
В данной лекции будут рассмотрены вопросы, относящиеся к истории развития,
идеологии, математическому обоснованию и обзору возможностей программных систем
на основе функционального подхода к проектированию и реализации программного
обеспечения.
Современные языки программирования и .NET: I семестр
Лекция 3: Функциональный подход к программированию
Содержание лекции
1.
2.
3.
4.
5.
Основы функционального подхода к программированию
Классификация языков функционального
программирования
Преимущества языков функционального
программирования
Преимущества использования SML под управлением
.NET
Библиография
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
В ходе лекции будут рассмотрены важнейшие научные исследования, относящиеся к
математическому обоснованию функционального подхода к программированию, а также
исследовано своеобразие функционального подхода по сравнению с другими
направлениями проектирования и реализации программного обеспечения, известными на
сегодня.
Далее будет представлен вариант классификации языков функционального
программирования на основе реализованных в них теоретически важных свойств и
практически полезных механизмов (в частности, полиморфизма и сопоставления с
образцом).
На основе классификации будут сделаны выводы о преимуществах и недостатках
рассмотренных языков и подхода в целом для реализации тех или иных классов
практических задач.
Существенное внимание будет уделено языку функционального программирования SML,
который изучается на протяжении всего курса, его истории развития, особенностям, а
также его практической реализации на технологической платформе .NET.
Лекция завершится обзором литературы для более глубокого исследования материала.
Современные языки программирования и .NET: I семестр
Лекция 3: Функциональный подход к программированию
Подходы к программированию
•
•
•
•
•
•
•
структурный, модульный;
функциональный;
логический;
объектно-ориентированный;
смешанный;
компонентно-ориентированный (.NET);
чисто объектный
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
Напомним классификацию подходов к программированию, построенную нами в ходе
вступительной лекции:
• ранние неструктурные подходы;
• структурный или модульный подход (задача разбивается на подзадачи, затем на
алгоритмы, составляются их структурные схемы и происходит реализация);
• функциональный подход (в основе лежит понятие функции);
• логический подход (в основе лежат логические высказывания или правила в форме
предикатов);
• объектно-ориентированный подход (базируется на идее объекта);
• смешанный подход (некоторые подходы возможно комбинировать);
• компонентно-ориентированный (программный проект рассматривается как
множество компонент, такой подход принят, в частности, в .NET);
• чисто объектный подход (идеальный с математической точки зрения вариант,
который пока не реализован практически).
Современные языки программирования и .NET: I семестр
Лекция 3: Функциональный подход к программированию
Функциональный подход к программированию
Время появления:
• теория: 1920-30-е г.г.;
• первая реализация: 1950-е г.г.
Основная особенность: программа – функция, аргументы
которой, возможно, также являются функциями
Примеры:
LISP (1950-e) , ML (1970-e) , SML (1980-e), Scheme, Hope,
Miranda, Clean, Haskell (1990-е)
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
Сосредоточимся на важнейшем для данного семестра функциональном подходе к
программированию.
Прежде всего, обратимся к истории фундаментальных математических исследований,
которые привели к появлению функционального подхода к программированию.
Время появления теоретических работ, которые обосновывают функциональный подход,
относится к 20-м – 30-м годам XX столетия. Как мы увидим впоследствии, теория часто
значительно опережает практику программирования, и важнейшие работы, которые
сформировали математическую основу подхода, были созданы задолго до появления
компьютеров и языков программирования, которые потенциально могли бы реализовать
эту теорию.
Что касается первой реализации, она появилась в 50-х годах XX столетия в форме языка
LISP, о котором речь пойдет далее.
Напомним, что важнейшей характеристикой функционального подхода является то
обстоятельство, что всякая программа, разработанная на языке функционального
программирования, может рассматриваться как функция, аргументы которой, возможно,
также являются функциями.
Функциональный подход породил целое семейство языков, родоначальником которых,
как уже отмечалось, стал язык программирования LISP. Позднее, в 70-х годах, был
разработан первоначальный вариант языка ML, который впоследствии развился, в
частности, в SML, а также ряд других языков, из которых, пожалуй, самым «молодым»
является созданный уже совсем недавно, в 90-х годах, язык Haskell.
Современные языки программирования и .NET: I семестр
Лекция 3: Функциональный подход к программированию
Математические основания
функционального подхода
1.
2.
3.
4.
Моделирование функций: теория конечных
последовательностей – ламбда-исчисление А.Черча
(Alonso Church)
Моделирование типов: ламбда-исчисление с типами
Моделирование среды вычислений в форме абстрактной
машины - теория категорий Х. Карри (Haskell B. Curry) в
форме категориальной комбинаторной логики
Моделирование вычисления значения – теория решеток
Д. Скотта (Dana S. Scott)
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
Истоки математических основ функционального подхода к программированию следует
искать в ранних работах М. Шенфинкеля (Moses Schönfinkel), которые, нужно отметить,
малоизвестны, т.к. довольно далеки по времени от работ, непосредственно связанных с
функциональным подходом.
Не вызывает сомнений тот факт, что разработанная А. Черчем (Alonso Church) теория
конечных последовательностей в форме исчисления ламбда-конверсий (или, короче,
ламбда-исчисления), которое будет рассмотрено подробнее в следующей лекции,
положила начало математическому исчислению, формализующему понятие функции.
Дальнейшее развитие функциональный подход получает в работах, посвященных
типизированному ламбда-исчислению, согласно которым аргументам функций и самим
функциям можно назначать (или, иначе, приписывать) тот или иной тип. Типизация
существенно увеличивает вычислительную стройность и значимость любой
математической формализации, и, естественно, без нее немыслимы современные языки
программирования. Проблемы и особенности типизации будут подробно рассмотрены в
одной из последующих лекций.
Теорию и практику программирования существенно обогатило моделирование среды
вычислений в форме абстрактной машины, построенной на основе категориальной
комбинаторной логики, созданной Х. Карри (Haskell B. Curry), в честь которого, кстати, и
назван язык Haskell. Заметим, что абстрактные (или, иначе, виртуальные) машины
являются основой для реализации языка SML и платформы .NET.
Наконец, теория решеток Д. Скотта (Dana S. Scott) стала основой для моделирования
вычисления значения функции (или семантики) языка программирования.
Современные языки программирования и .NET: I семестр
Лекция 3: Функциональный подход к программированию
Функциональный подход: преимущества
1.
Полностью автоматическое управление памятью
компьютера («сборка мусора»)
2. Простота повторного использования фрагментов кода
3. Расширенная поддержка параметрических функций
4. Абстрагирование от машинного представления данных
(система счисления, способы хранения и поиска)
5. Прозрачность реализации самоприменяемых
(рекурсивных) функций
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
Важным преимуществом реализации языков функционального программирования
является автоматизированное динамическое распределение памяти компьютера для
хранения данных. При этом программист избавляется от рутинной необходимости
контролировать данные, а при необходимости может запустить функцию «сборки мусора»
– очистки памяти от тех данных, которые больше не потребуются программе.
Сложные программы при функциональном подходе строятся посредством агрегирования
функций. При этом текст программы представляет собой функцию, некоторые аргументы
которой можно также рассматривать как функции. Таким образом, повторное
использование кода сводится к вызову ранее описанной функции, структура которой, в
отличие от процедуры императивного языка, прозрачна математически.
Типы отдельных переменных функций, используемых в функциональных языках, могут
быть переменными. При таком подходе обеспечивается возможность обработки
разнородных данных (например, упорядочение элементов списка по возрастанию для
целых чисел, отдельных символов и строк) или полиморфизм. Таким образом, при
создании программ на функциональных языках программист сосредотачивается на
предметной области и в меньшей степени заботится о рутинных операциях (обеспечении
правильного с точки зрения компьютера представления данных, «сборке мусора» и т.д.).
Поскольку функция является естественным формализмом для языков функционального
программирования, реализация различных аспектов программирования, связанных с
функциями, существенно упрощается. Интуитивно прозрачным становится написание
рекурсивных функций, т.е. функций, вызывающих самих себя в качестве аргумента.
Естественной становится и реализация обработки рекурсивных структур данных.
Благодаря реализации механизма сопоставления с образцом, такие языки
функционального программирования как ML и Haskell весьма хорошо применимы для
символьной обработки.
Современные языки программирования и .NET: I семестр
Лекция 3: Функциональный подход к программированию
Функциональный подход: недостатки
1.
2.
3.
Нелинейная структура программы
Необходимость фундаментальной математической
подготовки разработчиков (достаточно хорошее
понимание природы функций)
Относительно невысокая эффективность для некоторых
классов задач
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
Естественно, языки функционального программирования не лишены и некоторых
недостатков.
Часто к ним относят нелинейную структуру программы и относительно невысокую
эффективность реализации. Однако, первый недостаток достаточно субъективен, а второй
успешно преодолен современными реализациями, в частности, рядом последних
трансляторов языка SML, включая и компилятор для среды Microsoft .NET.
Для
профессиональной
разработки
программного
обеспечения
на
языках
функционального программирования необходимо глубоко понимать природу функции.
Исследованию закономерностей и особенностей природы функции, в основном, и
посвящен первый семестр данного курса.
Современные языки программирования и .NET: I семестр
Лекция 3: Функциональный подход к программированию
Функция в математике и программировании
Математической функцией f с областью определения A
и областью значений B называется множество
упорядоченных пар (a,b)∈A×B, таких что если (a,b1)∈f и
(a,b2)∈f, то b1=b2.
Функцией в языке программирования называется
конструкция этого языка, описывающая правила
преобразования аргумента (т.н. фактического параметра)
в результат.
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
Прежде всего, заметим, что под термином «функция» в математической формализации и
программной реализации имеются в виду различные понятия.
Так, математической функцией f с областью определения A и областью значений B
называется множество упорядоченных пар
(a,b) ∈ A×B,
таких, что если
(a,b1) ∈ f и (a,b2) ∈f,
то
b1=b2.
В свою очередь, функцией в языке программирования называется конструкция этого
языка, описывающая правила преобразования аргумента (так называемого фактического
параметра) в результат.
Современные языки программирования и .NET: I семестр
Лекция 3: Функциональный подход к программированию
Общие сведения о λ-исчислении
Ламбда-исчисление – математическая теория,
предназначенная для формализации обозначения и
переобозначения (или, иначе, конверсии).
Конверсии фактически являются важнейшим предметом
практического программирования
Классическая бинарная (булева) логика, а также большинство
других разделов математики, неудовлетворительны для
решения данной проблемы
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
Для формализации понятия «функция» была построена математическая теория, известная
сегодня под названием ламбда-исчисления. Более точно это исчисление следует называть
исчислением ламбда-конверсий.
Под конверсией понимается преобразование объектов исчисления (а в программировании
– функций и данных) из одной формы в другую. Исходной задачей в математике было
стремление к упрощению формы выражений. В программировании именно эта задача не
является столь существенной, хотя, как мы увидим в дальнейшем, использование ламбдаисчисления как исходной формализации может способствовать упрощению вида
программы, т.е. вести к оптимизации программного кода.
Кроме того, конверсии обеспечивают переход к вновь введенным обозначениям и, таким
образом, позволяют представлять предметную область в более компактном или более
детальном виде, или, говоря математическим языком, изменять уровень абстракции по
отношению к предметной области. Эту возможность широко используют также языки
объектно-ориентированного и структурно-модульного программирования в иерархии
объектов, фрагментов программ и структур данных. На этом же принципе основано
взаимодействие компонентов приложения в .NET. Именно в этом смысле переход к
новым обозначениям является одним из важнейших элементов программирования в
целом, и именно ламбда-исчисление (в отличие от многих других разделов математики),
как оказывается, является адекватным способом формализации переобозначений.
Современные языки программирования и .NET: I семестр
Лекция 3: Функциональный подход к программированию
История развития функционального подхода (1)
1924 – М. Шенфинкель (Moses Shönfinkel) разработал
простую (simple) теорию функций
1934 – А. Черч (Alonso Church) предложил ламбда-исчисление
и применил его для разработки теории множеств
1940 – Х. Карри (Haskell Curry) предложил теорию функций
без переменных, известную как комбинаторная логика
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
Систематизируем эволюцию теорий, лежащих в основе современного подхода к ламбдаисчислению.
Еще в 1924 году М. Шенфинкель (Moses Shönfinkel) разработал простую (simple) теорию
функций, которая фактически являлась исчислением объектов-функций и предвосхитила
появление ламбда-исчисления.
Затем, в 1934 году, А. Черч (Alonso Church) предложил собственно исчисление ламбдаконверсий или ламбда-исчисление и применил его для исследования теории множеств.
Вклад ученого был настолько фундаментальным, что теория до сих пор называется
ламбда-исчислением и часто именуется в литературе ламбда-исчислением Черча.
Позднее, в 1940 году, Х. Карри (Haskell Curry) предложил теорию функций без
переменных (иначе называемых комбинаторами), известную в настоящее время как
комбинаторная логика. Эта теория является развитием ламбда-исчисления и представляет
собой формальный язык, аналогичный языку функционального программирования и
позволяющий более наглядно моделировать вычисления в среде абстрактных машин, в
значительной мере схожих с виртуальной машиной .NET.
Современные языки программирования и .NET: I семестр
Лекция 3: Функциональный подход к программированию
История развития функционального подхода (2)
1960-е - Р. Хиндли (Roger Hindley) разработал выводимость
типов (type inference)
1960-е – П. Лендин (Peter Landin) создал абстрактную
машину SECD, формализующую язык ISWIM (If you See
What I Mean) - прообраз языка функционального
программирования ML
1970-e – Р. Милнер (Robin Milner) создал полиморфную
систему типов для языка функционального
программирования ML
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
Позднее, уже в 60-х г.г. Р. Хиндли (Roger Hindley) разработал выводимость типов (type
inference), т.е. возможность неявно определить тип выражения, исходя из типов
выражений, которые его окружают. Именно эта возможность широко используется в
современных языках программирования, таких как SML и Haskell.
Также в 60-х г.г. П. Лендин (Peter Landin) создал первую абстрактную машину на основе
расширенного ламбда-исчисления. Машина получила название SECD и формализовала
вычисления на языке программирования ISWIM (If you See What I Mean), который
впоследствии стал прообразом языка функционального программирования ML.
Наконец, в 70-х г.г. Р. Милнер (Robin Milner) создал полиморфную систему типизации для
языка функционального программирования ML, которая вместе с развернутым описанием
того же автора положила начало стандартизации этого языка программирования. Язык ML
впоследствии эволюционировал по нескольким направлениям, мы будем изучать SML –
ту его ветвь, которая развита Р. Милнером.
Современные языки программирования и .NET: I семестр
Лекция 3: Функциональный подход к программированию
Классификация языков функционального
программирования
1.
2.
3.
4.
Бестиповые языки: классический LISP
Языки со строгой типизацией: ML
Языки с полиморфной типизацией: SML, Miranda, Haskell
Языки «нового поколения» с широкими возможностями:
• сопоставление с образцом (Scheme, SML, Miranda,
Haskell)
• параметрический полиморфизм (SML)
• «ленивые» вычисления (Haskell, Miranda, SML)
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
Рассмотрим эволюцию языков
функционального подхода.
программирования,
развивающихся
Ранние языки функционального программирования, которые берут
классического языка LISP (LISt Processing), были предназначены,
названия, для обработки списков, т.е. символьной информации. При
типами были атомарный элемент и список из атомарных элементов, а
делался на анализ содержимого списка.
в
рамках
свое начало от
как явствует из
этом основными
основной акцент
Развитием ранних языков программирования стали языки функционального
программирования с сильной типизацией, характерным примером которых является
классический ML, и далее, его прямой потомок, SML. В языках с сильной типизацией
каждая конструкция (или выражение) должно иметь тип.
При этом в более поздних языках функционального программирования, однако, нет
необходимости явного приписывания типа, и типы изначально неопределенных
выражений, как в SML, могут выводиться (до запуска программы), исходя из типов
связанных с ними выражений.
Следующим шагом в развитии языков функционального программирования стала
поддержка полиморфных функций, т.е. функций с параметрическими аргументами
(аналогами математической функции с параметрами). В частности, полиморфизм
поддерживается в языках SML, Miranda и Haskell.
На современном этапе развития возникли языки функционального программирования
«нового поколения» со следующими расширенными возможностями: сопоставление с
образцом (Scheme, SML, Miranda, Haskell), параметрический полиморфизм (SML) и так
называемые
«ленивые» (по мере необходимости) вычисления (Haskell, Miranda, SML).
Современные языки программирования и .NET: I семестр
Лекция 3: Функциональный подход к программированию
Семейство языков функционального
программирования ML
1.
«Классический» ML – создан Р. Милнером в MIT, США
(строгая типизация, без параметрического
полиморфизма)
2. SML – Cambridge, MIT, Edinburgh
3. CaML – разработан в INRIA, Франция
4. SML/NJ – диалект SML из New Jersey
5. mosml – «московский» диалект ML, разработан в России
Диалекты SML 2-4 обладают примерно одинаковыми
расширенными возможностями (полиморфизм,
сопоставление с образцом, «ленивые» вычисления)
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
Семейство языков функционального программирования достаточно многочисленно. Это
очевидно не столько из значительного списка языков, сколько из того факта, что многие
языки дали начало целым направлением в программировании. Напомним, что LISP дал
начало целому семейству языков: Scheme, InterLisp, COMMON Lisp и др.
Не стал исключением и изучаемый нами язык программирования SML, который был
создан в форме языка ML Р. Милнером в MIT (Massachusetts Institute of Technology), США
и первоначально предназначен для логических выводов, в частности, доказательства
теорем. Язык отличается строгой типизацией, в нем отсутствует параметрический
полиморфизм.
Развитием «классического» ML стали сразу три современных языка с практически
одинаковыми возможностями (параметрический полиморфизм, сопоставление с образцом,
«ленивые» вычисления). Это – язык SML, разработанный в Великобритании и США,
CaML, созданный группой французских ученых института INRIA, SML/NJ – диалект SML
из New Jersey, а также российская разработка – mosml («московский» диалект ML).
Современные языки программирования и .NET: I семестр
Лекция 3: Функциональный подход к программированию
Преимущества языков функционального
программирования
1.
2.
3.
4.
5.
Простота верификации программного кода
Унификация представления программы и данных
Безопасная типизация – недопустимые операции над
данными исключены
Динамическая типизация – возможно обнаружение
ошибок типизации во время выполнения программы
Независимость программной реализации от машинного
представления данных и системной архитектуры
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
Близость к математической формализации и изначальная функциональная
ориентированность являются причиной следующих преимуществ функционального
подхода:
1) простота тестирования и верификации программного кода на основе возможности
построения строгого математического доказательства корректности программ;
2) унификация представления программы и данных (данные могут быть
инкапсулированы в программу как аргументы функций, означивание или
вычисление значения функции может производиться по мере необходимости) ;
3) безопасная типизация: недопустимые операции над данными исключены;
4) динамическая типизация: возможно обнаружение ошибок типизации во время
выполнения (это свойство ранних языков функционального программирования
может приводить к переполнению оперативной памяти компьютера);
5) независимость программной реализации от машинного представления данных и
системной архитектуры программы (программист концентрирует внимание на
деталях реализации, а не особенностях машинного представления данных).
Современные языки программирования и .NET: I семестр
Лекция 3: Функциональный подход к программированию
Преимущества SML (1)
•
•
•
Безопасность кода – гарантия отсутствия переполнения
памяти и взлома системы (C и C++ потенциально
небезопасны)
Статическая типизация: выявление ошибок
несоответствия типов на этапе трансляции (в LISP и
Scheme это невозможно)
Выводимость типов – типы необязательно указывать
явно, код легче читается, хранится и повторно
используется
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
По сравнению с другими языками программирования, в том числе с ранними
функциональными языками, SML обладает рядом несомненных достоинств. К ним, в
первую очередь, относятся:
1) безопасность программного кода, т.е. гарантия отсутствия переполнения памяти (в
случае корректно написанной программы) и, соответственно, защиты от
потенциальной неустойчивости работы системы посредством искусственного
создания этого переполнения (такие языки программирования, как «классический»
C и C++ потенциально небезопасны);
2) статическая типизация: все ошибки несоответствия типов выявляются уже на
стадии контроля соответствия типов в ходе трансляции (а не во время выполнения
программы, как в LISP и Scheme);
3) Выводимость типов (нет необходимости явно указывать тип каждого выражения,
при этом результирующий программный код становится более удобочитаемым, его
легче хранить и повторно использовать).
Современные языки программирования и .NET: I семестр
Лекция 3: Функциональный подход к программированию
Преимущества SML (2)
•
•
•
•
Параметрический полиморфизм – функции могут
обрабатывать аргументы любого типа, экономятся
трудозатраты
Сопоставление с образцом – мощное средство
декомпозиции и верификации программ
Модульная структура – интерфейс и реализация
разделены
Исключения, продолжения – критичны для систем
реального времени
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
К числу других преимуществ языка функционального программирования SML следует
отнести параметрический полиморфизм (возможность обрабатывать аргументы
абстрактного типа). При этом трудозатраты на разработку программного обеспечения
сокращаются за счет универсальности разрабатываемых функций (скажем, становится
возможным написать унифицированную функцию для упорядочения по возрастанию
элементов списка, которая сможет упорядочивать и список из целочисленных элементов,
и список из символьных строк).
Еще одним мощным средством, облегчающих символьную обработку (в частности,
декомпозицию и верификацию программ), является механизм сопоставления с образцом.
Построение программ из модулей способствует разделению интерфейсной части
(описательной части) и реализации (содержательной части) функций, что обеспечивает
унификацию и сокращает время создания сложных программных проектов, облегчая
тестирование на соответствие спецификациям заказчика.
Обработка исключительных ситуаций, которые описывают ход выполнения программы в
случае возникновения тех или иных относительно редких событий, а также теоретически
интересного механизма продолжений, создают возможность реализации программных
систем, взаимодействующих с пользователем в реальном времени.
Современные языки программирования и .NET: I семестр
Лекция 3: Функциональный подход к программированию
Преимущества разработки программного
обеспечения под управлением Microsoft .NET
1.
2.
3.
4.
Интеграция различных языков функционального
программирования (Scheme – сопоставление с образцом,
SML – «ленивость»)
Интеграция различных подходов к программированию на
основе Common Language Infrastructure, CLI (C# –
объектно-ориентированный, SML – функциональный)
Общая система типизации CTS (Common Type System)
Многоступенчатая, гибкая систем обеспечения
безопасности программного кода
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
Заметим, что реализация преимуществ, которые предоставляют языки функционального
программирования, существенно зависит от выбора программно-аппаратной платформы.
В случае выбора в качестве программной платформы технологии .NET, практически вне
зависимости от аппаратной реализации, программист или руководитель программного
проекта дополнительно получает следующие преимущества:
1) интеграция различных языков функционального программирования (при этом
максимально используются преимущества каждого из языков, в частности, Scheme
предоставляет механизм сопоставления с образцом, а SML – «ленивость» или
вычисления по мере необходимости);
2) интеграция различных подходов к программированию на основе межъязыковой
инфраструктуры Common Language Infrastructure, или CLI (в частности,
использование C# для обеспечения преимуществ объектно-ориентированного
подхода и SML – функционального, как в настоящем курсе);
3) общая система типизации Common Type System, CTS (единообразное и безопасное
управление типами данных в программе);
4) многоступенчатая, гибкая систем обеспечения безопасности программного кода
(в частности, на основе механизма сборок).
Современные языки программирования и .NET: I семестр
Лекция 3: Функциональный подход к программированию
Библиография (1)
1.
2.
3.
4.
5.
Hughes J. Why functional programming matters. The
Computer Journal, 32 (2): 98-107, April 1989
Peyton Jones S.L., Lester D. Implementing of functional
languages: A tutorial. International Series in Computeer
Science - Prentice Hall, 1992
Pratt T.W., Zelkovitz M.V. Programming languages, design
and implementation (4th ed.).- Prentice Hall, 2000
Milner R., Tofte M., Harper R., McQueen D. The definition
of Standard ML: Revised 1997. MIT Press, 1997
Gilmore S. Programming in Standard ML ’97: a tutorial
introduction. http:/www.dcs.ed.ac.uk/home/stg
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
К сожалению, в рамках одной лекции можно лишь в общих чертах охарактеризовать
функциональный подход к программированию. Мы ограничились рассмотрением лишь
наиболее существенных аспектов функционального подхода.
Для более детального ознакомления с современными достижениями и проблемами в
области проектирования и реализации языков функционального программирования,
рекомендуется следующий список литературы:
1. Hughes J. Why functional programming matters. The Computer Journal, 32 (2): 98-107, April
1989
2. Peyton Jones S.L., Lester D. Implementing of functional languages: A tutorial. International
Series in Computeer Science - Prentice Hall, 1992
3. Pratt T.W., Zelkovitz M.V. Programming languages, design and implementation (4th ed.).Prentice Hall, 2000
4. Milner R., Tofte M., Harper R., McQueen D. The definition of Standard ML: Revised 1997.
MIT Press, 1997
5. Gilmore S. Programming in Standard ML ’97: a tutorial introduction.
http:/www.dcs.ed.ac.uk/home/stg
Кратко остановимся на источниках. В работах [1,2] обсуждаются основы
функционального подхода к программированию. Работа [3] является энциклопедией
языков программирования и рассматривает подходы в сравнительном и историческом
аспектах. Работы [4,5] посвящены описанию языка программирования Standard ML и
практике программирования на нем.
Современные языки программирования и .NET: I семестр
Лекция 3: Функциональный подход к программированию
Библиография (2)
1.
2.
3.
4.
5.
http://www.haskell.org
http://www.cm.bell-labs.com/cm/cs/what/smlnj
http://www.harlequin.com/products/ads/ml
http://www.cam.inria.fr
http://www.cs.kun.nl/~clean
© Учебный Центр безопасности информационных технологий Microsoft
Московского инженерно-физического института (государственного университета), 2003
Комментарий к слайду
Последние тенденции в развитии языков функционального программирования доступны
из следующих Интернет-ресурсов:
1. http://www.haskell.org
2. http://www.cm.bell-labs.com/cm/cs/what/smlnj
3. http://www.harlequin.com/products/ads/ml
4. http://www.cam.inria.fr
5. http://www.cs.kun.nl/~clean
Ресурс [1] описывает язык программирования Haskell, ресурсы [2-4] посвящены
различным диалектам ML, ресурс [5] описывает один из современных функциональных
языков – Clean.
Download