Почему "динамическая" часть динамических языков так хороша?

Джон Скит написал этот блог, в котором он заявляет, что собирается спросить, почему динамическая часть языков настолько хороша. Поэтому я решил заранее спросить от его имени: что делает их такими хорошими?

5 ответов


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

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

из этой статьи:

статический система типов-это механизм, с помощью которого компилятор проверяет исходный код и присваивает метки (называемые "типами") частям синтаксиса, а затем использует их для вывода чего-то о поведении программы. Динамическая система типов-это механизм, с помощью которого компилятор генерирует код для отслеживания типа данных (по совпадению, также называемый его "типом"), используемых программой. Использование одного и того же слова "тип" в каждой из этих двух систем, конечно, не совсем случайно, но все же лучше всего понимается как имеющая некое слабое историческое значение. Большая путаница возникает при попытке найти мировоззрение, в котором "тип" действительно означает одно и то же в обеих системах. Это не так. Лучший способ подойти к этому вопросу стоит признать, что:

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

главное, что вы избегаете много избыточности, которая исходит из того, что программист "объявляет" это, то и другое. Аналогичное преимущество может быть получено с помощью типа inferencing (бу это, например), но не так дешево и гибко. Как я писал в последние...:

полная проверка типа или вывода требует анализа целого программа, которая может быть вполне непрактично, - и останавливает то, что Ван Рой и Хариди в своем шедевре "Концепции, методы и модели Компьютерное программирование", вызов " полностью открытое Программирование". Цитирую пост мой от 2004: """ я люблю пояснения Ван Роя и Хариди, р. 104-106 их книги, хотя я могу и могут не согласиться с их выводами (которые в основном, что внутренняя разница мала - они укажите на Oz и Alice как совместимые языки без статической набрав, соответственно), все точки они делают хорошо. Важнее, Я считаю, что способ динамического набора текста позволяет реальной модульности (сложнее с статическая типизация, начиная с типа discipline должно быть применено через модуль границы), и "поисковое вычисление в вычислительной модели, которая интегрировано несколько программ примеры."

"рекомендуется динамическая типизация", они вывод: "когда программы должны быть гибкий, насколько это возможно". Я рекомендую чтение манифеста Agile для понять, почему максимальная гибкость решающее значение в большинстве реальных прикладное программирование -- и поэтому, в реальном мире а не в более академических круги доктор Ван Рой и доктор Хадиди move in, динамическая типизация обычно предпочтительнее, и не такая крошечная проблема как они делают разница. Тем не менее, они, по крайней мере, показывают больше осознание проблемы, посвящая 3 отличные страницы обсуждения это, плюсы и минусы, чем практически любой другая книга, которую я видел ... книги четко очертили и сформировали приоритет так или иначе, так что дискуссии редко сбалансированы как это;).


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


давайте сделаем несколько сравнений преимуществ / недостатков:

Динамические Языки:

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

Статические Языки:

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

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


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

http://en.wikipedia.org/wiki/Dynamic_programming_language

вот некоторые общие примеры

http://en.wikipedia.org/wiki/Category:Dynamic_programming_languages

и ответить на ваш первоначальный вопрос:

они медленные, вам нужно использовать базовый текстовый редактор для их написания - нет Intellisense или подсказок кода, они, как правило, большая боль в заднице, чтобы писать и поддерживать. Но самый известный (javascript) работает практически в каждом браузере в мире - это хорошо, я думаю. Назовем это "широкой совместимостью". Я думаю, вы могли бы получить интерпретатор динамического языка для большинства операционных систем, но вы, конечно, не могли бы получить компилятор для нединамических языков для большинства операционных систем.