Переводчики и динамически типизированные языки - PullRequest
8 голосов
/ 09 декабря 2010

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

Ответы [ 6 ]

5 голосов
/ 09 декабря 2010

Короче говоря: они сочетаются друг с другом как горох и морковь.

Компиляция и интерпретация, а также типизация языка - это принципиально разные проблемы, поскольку вы можете иметь все возможные варианты.С другой стороны, «причина» выбора компиляции, а не выбора динамической типизации для языкового дизайна обычно одинакова: производительность.«Причина» выбора динамической типизации и интерпретации также несколько связана.

Это не сложное и быстрое правило.Вы всегда можете их перепутать.Например, вы можете скомпилировать Perl и Lisp и интерпретировать C.

3 голосов
/ 30 ноября 2013

Вы наблюдаете не причинную корреляцию:

  • Динамическая типизация и интерпретация коррелируют, потому что и то, и другое легко реализовать.
  • Статическая типизация и компиляция коррелируют, потому что оба они обеспечивают предсказуемо хорошую производительность.

Компиляторы обычно устанавливаются на языки с динамической типизацией в попытке повысить производительность (поскольку производительность часто очень низкая). Например, вот как долго некоторые основные языки с динамической типизацией интерпретировались до написания их первого компилятора: Lisp (1958-1962), Mathematica (1988-2004), Lua (1993-2004), Python (1991-2002) и Javascript (1995-2009). Напротив, такие языки, как OCaml (1996) и F # (2001) были впервые выпущены в качестве компиляторов.

2 голосов
/ 09 декабря 2010

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

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

1 голос
/ 09 декабря 2010

Common Lisp code в основном компилируется.Язык программирования Common Lisp был описан в стандарте ANSI с поддержкой компиляции.Стандарт ANSI описывает функции, которые компилируют код, описывает различные аспекты оптимизации, описывает аспекты процесса компиляции и т. Д.

Интерпретаторы для Common Lisp существуют, но используются реже.

Common LispРеализации часто могут свободно смешивать разные режимы выполнения.Почти у всех есть компилятор.У некоторых есть только компилятор.

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

0 голосов
/ 09 декабря 2010

Проверка типов один раз - это то, что делает «компилятор» (~ средство проверки типов).

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

0 голосов
/ 09 декабря 2010

Согласно определению динамически типизированных языков ...

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

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

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

Я чувствую, что этот ответ все еще неполон, но я надеюсь, что он укажет вам правильное направление. Возможно, другие здесь могут расширить это.

...