Опубликован: 19.03.2004 | Доступ: свободный | Студентов: 2640 / 310 | Оценка: 3.98 / 3.79 | Длительность: 17:50:00
ISBN: 978-5-9556-0008-6
Лекция 15:

Парадигмы программирования

< Лекция 14 || Лекция 15: 123

Практические аспекты

Требования к учебно-экспериментальной практике можно условно разделить на четыре группы, различающиеся по целям:

  • элементарное знакомство с концепциями ФП;
  • эксперименты по системному программированию на базе ФВП;
  • моделирование изучаемых приложений средствами СФП;
  • изучение средств СФП как практического инструмента .

Первая из этих целей — знакомство — может быть достигнута на уровне концептуального минимума , достаточно далекого от решения технических проблем. В круге общеизвестных задач, пригодных для показа изучаемых явлений, на уровне регулярной обработки небольших текстов.

Вторая цель — эксперимент — гораздо чувствительнее к максимальному потенциалу реализации СФП, к ее гибкости и переносимости. Самоприменимость языков функционального программирования здесь гарантирует очевидные преимущества в сравнении со стандартными и производственными языками.

Третья цель — функциональное моделирование — обеспечивается как практичный компромисс , учитывающий разного рода обстоятельства: исторически сложившиеся стандарты, профессиональные стереотипы и жаргон, уровень квалификации заинтересованных лиц и многое другое, что порождает новые языки и их диалекты.

Четвертая цель — реальный инструмент — требует методично выбранного приемлемого баланса между уровнем изученности класса решаемых задач и уровнем организованности комплекта средств, имеющихся в СФП.

Элементарный Лисп, описанный как Pure Lisp Дж. Маккарти, идеально соответствует цели знакомства с ФП, его базовые средства доступны практически в любой реализации основных диалектов Лиспа. Навыки и понимание основ обработки структурированных данных на уровне элементарного Лиспа пригодятся при работе с любой СФП. Конструирование функций средствами чистого Лиспа доставляет интеллектуальное удовольствие, оно сродни решению математических головоломок. Благодаря функциональной полноте Лиспа, изучение других инструментов ФП, а также основных средств проектирования и программирования, можно обосновывать и понимать через программирование на Лиспе.

Во всей полноте идеи функционального программирования поддержаны в проекте Lisp 1.5 , выполненном Дж. Маккарти и его коллегами. В этом исключительно мощном языке не только реализованы основные средства, обеспечившие практичность и результативность функционального программирования, но и впервые опробован целый ряд поразительно точных построений, ценных как концептуально, так и методически и конструктивно, понимание и осмысление которых слишком отстает от практики применения. Понятийно-функциональный потенциал языка Lisp 1.5 в значительной мере унаследован стандартом Common Lisp , но многие идеи пока не получили достойного развития. Вероятно, это дело будущего — для нового поколения системных программистов.

По мере накопления опыта реализации СФП на базе Лиспа и других языков сформированы обширные библиотеки функций, весьма эффективно поддерживающих обработку основных структур данных — списков, векторов, множеств, хэш-таблиц, а также строк, файлов, каталогов, гипертекстов, изображений. Существенно повысилась результативность системных решений в области работы с памятью, компиляцией, манипулирования пакетами функций и классами объектов. Все это доступно в современных СФП, таких как GNU Clisp , Python, Cmucl и др., основная проблема при изучении которых — слишком много всего, разбегаются глаза, трудно выбрать первоочередное. Хочется найти пересечение со знакомыми программами и воспроизвести любимые приемы в новой стилистике — естественный путь для решения задач функционального моделирования .

С конца 70-х годов появились Лисп-процессоры , доказавшие, что пресловутая неэффективность функционального программирования обусловлена характеристиками оборудования, а не стилем программирования. Функциональные мини-языки хорошо показали себя и при решении задач аппаратного уровня. К середине 90-х годов появились весьма убедительные результаты [ 13 ] по динамической оптимизации процессов, и были осуществлены высокопроизводительные схемы работы с памятью на новом оборудовании. Все это превращает СФП в практичный и перспективный инструментарий.

Полученное при изучении ФП обобщенное представление о процессах выполнения функций нацеливает на решение задач в виде определения семейства процессов и выбор подходящего представителя семейства. Привлекая теоретико-множественный подход как обнадеживающую аналогию, наполнение понятий при функциональном программировании и организации его системной поддержки осуществляется следующими преобразованиями:

  • проекция в более удобное, простое, но не слишком бедное множество;
  • ортогонализация независимых вспомогательных понятий;
  • унификация родственных понятий;
  • распространение реализуемых действий на новые области существования.

Посредством таких преобразований производится уточнение структуры пространства , в котором рассматривается каждое понятие. Кроме шагов расширения по горизонтали обычно происходит и реорганизация по вертикали — детализация и обобщение, при котором, как правило, возрастает число измерений исходного пространства, точнее, видимой его части.

Такая схема подтверждается самой историей развития диалектов языка Лисп и родственных ему языков программирования. ( Pure Lisp , Lisp 1.5 , Lisp 2, Interlisp, CommonLisp, MicroLisp, MuLisp, Sail, Hope, Miranda, Scheme, ML, GNU Clisp , CLOS, Emacs, Elisp, xLisp, Vlisp, AutoLisp, Haskel, Python, Cmucl cmucl ). Не вдаваясь здесь в подробности этой истории (ее изложение заслуживает отдельного курса!), отметим лишь особенности свободно распространяемой системы GNU Clisp , которую легально можно использовать в качестве системы, поддерживающей ФП.

Стандарт Common Lisp в сравнении с Лиспом от Маккарти имеет ряд отличий, несколько влияющих на программотехнику. Прежде всего, это касается реализации списков свойств атомов. Данная структура реализована в императивном стиле, в виде таблицы с регулярным "забыванием" информации после каждого присваивания. В результате исключено многократное связывание глобальных объектов с их определениями, а заодно и множественное объявление свойств атомов. Конечно, такие эффекты можно смоделировать, но это не столь гармонично. Другое отличие связано с механизмом контекстов вычисления выражений. Стандарт при вычислении значений переменных по умолчанию привлекает статический контекст, иначе переменную надо объявить специальной. Третье отличие затрагивает унификацию представления функций и обрабатываемых ими значений. При внешнем подобии — и то, и другое выглядит как круглоскобочные списки, но реализационно это разные типы данных, и возникает нечто вроде приведения типа ( funcall ) в ситуациях вызова функций, конструируемых "на лету". Имеются и другие, не столь явные отличия, которые пока не стоит упоминать. GNU Clisp , xLisp, Cmucl соответствуют стандарту Common Lisp . Документация по этим СФП доступна на сайтах любителей Лиспа и ФП, а также на многих университетских сайтах.

< Лекция 14 || Лекция 15: 123
Илья Ардов
Илья Ардов

Добрый день!

Я записан на программу. Куда высылать договор и диплом?

Дарья Федотова
Дарья Федотова