2009-06-26 4 views
7

Я часто нахожу, что разработчики используют термины функциональный язык и динамический язык вместе и задаются вопросом, почему они всегда собираются вместе. В чем разница между ними? Может ли язык быть динамичным и функциональным? Дополняют ли они друг друга? Почему они нам нужны? Я программист на C# и еще не понимаю эту всю динамическую/функциональную вещь (C# будет иметь некоторые динамические функции в версии 4. Будет ли она также функционировать? Что здесь происходит?).В чем разница между динамическими языками и функциональными языками?

Спасибо, Abraham

+0

ответил (а) Комментарий. - найдите бесплатную версию Practical Common Lisp в Интернете и посмотрите пример, когда автор создает базу данных треков MP3, используя «только функции». Небольшой пример, но неплохо передает возможности. – Gishu

ответ

8

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

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

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

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

+0

Нет упоминания о Lisp? –

+0

Не все динамические языки должны динамически вводиться. Не смешивайте словарный запас – jitter

+1

@jitter: Это зависит от того, что вы подразумеваете под «динамическим языком». Я думаю, что это несколько двусмысленный термин. –

8

Выражаясь простым (но не точный) ответ

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

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

+0

Если функциональные языки состоят из функций, не являются ли они шагом назад, до дней процедурных языков? Как создавать масштабные приложения только из функций? – 2009-06-26 07:51:58

+1

БОЛЬШАЯ проблема с процедурными языками была глобальным состоянием, и все попирают всех остальных, «функции» на функциональных языках «чисты», поскольку они не имеют доступа к какому-либо состоянию/данным, отличным от их ввода. Wikip отлично справляется с разделом «Чистые функции». Как бы то ни было ... Я уточню свой пост – Gishu

+0

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

2

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# не становится функциональным языком или динамическим языком, но тот, в котором вы можете кодировать функциональный стиль и взаимодействовать с динамическими платформами.

+0

Ну, это звучит так, как если бы динамическая часть языка была предметом озабоченности компилятора или его среды исполнения, в то время как функциональная часть является заботой разработчика, поскольку он как-то программирует определенным образом, функциональным способом (хотя и не совсем так, как мне кажется, динамический язык позволяет вам программировать в общем виде, что также является парадигмой, я полагаю). Кстати, это звучит немного смешно, говоря языком «Функциональный» язык.Если язык не функционирует, это не хороший язык, а не «функциональный»? Не прагматично :) – 2009-06-26 07:59:48

+0

Я думаю, что разработчики понимают, что «функциональный» - это перегруженный термин :) Думаю, сегодня его можно назвать «функционально-ориентированным» - blech! –

3

Если вас интересуют парадигмы, на них наносится бумага Programming Paradigms for Dummies: What Every Programmer Should Know.

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

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

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

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

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

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

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

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

3

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

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

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

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

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

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