Подтвердить что ты не робот

Какие языки динамически типизируются и компилируются (и которые статически типизированы и интерпретируются)?

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

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

4b9b3361

Ответ 1

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

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

  • Компилятор Gambit Scheme, Chez Scheme, будет компилятором Scinger Clinger Linger, Bigloo Компилятор схемы и, возможно, многие другие.

    Почему?

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

  • Компилятор LuaJIT "точно в срок" для Lua.

    Почему?

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

  • iconc Icon -to-C компилятор.

    Почему?

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

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

Статичная типизация и интерпретация

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

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

    Почему?

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

  • Москва МЛ. Стандартный ML с несколькими дополнительными функциями системы модулей.

    Почему?

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

  • С-Терп. Старый продукт, я думаю, может быть, от Gimpel Software. Saber C — продукт, который я не думаю, что вы можете купить больше.

    Почему?

    Debugging. Особенно, отладка оборудования 1980-х годов под MS-DOS. Для очень небольшого количества ресурсов вы могли бы получить действительно хорошую помощь, отлаживая код C на очень ограниченном оборудовании (думаю: процессор 4.77MHz с 8-битной шиной, 640K RAM полностью загружен). Почти невозможно получить хороший визуальный отладчик для скомпилированного кода, но с интерпретатором, довольно легко.

  • UCSD Pascal - система, которая сделала "P-код" домашним словом.

    Почему?

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

    Если вам интересно, P стоял за переносной.

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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