Какие языки динамически типизируются и компилируются (а какие статически типизируются и интерпретируются)? - PullRequest
37 голосов
/ 24 февраля 2010

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

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

Ответы [ 5 ]

35 голосов
/ 25 февраля 2010

Вот список нескольких интересных систем.Это не исчерпывающий!

Динамически типизированный и скомпилированный

  1. Компилятор схемы Gambit, Схема Chez , Воровство КлингераКомпилятор Scheme, компилятор Scheme Bigloo и, возможно, многие другие.

    Почему?

    Многим людям действительно нравится Scheme.Программы как данные, хорошая макросистема, 35 лет развития, большое сообщество.Но они хотят производительности.Следовательно, ряд хороших компиляторов нативного кода - Chez Scheme - даже успешный коммерческий продукт (интерпретируемые байт-коды бесплатны; нативные коды, за которые вы платите).

  2. Just-in-LuaJITкомпилятор времени для Lua .

    Почему?

    Чтобы показать, что это можно сделать.И затем люди начали , как , получить 3-кратное ускорение в своих программах Lua.Lua во многих играх, где важна производительность, плюс она распространяется и на другие продукты.70% кода в Adobe Lightroom - Lua.

  3. Компилятор iconc Icon -to-C.

    Почему?

    пятьдесят человек, которые его использовали любили Icon.Совершенно необычная модель оценки, самая инновационная (и, на мой взгляд, лучшая) система обработки строк, когда-либо разработанная.Но эта оценочная модель была действительно дорогой, особенно на компьютерах конца 1980-х годов.Скомпилировав Icon в C, Icon Project сделал возможным запуск больших программ Icon за меньшее количество часов.

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

Статически типизированный и интерпретированный

Эта категория встречается реже, но ...

  1. Объектив Caml .Диалект ML, средство для лотов инновационных экспериментов в области языкового дизайна.

    Почему?

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

  2. Moscow ML.Стандартный ML с несколькими дополнительными функциями системы модулей.

    Почему?

    Переносимое, быстрое время компиляции, легко сделать интерактивный цикл чтения / оценки / печати.Стал популярным обучающим компилятором.

  3. C-Terp.Я думаю, что это старый продукт от Gimpel Software.Sabre C - продукт, который, я думаю, вы больше не сможете купить.

    Почему?

    Отладка.Особенно отладка аппаратного обеспечения 1980-х годов под MS-DOS.При очень небольших ресурсах вы можете получить действительно хорошую помощь в отладке кода C на очень ограниченном оборудовании (например, процессор 4,77 МГц с 8-битной шиной, 640 КБ ОЗУ полностью загружен).Почти невозможно получить хороший визуальный отладчик для скомпилированного кода, но с помощью интерпретатора это довольно просто.

  4. UCSD Pascal - система, которая сделала "P-код" обычным словом.

    Почему?

    Учителям понравился языковой дизайн Никлауса Вирта, и компилятор мог работать на очень небольших машинах.Чистый дизайн Wirth и P-система UCSD создали непревзойденную комбинацию, и Pascal был стандартным языком обучения 1970-х годов.Молодым людям может быть трудно понять, что в 1970-е годы нет споров о том, какой язык преподавать на первом курсе.Сегодня я знаю о программах, использующих C, C ++, Haskell, Java, ML и Scheme.В 1970-х годах это всегда был Паскаль, и P-система UCSD была серьезной причиной.

    Если вам интересно, P обозначал portable .

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

3 голосов
/ 25 февраля 2010

Objective-C компилируется и поддерживает динамическую типизацию (безусловно, при вызове методов с использованием синтаксиса [target doSomething]). Таким образом, вы можете отправлять любое сообщение цели (используя синтаксис обычного языка, без программирования с использованием API отражения), получать только предупреждение во время компиляции, что оно может быть не обработано, и получать исключение только во время выполнения, если цель не не отвечает на этот селектор (который похож на сигнатуру метода); и вы можете спросить любой объект (который может быть статического типа id, если ваш код не знает ничего лучше или ему все равно), respondsToSelector: проверять его возможности.

2 голосов
/ 25 февраля 2010

Java (статически типизированный язык) компилируется в байт-код JVM, который интерпретировался в более старых версиях JVM, тогда как теперь он использует компиляцию Just In Time (JIT), то есть машинный код генерируется во время выполнения. Я также верю, что ML и его диалекты могут быть интерпретированы, и ML определенно статически типизирован.

1 голос
/ 25 февраля 2010

Actionscript имеет динамическую типизацию и компилируется в байт-код.

И он даже компилируется вплоть до машинного кода, если вы хотите выпустить приложение Flash на iPhone.

0 голосов
/ 25 февраля 2010

Python - это динамический язык с компиляторами.

См. этот вопрос SO - Python - why compile?, например.

В общем, компиляция делает программу намного быстрее.

...