Функциональные языки справляются хорошо со сложностью?

Мне любопытно, как функциональные языки выдерживают сравнение (в целом) с более "традиционными" языками, такими как C# и Java для больших программ. Процесс выполнения программы становится трудным следовать более быстро, чем если бы нефункциональный язык используется? Есть ли другие проблемы или вещи рассмотреть при записи большому проекту программного обеспечения использования функционального языка?

Спасибо!

6
задан Adam Crossland 2 February 2010 в 20:48
поделиться

6 ответов

Основная структура использует файл XML (EDMX), чтобы указать схему базы данных и отображение. Когда вы нажимаете «Обновить модель из базы данных», именно этот файл EDMX обновляется.

Далее, когда вы компилируете ваше приложение, этот файл EDMX проанализирован, и созданные классы подложки, которые вы смотрите, приведены, поэтому, если вы хотите увидеть изменения, отраженные в классах Backing, вам необходимо обновить модель, а затем перекомпилировать Отказ

Наконец, вы также должны помнить, что EDMX содержит 3 вещи.

  1. Схема базы данных / хранения (SSDL)
  2. концептуальная модель (CSDL)
  3. сопоставление между концептуальными и хранениями (MSL)

Обновление базы данных и нажатие «Обновление», будет обновлять SSDL, но выиграл T Обязательно внесите необходимые изменения автоматически в концептуальную модель, вам может потребоваться открыть EDMX - это дизайнер и проверять свойства на поле. (Вполне возможно иметь нетубируемое поле базы данных, отображаемое с ненужным концептуальным полем, но, очевидно, в этом случае, что не то, что вы хотите).

-121--2475341-

. Программный поток становится трудным для того, чтобы следовать быстро, чем если используется нефункциональный язык?

«Программный поток», вероятно, является неправильной концепцией для анализа большой функциональной программы. Контрольный поток может стать барокко, потому что есть функции более высокого порядка, но они, как правило, легко понять, потому что редко можно беспокоиться о том, чтобы беспокоиться, поэтому вы можете просто подумать о аргументах и ​​результатах. Конечно, мой опыт состоит в том, что мне намного проще следовать агрессивно функциональной программы, чем агрессивно ориентированная на объектно-ориентированную программу, в которой части реализации размазаются по многим классам. И мне проще следовать программы, написанной с функциями более высокого порядка, чем с динамической отправкой. Я также наблюдаю, что мои студенты, которые являются более представищими программистами в целом, имеют трудности с наследством, так и динамической отправкой. У них нет сопоставимых трудностей с функциями более высокого порядка.

Есть ли другие проблемы или вещи, которые следует учитывать при написании большого Программный проект с использованием функционального языка?

Критические вещи - хорошая модульная система. Вот некоторые комментарии.

  • Самая мощная система модульной системы, которую я знаю из единичной системы Схема PLT , разработанной Мэтью Флаттом и Мэтьесом Фельлизеном. Эта очень мощная система к сожалению не хватает статических типов, которые я нахожу большую помощь для программирования.

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

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

  • Наименее мощная / выразительная модульная система для функционального langauge - это система модуля haskell. Эта система имеет серьезную дефекту, что существуют без явных интерфейсов , поэтому большая часть когнитивной выгоды от модулей теряется. Еще один грустный результат - это то, что система модуля Haskell дает пользователям иерархическое пространство имени, использование этого пространства имени ( импорт квалифицировано , если вы инсайдер) часто устарели, и многие программисты для записи Haskell Как будто все было в одном большом, плоском пространстве имен. Эта практика составляет отказаться от другого из больших преимуществ модулей.

Если бы мне пришлось написать большую систему на функциональном языке и должен был быть уверен, что другие люди поняли это, я бы, вероятно, выбрал стандартные ML, и я установил очень строгие конвенции по программированию для использования системы модулей. (Например, явные подписи повсюду, опаг от подписи со :> , и без использования открыть в любом месте, когда-либо.) Для меня простота языка основных стандартных ML (по сравнению с ocaml ) и более функциональный характер стандартной базисной библиотеки (по сравнению с Ocaml) более ценны, чем превосходные аспекты системы модуля OCAML.

Я работал только на одной действительно большой программе Haskell, и пока я нашел (и продолжать находить) Работать в Haskell очень приятным, я действительно пропустил не от явных подписей.

Делают функциональные языки хорошо справляться со сложностью?

Некоторые делают. Я обнаружил ML модули и типы модулей (как стандартные ML, так и объективные CAML) вкусы бесценных инструментов для управления сложностью, пониманием сложности и размещения необработанных брандмауэров между различными частями крупных программ. У меня был менее хороший опыт с Haskell


Final Note: это не совсем новые вопросы. Системы разложения в модули с отдельными интерфейсами, проверенными компилятором, стало проблемой в ADA, C , C ++, CLU, Modula-3, и я уверен, что многие другие языки. Основным преимуществом системы, подобно стандартным ML или CAML, является то, что вы получаете явные подписи и проверка модульного типа (что-то, что сообщество C ++ в настоящее время борется со своими шаблонами и концепциями). Я подозреваю, что эти вопросы являются вневременными и будут важны для любой большой системы, независимо от языка реализации.

