Если посмотреть на большинство (если не на все) динамические языки (например, Python, PHP, Perl и Ruby), все они интерпретируются. Поправьте меня если я ошибаюсь. Есть ли пример динамического языка, который проходит фазу компиляции? Динамический язык идентичен интерпретируемому языку?
programming-languages
php
ruby
perl
dynamic-typing
Джошуа Партоги
источник
источник
Ответы:
Не правда. Вы можете скомпилировать исходный код Python. Это одно экзистенциальное доказательство.
Есть интерпретаторы для статически типизированных языков и компиляторы для динамически типизированных языков. Два понятия являются ортогональными.
Примечание: в целом, язык - это просто язык с набором синтаксических конструкций для выражения семантики. Если вы пишете Python на доске, он все еще называется Python! Это реализация, которая может быть интерпретатором или компилятором. Быть статически или динамически типизированным (своего рода гибридом обоих) является свойством языка, в то время как выполнение программы путем интерпретации или компиляции является свойством реализации.
источник
.pyc
файлы имеют байт-код. Исходный код Python был проанализирован, оптимизирован и скомпилирован для их создания. Инструкции для байт-кода являются относительно высокоуровневыми, и наиболее популярной их реализацией является простой интерпретатор (для сравнения, посмотрите на PyPy, который JIT-компилирует байт-код для очень умного машинного кода во время выполнения), но Python не менее скомпилирован, чем Java или C #. Python «не компилируется» только в том случае, если «компиляция» была ограничена нативной преждевременной компиляцией , но никто ничего не сказал об этом и, как правило, он может относиться к любому преобразованию языка в язык.Python
иCPython
, в то время как последний является реализацией первого, так и естьPyPy
.Common Lisp динамически (и строго) типизирован и обычно компилируется .
Поскольку эта динамичность достигается во время выполнения, есть некоторые директивы, которые вы можете использовать в исходном коде, чтобы гарантировать компилятору, что символ будет содержать только определенный тип значения, чтобы компилятор мог оптимизировать сгенерированный код и повысить производительность.
источник
C # 4.0 поддерживает динамические типы (позднее связывание) и компилируется.
источник
node.js основан на движке JavaScript V8 от Google. V8 выполняет компиляцию во время выполнения. V8 ослепительно быстр, учитывая этот факт. Просто зайдите на http://shootout.alioth.debian.org и сравните V8 с любым из вышеперечисленных языков.
источник
Нет - конечно, возможно компилировать динамические языки.
Есть даже некоторые динамические языки, которые всегда компилируются по проекту (например, Clojure).
Однако этот вопрос касается важного связанного вопроса: хотя динамические языки могут быть скомпилированы, часто бывает так, что динамические языки не могут быть скомпилированы в код, который является столь же эффективным, как язык со статической типизацией . Это связано с тем, что в динамических языках есть некоторые присущие функции, требующие проверки во время выполнения, которые не нужны в статически скомпилированном языке.
Пример этого: языки, которые допускают исправление объектов во время выполнения (например, Ruby), часто требуют, чтобы объект проверялся (с поиском по хеш-таблице или подобным) всякий раз, когда вы вызываете метод объекта. Даже если это скомпилировано, компилятор должен будет сгенерировать код для поиска метода во время выполнения. В некоторой степени этот метод поиска не отличается от того, что должен делать интерпретатор.
Это добавляет значительную нагрузку по сравнению с вызовом метода в языке, подобном Java, где корректный метод может быть статически определен компилятором из определения класса и сведен к простому вызову функции в нативном коде.
Я полагаю, что этот эффект больше, чем что-либо еще, приводит к тому, что динамические языки в среднем работают медленнее, чем их статически скомпилированные аналоги. Как вы можете видеть из ошибочных тестов , именно статически типизированные языки (C, Java, Fortran и т. Д.), Как правило, быстрее всего работают с динамическими языками (Perl, Python, Ruby, PHP и т. Д.) В нижней части рейтинга.
источник
Когда-то БЕЙСИК интерпретировался. И некоторые варианты BASIC имели динамическую типизацию. И вы можете получить компиляторы для них.
(Это было в те времена, когда дисководы емкостью 100 тыс. Дисков, когда динозавры все еще бродили по земле, ели ничего не подозревающих разработчиков программного обеспечения на завтрак).
источник
Разные реализации Smalltalk обрабатывают это по-разному, но некоторые из них компилируются в байт-коды, работающие на высокопроизводительной виртуальной машине.
источник
Фактически большинство так называемых «интерпретируемых» языков проходят / позволяют выполнять компиляцию точно в срок, чтобы она работала быстрее. И некоторые из них должны быть скомпилированы в байт-код, прежде чем вы сможете их запустить.
На самом деле динамическая и интерпретируемая - это абсолютно две разные идеи, хотя есть корреляция. Причина в том, что кто-то когда-либо чувствует динамическую типизацию, делает их работу проще и быстрее, они не возражают против того, чтобы код выполнялся немного медленнее, но переносимо.
источник
Chrome, IE9 и Firefox 3.1+ все компилируют JavaScript в собственные двоичные файлы, а JavaScript динамически типизируется.
Я думаю, что причина того, что динамические языки исторически имеют тенденцию интерпретироваться, состоит в том, что динамическая типизация и интерпретация (или, более конкретно, отсутствие компиляции), как правило, являются функциями, полезными для языков сценариев и задач сценариев в целом.
Производительность также не столь важна для программ, написанных на этих языках, поэтому повторяющиеся издержки динамической типизации и интерпретации не были такой большой проблемой, как в языках. это значение производительности.
источник
Python, как правило, компилируется. По общему признанию скомпилирован в байт-код, который затем интерпретируется.
Perl работает аналогичным образом.
Common Lisp, как правило, компилируется в один из нативного или байтового кода. Это отличается между реализациями (и, в некоторой степени, внутри реализации, в зависимости от различных настроек оптимизации).
источник
Да. Все динамические языки являются интерпретируемым языком (но интерпретируемый язык может быть не динамическим).
Причина проста: если он динамический, ему нужен интерпретатор для выполнения динамизма на уровне двоичной компиляции.
ех. : когда мы помещаем данные в переменную PHP, а затем еще в другой тип, наша программа не может скомпилировать в двоичный код, поскольку каждый тип имеет свой собственный двоичный формат представления; интерпретатор динамически управляет сдвигами на двоичном уровне
источник