Что определяет язык программирования как динамический? - PullRequest
39 голосов
/ 06 февраля 2011

Что квалифицирует язык программирования как динамический язык?Какие проблемы я должен использовать для решения динамического языка программирования?В чем основное различие между статическими языками программирования и динамическими языками программирования?

Ответы [ 5 ]

29 голосов
/ 09 февраля 2011

Я не думаю, что здесь есть черное и белое - существует целый спектр между динамическим и статическим.

Давайте возьмем два крайних примера для каждой стороны спектра и посмотрим, куда это нас приведет.

Хаскелл - это крайность в статическом направлении.

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

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

Clojure - это крайность в динамическом направлении.

  • У него тоже есть система типов, ново время компиляции нет проверки типов.Многие распространенные ошибки могут быть обнаружены только при запуске программы.
  • Программы Clojure - это, по сути, просто списки Clojure (структура данных), и ими можно манипулировать как таковыми.Таким образом, при отражении во время выполнения вы фактически обрабатываете программу Clojure более или менее так, как вы бы ее набирали - форма времени исполнения очень близка к самому языку программирования.Таким образом, вы можете делать во время выполнения те же самые вещи, что и во время ввода.Следовательно, производительность во время выполнения может пострадать, потому что компилятор не может выполнить много предварительных оптимизаций.

Для динамических языков я обычно думаю: короткий шаг компиляции (в основном просто чтение синтаксиса), такая быстрая и пошаговая разработкаПрактически нет предела тому, что он мне позволяет делать, но не предотвратит глупых ошибок.

Как указывали другие посты, другие языки пытаются занять более высокий уровень - например, статические языки, такие какF # и C # предлагают возможности отражения с помощью отдельного API и, конечно, могут предлагать поэтапную разработку с использованием умных инструментов, таких как F # REPL.Динамические языки иногда предлагают необязательную типизацию (например, Racket, Strongtalk) и, как правило, имеют более продвинутые тестовые среды, чтобы компенсировать отсутствие проверки работоспособности во время компиляции.Кроме того, подсказки типа, хотя и не проверяются во время компиляции, являются полезными подсказками для создания более эффективного кода (например, Clojure).

Если вы ищете подходящий инструмент для данной проблемы, то это, безусловно, один изРазмеры, на которые вы можете посмотреть, но сами по себе вряд ли заставят принять решение в любом случае.Подумайте о других свойствах языков, которые вы рассматриваете - это функционал или ОО, или логика, или ... язык?У него есть хорошая основа для вещей, которые мне нужны?Нужна ли мне стабильность и двоичная обратная совместимость, или я могу жить с некоторой текучестью в компиляторе?Нужен ли мне обширный инструментарий?

7 голосов
/ 06 февраля 2011

Динамический язык выполняет много задач в во время выполнения , где статический язык выполняет их в время компиляции .
Обычно речь идет о одной или нескольких из: type system, рассылка методов и генерация кода.

Что также в значительной степени отвечает на вопросы об их использовании.

6 голосов
/ 06 февраля 2011

Существует лот различных определений, но one возможная разница:

  • A динамический язык обычноиспользуется динамическая печать.
  • A статическая язык обычно использует статическая печать.

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

4 голосов
/ 06 февраля 2011

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

Динамические языки, как правило, считаются теми, которые предлагают гибкость во время выполнения.Обратите внимание, что это не обязательно противоречит системам статического типа.Например, F # недавно был признан «любимым динамическим языком в .NET» на конференции, хотя он статически типизирован.Многие люди считают F # динамическим языком, потому что он предлагает функции времени выполнения, такие как мета-циклическая оценка, чтение-оценка-печать-цикл (REPL) и динамическая типизация (своего рода).Кроме того, вывод типа означает, что код F # не завален объявлениями типа, как большинство языков со статической типизацией (например, C, C ++, Java, C # 2, Scala).

Какие проблемы, для которых я долженперейдите к динамическому языку для решения.

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

3 голосов
/ 06 февраля 2011

Эта тема довольно хорошо описывает проблему:

Статический / Динамический против Сильный / Слабый

...