9
ответ дан 8 December 2019 в 03:39
поделиться

Я бы сказал обратное. О программах, написанных на функциональных языках, легче рассуждать из-за отсутствия побочных эффектов.

5
ответ дан 8 December 2019 в 03:39
поделиться

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

Конечно, это предполагает абсолютно чистое функциональное программирование - что, конечно, не всегда так. Вы можете использовать более традиционные языки и функциональным образом, избегая побочных эффектов там, где это возможно. Но принцип важен: избегание побочных эффектов приводит к более сопровождаемому, понятному и тестируемому коду.

14
ответ дан 8 December 2019 в 03:39
поделиться

Вы устанавливаете идентификатор, но это личность. Вы не должны его установить, SQL делает это для вас.

Вместо того, чтобы создать новую сессию, используйте одно и то же, и извлекайте, используя вместо нагрузки.

О разнице между нагрузкой и получить: http://ayende.com/blog/archive/2009/04/30/nhibernate-ndash-the-differection-betwendween-beg-bload-and-querying-by.aspx

-121--5086182-

Обычно это не вопрос «функциональных» против процедурных »; Это скорее вопрос ленивой оценки.

Ленивая оценка - это когда вы можете обрабатывать значения, не вычисляющие их еще; Скорее значение прилагается к выражению, которое должно приносить значение, если это необходимо. Основным примером языка с ленивой оценкой является Haskell. Ленивая оценка позволяет определить и обработать концептуально бесконечные структуры данных, так что это довольно круто, но это также делает его несколько сложнее для человеческого программиста, чтобы внимательно следовать, в своем уме, последовательность вещей, которые действительно произойдут на своем компьютере Отказ

Для в основном исторические причины большинство языков с ленивыми оценками являются «функциональными». Я имею в виду, что у этих языков есть хорошая синтаксическая поддержка конструкций, которые обычно являются функциональными.

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

0
ответ дан 8 December 2019 в 03:39
поделиться

Я выполнил программу Java, которая в основном реализовала своего рода чат между клиентом и сервером. Используется сокет для открытия порта сервера, который прослушивает входящие соединения. Вы должны иметь поток, слышащий их и вызывающий действия, когда когда когда-либо действительное соединение придет.

-121--1500270-

dx = sin (подшипник)
dy = cos (подшипник)
x = center.x + dist dx;
y = center.y + dist
dy;

-121--1416680-

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

  1. Функциональное программирование ненавидит побочные эффекты. Вы можете действительно черный ящик различных слоев и вы не будете бояться параллельной обработки ( модель актера , как в Эрланге, действительно проще в использовании чем блокировки и потоки).
  2. В культурном отношении функциональный программист используются для проектирования DSL для выражения и решить проблему. Определение основных примитивы проблемы является радикально иной подход, чем спешить к бренду новые модные рамки.
  3. Исторически этим полем руководили очень умные люди: сбор мусора, объектно-ориентированное, метапрограммирование... Все эти концепции были впервые реализованы на функциональной платформе. Литературы предостаточно.

Но недостаток этих языков в том, что они не имеют поддержки и опыта в отрасли. Портативность, производительность и совместимость могут быть реальной проблемой, когда на других платформах, таких как Java, все это кажется очевидным. Тем не менее, язык, основанный на JVM, такой как Scala, может быть действительно хорошим, чтобы получить выгоду от обеих сторон.

0
ответ дан 8 December 2019 в 03:39
поделиться

Становится ли сложным прохождение программы следовать быстрее, чем если бы Используется нефункциональный язык?

Это может быть так, в этом функциональном стиле программист предпочитает мыслить в терминах абстрактных, логических преобразований, отображения входов на выходы. Мышление с точки зрения "потока программы" предполагает последовательный, stateful режим работы - и хотя функциональная программа может иметь последовательное состояние "под капотом", она обычно не структурирована вокруг этого.

Различие в перспективе можно легко увидеть, сравнивая императивный и функциональный подходы к "обработке сбора данных". Первый имеет тенденцию использовать структурированную итерацию, как для или , в то время как цикл, говорящий программе "сделать эту последовательность задач, затем перейти к следующей и повторить, пока не будет сделано". Последняя имеет тенденцию использовать абстрактную рекурсию, как функция fold или map, говоря программе "вот функция для объединения/преобразования элементов - теперь используйте ее". Нет необходимости следовать за рекурсивным потоком программы через функцию типа map; поскольку это апатридная абстракция, достаточно подумать о том, что она означает, а не о том, что она делает.

Возможно, это несколько говорит о том, что функциональный подход медленно проникает в нефункциональные языки - проанализируйте циклы foreach, понимания списка Python...

0
ответ дан 8 December 2019 в 03:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: