globalf5-240972240972 (850810), страница 34
Текст из файла (страница 34)
Затем былавыполнена серия обобщений представления о процессах примененияфункций, т.е. осуществлена восходящая линия определенияфункционального языка.Этот процесс не всегда удовлетворителен по эффективности с разныхточек зрения. Повышение эффективности обычно требует развитияразмерностипространства,вкоторомрассматриваются232Л.В. ГородняяОсновы функционального программированияоптимизируемые понятия.1. Исследованы возможные направления развития как по вертикали,так и по горизонтали. Для этого изучены традиционные решенияпо организации структур данных и систем программирования дляподдержки функционального программирования, а также спискисвойств атомов и деструктивные функции.2. Неоднозначные функции могут рассматриваться через понятиеотношения.
При изучении идей ООП показано, что идеи этивесьма близки и легко поддерживаются базовыми средствамифункциональногопрограммирования.Достаточнолишьпродемонстрировать технику работы с классами и экземплярамиобъектов и способы определения методов их обработки.3. Рассмотрено понятие вариантов или альтернативных процессов,успешного выполнения одного из которых достаточно дляпостроения результата функции. Реализация таких процессовпотребовала уточнить определение абстрактной машины, чтобыобеспечить сохранение состояния памяти для выхода изтупиковых ситуаций.
Такое же уточнение необходимо дляобеспечения диагностичности.4. Представлены методы управления процессами вычисленияфункций и средства, обеспечивающие выбор временивыполнения отдельных шагов процесса, соответствующихконкретнымформулам.Организациятакихпроцессовобеспечивается совместным хранением данных и рецептов ихполучения, что заодно снимает требование конечностипредставления данных. Достаточно конечности рецепта.
Техникаработы с рецептами, заключающаяся в приостановке ивозобновлениипрограмм,нетребуетспециальныхреализационных механизмов.5. Функции высших порядков показаны как инструментестественной модуляризации программ, например, техникойпродолжений,достаточнойдлядостиженияподобияпредставления функций и обрабатываемых ими типов данных.Иллюстрациятакогоподобияназадачепостроениясинтаксического анализатора позволяет замкнуть изученныемеханизмы на исходный язык программирования.233Л.В.
ГородняяОсновы функционального программированияПрактические аспектыТребования к учебно-экспериментальной практике можно условноразделить на четыре группы, различающиеся по целям:элементарное знакомство с концепциями ФП;эксперименты по системному программированию на базе ФВП;моделирование изучаемых приложений средствами СФП;изучение средств СФП как практического инструмента .Первая из этих целей — знакомство — может быть достигнута науровне концептуального минимума , достаточно далекого от решениятехнических проблем.
В круге общеизвестных задач, пригодных дляпоказа изучаемых явлений, на уровне регулярной обработки небольшихтекстов.Вторая цель — эксперимент — гораздо чувствительнее кмаксимальному потенциалу реализации СФП, к ее гибкости ипереносимости.Самоприменимостьязыковфункциональногопрограммирования здесь гарантирует очевидные преимущества всравнении со стандартными и производственными языками.Третья цель — функциональное моделирование — обеспечивается какпрактичный компромисс , учитывающий разного рода обстоятельства:исторически сложившиеся стандарты, профессиональные стереотипы ижаргон, уровень квалификации заинтересованных лиц и многое другое,что порождает новые языки и их диалекты.Четвертая цель — реальный инструмент — требует методичновыбранного приемлемого баланса между уровнем изученности классарешаемых задач и уровнем организованности комплекта средств,имеющихся в СФП.Элементарный Лисп, описанный как Pure Lisp Дж.
Маккарти, идеальносоответствует цели знакомства с ФП, его базовые средства доступныпрактически в любой реализации основных диалектов Лиспа. Навыки ипонимание основ обработки структурированных данных на уровнеэлементарного Лиспа пригодятся при работе с любой СФП.234Л.В. ГородняяОсновы функционального программированияКонструирование функций средствами чистого Лиспа доставляетинтеллектуальное удовольствие, оно сродни решению математическихголоволомок.
Благодаря функциональной полноте Лиспа, изучениедругих инструментов ФП, а также основных средств проектирования ипрограммирования, можно обосновывать и понимать черезпрограммирование на Лиспе.Во всей полноте идеи функционального программированияподдержаны в проекте Lisp 1.5 , выполненном Дж. Маккарти и егоколлегами. В этом исключительно мощном языке не только реализованыосновные средства, обеспечившие практичность и результативностьфункционального программирования, но и впервые опробован целыйряд поразительно точных построений, ценных как концептуально, так иметодически и конструктивно, понимание и осмысление которыхслишкомотстаетотпрактикиприменения.Понятийнофункциональный потенциал языка Lisp 1.5 в значительной мереунаследован стандартом Common Lisp , но многие идеи пока неполучили достойного развития.
Вероятно, это дело будущего — длянового поколения системных программистов.По мере накопления опыта реализации СФП на базе Лиспа и другихязыков сформированы обширные библиотеки функций, весьмаэффективно поддерживающих обработку основных структур данных —списков, векторов, множеств, хэш-таблиц, а также строк, файлов,каталогов, гипертекстов, изображений. Существенно повысиласьрезультативность системных решений в области работы с памятью,компиляцией, манипулирования пакетами функций и классамиобъектов. Все это доступно в современных СФП, таких как GNU Clisp ,Python, Cmucl и др., основная проблема при изучении которых —слишком много всего, разбегаются глаза, трудно выбратьпервоочередное.
Хочется найти пересечение со знакомымипрограммами и воспроизвести любимые приемы в новой стилистике— естественный путь для решения задач функциональногомоделирования .С конца 70-х годов появились Лисп-процессоры , доказавшие, чтопресловутая неэффективность функционального программированияобусловлена характеристикамиоборудования, а не стилемпрограммирования. Функциональные мини-языки хорошо показали235Л.В.
ГородняяОсновы функционального программированиясебя и при решении задач аппаратного уровня. К середине 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 в сравнении с Лиспом от Маккарти имеет ряд236Л.В. ГородняяОсновы функционального программированияотличий, несколько влияющих на программотехнику.
Прежде всего, этокасается реализации списков свойств атомов. Данная структурареализована в императивном стиле, в виде таблицы с регулярным"забыванием" информации после каждого присваивания. В результатеисключено многократное связывание глобальных объектов с ихопределениями, а заодно и множественное объявление свойств атомов.Конечно, такие эффекты можно смоделировать, но это не стольгармонично. Другое отличие связано с механизмом контекстоввычисления выражений.
Стандарт при вычислении значенийпеременных по умолчанию привлекает статический контекст, иначепеременную надо объявить специальной. Третье отличие затрагиваетунификацию представления функций и обрабатываемых ими значений.При внешнем подобии — и то, и другое выглядит как круглоскобочныесписки, но реализационно это разные типы данных, и возникает нечтовроде приведения типа ( funcall ) в ситуациях вызова функций,конструируемых "на лету".
Имеются и другие, не столь явные отличия,которые пока не стоит упоминать. GNU Clisp , xLisp, Cmuclсоответствуют стандарту Common Lisp . Документация по этим СФПдоступна на сайтах любителей Лиспа и ФП, а также на многихуниверситетских сайтах.Развитие парадигм программированияЗнакомое нам из курса философии слово " парадигма " имеет винформатике и программировании узко профессиональный смысл,сближающий их с лингвистикой. Парадигма программирования какисходная концептуальная схема постановки проблем и их решенияявляется инструментом грамматического описания фактов, событий,явлений и процессов, возможно, не существующих одновременно, ноинтуитивно объединяемых в общее понятие.Каждая парадигма программирования имеет свой круг приверженцев икласс успешно решаемых задач.














