В чем разница между динамическими языками и функциональными языками? - PullRequest
7 голосов
/ 26 июня 2009

Я часто нахожу, что разработчики используют термины «функциональный язык» и «динамический язык» вместе, и удивляются, почему их всегда объединяют. Каковы различия между ними? Может ли язык быть динамичным и функциональным? Они дополняют друг друга? Зачем они нам нужны? Я программист на C # и пока не понимаю всей этой динамической / функциональной особенности (в версии 4 у C # будут некоторые динамические функции. Будет ли это также функционально?

Спасибо, Авраам

Ответы [ 5 ]

8 голосов
/ 26 июня 2009

Чтобы выразить это простым (но не точным) ответом

  • Динамические языки - это языки, в которых тип (название класса) не так важен по сравнению с его статически типизированными языками Немезиды. Переменная может иметь объекты разных типов, назначенные ей в любой данный момент времени. Вызовы методов разрешаются во время выполнения. Это означает, что вы теряете преимущества статической типизации (предупреждения компилятора), но простые методы становятся универсальными - sort(list) работает как со списком строк, так и со списком целых чисел. например Ruby et. все
  • Функциональные языки Значение неизменяемости. Программы написаны в терминах больших и больших функций (обычно снизу вверх). Понятие состояния объекта и изменчивости осуждается . функция в этом контексте является самодостаточной (Термин «Чистый» согласно Википедии): все, что ему нужно для получения выходных данных, заключается во входных данных, которые он получает. Он также производит без побочных эффектов (если это явно не упоминается) и возвращает согласованный вывод для данного ввода. Это может привести к созданию элегантного кода (см. Свободно распространяемые интерфейсы), в котором входные данные передаются по конвейеру через функции diff для получения конечного результата, например LISP et.all

Однако границы омрачены языками, улавливающими лучшее из всех миров ... У вас может быть язык, который является одним, одним или ни одного.
например преимущественно статический C #, выбирающий лямбда-выражения в 3.0 и обеспечивающий динамические возможности с 4.0

8 голосов
/ 26 июня 2009

Динамическая типизация, система типов, ортогональна «функциональной», парадигме программирования.

Динамические «языки» фактически динамически типизированы. Это означает, что у вас нет проверки типов переменных во время компиляции.

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

Пример языка, который выполняет динамическую типизацию, и поддерживает анонимные функции: javascript. В Ruby также есть поддержка некоторых функциональных стилей. И есть другие.

4 голосов
/ 26 июня 2009

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

Статическая типизация означает, что типы объектов известны во время компиляции. В динамической типизации они известны во время выполнения.

Функциональное программирование означает стиль программирования, в котором вычисления выполняются путем оценки функций, избегая изменений состояния. (пример: вы используете рекурсию вместо циклов for, потому что цикл потребует изменения переменной счетчика и т. д.) Это помогает избежать ошибок и облегчает параллельное программирование. Чистые языки требуют программирования в функциональном стиле, другие просто включают его.

Примеры языков:

|----------------+---------+---------|
|                | Dynamic | Static  |
|----------------+---------+---------|
| Functional     | LISP    | Haskell |
| Not functional | PHP     | Java    |
|----------------+---------+---------|

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

3 голосов
/ 26 июня 2009

Если вам интересны парадигмы, то в статье «Программирование парадигм для чайников: что должен знать каждый программист» охватывает их.

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

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

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

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

  • Динамически типизированные языки - языки, которые задерживают определение типа во время выполнения, но набор типов фиксирован. Примерами являются Smalltalk, Lisps, текущие реализации Fortress. Некоторые языки со статической типизацией также допускают некоторые динамические проверки типов - Java, C #, C ++ и Ada. (это был неудачный динамический тип, приведенный от float к int в Ada, который разбил Ariane 5)

  • Языки с динамическими типами - языки, на которых новые типы могут создаваться во время выполнения. Самым популярным является JavaScript. Поскольку для определения типов необходимо запустить программу, для них сложно создать интегрированные среды разработки с автозаполнением с учетом типов.

  • Языки, которые динамически компилируются - языки, на которых новые скрипты могут быть скомпилированы во время выполнения. Это верно для bash, JSP, PHP и ASP в масштабе страницы и верно для более тонкого масштаба для lisps и JavaScript, которые поддерживают функцию 'eval', которая компилирует и запускает выражение.

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

2 голосов
/ 26 июня 2009

xtofl уже предлагает хорошую общую картину. Я могу говорить с точкой C #.

C # с некоторых пор стало легче работать функционально:

  • C # 2 ввел анонимные методы, что упростило создание делегатов, которые использовали состояние, которое в противном случае было бы локальным для метода
  • C # 3 представил лямбда-выражения, которые в основном похожи на анонимные методы, но еще более компактны
  • Поддержка LINQ как в C # 3, так и в .NET 3.5 упростила функциональный запрос данных, объединяя предикаты, проекции и т. Д.
  • Ни одна из функций C # 4 не вносит непосредственного вклада в функциональное программирование IMO, хотя именованные аргументы и необязательные параметры могут упростить создание / использование неизменяемых типов, что является одной из самых больших функций, отсутствующих в функциональной картинке IMO.

(Существуют и другие функциональные языки, такие как сопоставление с образцом и более впечатляющий вывод типов, но вы можете написать много кода функционального стиля разумно легко в C #.)

C # 4 получит некоторые динамические способности через тип dynamic (который сам по себе является статическим типом, с которым вы можете делать все что угодно). Это будет несколько «подписаться» - если вы никогда не используете тип dynamic, C # по-прежнему будет полностью статическим языком. язык не поддерживает динамический ответ, но DLR поддерживает это - например, если вы реализуете IDynamicMetaObjectProvider или наследуете от DynamicObject, вы можете добавить динамическое поведение.

Я бы сказал, что C # становится не функциональным языком или динамическим языком, а тем, на котором вы можете кодировать в функциональном стиле и взаимодействовать с динамическими платформами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...