Становится ли трудным следовать за ходом программы быстрее, чем если бы> нефункциональный язык использовался?
"Поток программы", вероятно, является неправильной концепцией для анализа большой функциональной программы,Поток управления может стать барочным, потому что есть функции более высокого порядка, но их, как правило, легко понять, потому что редко бывает какое-либо общее изменяемое состояние, о котором нужно беспокоиться, поэтому вы можете просто подумать об аргументах и результатах.Конечно, мой опыт показывает, что мне гораздо легче следовать агрессивно-функциональной программе, чем агрессивно-объектно-ориентированной программе, где части реализации размазаны по многим классам.И мне легче следовать программе, написанной с функциями более высокого порядка, чем с динамической диспетчеризацией.Я также замечаю, что мои ученики, которые в большей степени представляют программистов в целом, испытывают трудности как с наследованием, так и с динамической диспетчеризацией.У них нет сравнимых трудностей с функциями более высокого порядка.
Есть ли другие вопросы или моменты, которые следует учитывать при написании большого программного проекта с использованием функционального языка?
критической вещью является хорошая модульная система.Вот некоторые комментарии.
Самая мощная из известных мне модульных систем из модульной системы PLT Scheme , разработанной Мэтью Флэттом и Матиасом Феллайзеном.К сожалению, в этой очень мощной системе отсутствуют статические типы, которые я очень помогаю программированию.
Следующая наиболее мощная система - модульная система Standard ML.К сожалению, Standard ML, хотя и очень выразительный, также допускает множество сомнительных конструкций, поэтому любителю легко устроить настоящий беспорядок.Кроме того, многим программистам трудно эффективно использовать модули Standard ML.
Система модулей Objective Caml очень похожа, но есть некоторые различия, которые, как правило, смягчают худшие излишки Standard ML.Языки на самом деле очень похожи, но стили и идиомы Objective Caml значительно снижают вероятность того, что новички будут писать безумные программы.
Наименее мощная / выразительная модульная система для функционального языкаявляется модульной системой HaskellЭта система имеет серьезный дефект: нет явных интерфейсов , поэтому большая часть когнитивного преимущества наличия модулей потеряна.Другим печальным результатом является то, что, хотя система модулей Haskell предоставляет пользователям иерархическое пространство имен, использование этого пространства имен (import qualified
, в случае, если вы инсайдер) часто не рекомендуется, и многие программисты на Haskell пишут код, как будто все водно большое, плоское пространство имен.Эта практика сводится к отказу от еще одного большого преимущества модулей.
Если бы мне пришлось писать большую систему на функциональном языке и быть уверенным, что другие люди поняли это, я 'Я бы, вероятно, выбрал Standard ML, и я бы установил очень строгие правила программирования для использования системы модулей.(Например, явные подписи везде, непрозрачные надписи с :>
и отсутствие использования open
где-либо, когда-либо.) Для меня простота основного языка стандарта ML (по сравнению с OCaml) и более функциональная природа СтандартаML Basis Library (по сравнению с OCaml) более ценна, чем превосходящие аспекты модульной системы OCaml.
Я работал только над одной действительно большой программой на Haskell, и пока нашел (и продолжаю находить)работать в Haskell очень приятно, я действительно упустил отсутствие явных подписей.
Хорошо ли справляются функциональные языки со сложностью?
Некоторые делают.Я обнаружил, что модули ML и типы модулей (как Standard ML, так и Objective Caml) представляют собой бесценные инструменты для управления сложностью, понимания сложности и размещения недоступных межсетевых экранов между различными частями больших программ.У меня был менее хороший опыт работы с Haskell
Последнее замечание: это не совсем новые проблемы.Декомпозиция систем на модули с отдельными интерфейсами, проверенными компилятором, была проблемой в Ada, C , C ++, CLU, Modula-3, и я уверен, во многих других языках.Основным преимуществом такой системы, как Standard ML или Caml, является то, что вы получаете явные подписи и модульную проверку типов (то, что сообщество C ++ в настоящее время борется с шаблонами и концепциями).Я подозреваю, что эти проблемы вечны и будут важны для любой большой системы, независимо от языка реализации.