Всегда ли интерпретируются динамические языки?


18

Если посмотреть на большинство (если не на все) динамические языки (например, Python, PHP, Perl и Ruby), все они интерпретируются. Поправьте меня если я ошибаюсь. Есть ли пример динамического языка, который проходит фазу компиляции? Динамический язык идентичен интерпретируемому языку?


4
Определите динамический язык, он динамически типизирован?
BenjaminB

3
Objective-C обладает многими «динамическими» свойствами.
Эдвард Стрэндж,

4
@ Джоб, это можно сделать с Лиспом десятилетиями. И это и скомпилировано и динамически типизировано. Таким образом, никогда не было точной границы между компиляцией и интерпретацией.
SK-logic

2
@Darien Вы можете также скомпилировать это во время выполнения и выполнить код позже. Строго говоря, это не интерпретация.
xmm0

3
@Darien Ничто не мешает компилятору хранить информацию таблицы символов в скомпилированном двоичном файле и генерировать код для доступа к ней во время выполнения. Это правда, что некоторые языки поддаются интерпретации больше, чем компиляции, но суть в том, что возможно иметь компилятор для этого языка. Еще одна важная вещь, которую стоит отметить, это то, что некоторые люди предполагают, что компилятор должен генерировать какой-то машинный код. На практике существуют компиляторы, которые просто выполняют преобразование исходного уровня на двух языках (или даже на одном и том же языке, как некоторые миниатюры Javascript).
xmm0

Ответы:


33

Если посмотреть на большинство (если не на все) динамические языки [т.е. Python, PHP, Perl и Ruby], все они интерпретируются.

Не правда. Вы можете скомпилировать исходный код Python. Это одно экзистенциальное доказательство.

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

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


19
С какой точностью должны совпадать отступы на доске, чтобы Python был синтаксически верным? ;)
edA-qa mort-ora-y

1
Вы не можете скомпилировать Python. PYC ускоряет только загрузку модуля. И py2exe просто встраивает интерпретатор в исполняемый файл с исходным файлом.
BenjaminB

8
@ Ubiquité: .pycфайлы имеют байт-код. Исходный код Python был проанализирован, оптимизирован и скомпилирован для их создания. Инструкции для байт-кода являются относительно высокоуровневыми, и наиболее популярной их реализацией является простой интерпретатор (для сравнения, посмотрите на PyPy, который JIT-компилирует байт-код для очень умного машинного кода во время выполнения), но Python не менее скомпилирован, чем Java или C #. Python «не компилируется» только в том случае, если «компиляция» была ограничена нативной преждевременной компиляцией , но никто ничего не сказал об этом и, как правило, он может относиться к любому преобразованию языка в язык.

4
@ Ubiquité: Да, это правильно, но это никак не связано с вашим утверждением, что «Вы не можете скомпилировать Python» или с тем, возможно ли скомпилировать Python. Прежде всего, вы смешиваете, Pythonи CPython, в то время как последний является реализацией первого, так и есть PyPy.
phant0m

2
@ClemC ВСЕ свойства языка встроены в компилятор или интерпретатор, иначе интерпретатор или компилятор - это что-то для другого языка.
Питер Б

15

Common Lisp динамически (и строго) типизирован и обычно компилируется .

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


12

C # 4.0 поддерживает динамические типы (позднее связывание) и компилируется.


4

node.js основан на движке JavaScript V8 от Google. V8 выполняет компиляцию во время выполнения. V8 ослепительно быстр, учитывая этот факт. Просто зайдите на http://shootout.alioth.debian.org и сравните V8 с любым из вышеперечисленных языков.


3

Нет - конечно, возможно компилировать динамические языки.

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

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

Пример этого: языки, которые допускают исправление объектов во время выполнения (например, Ruby), часто требуют, чтобы объект проверялся (с поиском по хеш-таблице или подобным) всякий раз, когда вы вызываете метод объекта. Даже если это скомпилировано, компилятор должен будет сгенерировать код для поиска метода во время выполнения. В некоторой степени этот метод поиска не отличается от того, что должен делать интерпретатор.

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

Я полагаю, что этот эффект больше, чем что-либо еще, приводит к тому, что динамические языки в среднем работают медленнее, чем их статически скомпилированные аналоги. Как вы можете видеть из ошибочных тестов , именно статически типизированные языки (C, Java, Fortran и т. Д.), Как правило, быстрее всего работают с динамическими языками (Perl, Python, Ruby, PHP и т. Д.) В нижней части рейтинга.


2

Когда-то БЕЙСИК интерпретировался. И некоторые варианты BASIC имели динамическую типизацию. И вы можете получить компиляторы для них.

(Это было в те времена, когда дисководы емкостью 100 тыс. Дисков, когда динозавры все еще бродили по земле, ели ничего не подозревающих разработчиков программного обеспечения на завтрак).


... но только когда они использовали GOTO. (Что, конечно, было довольно распространенным явлением, если они развивались в BASIC. АГА! Это объясняет это!)
Мейсон Уилер

Бейсик во время разработки был скомпилированным языком.
AProgrammer

2

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


2

Фактически большинство так называемых «интерпретируемых» языков проходят / позволяют выполнять компиляцию точно в срок, чтобы она работала быстрее. И некоторые из них должны быть скомпилированы в байт-код, прежде чем вы сможете их запустить.

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


1

Chrome, IE9 и Firefox 3.1+ все компилируют JavaScript в собственные двоичные файлы, а JavaScript динамически типизируется.

Я думаю, что причина того, что динамические языки исторически имеют тенденцию интерпретироваться, состоит в том, что динамическая типизация и интерпретация (или, более конкретно, отсутствие компиляции), как правило, являются функциями, полезными для языков сценариев и задач сценариев в целом.

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


1

Python, как правило, компилируется. По общему признанию скомпилирован в байт-код, который затем интерпретируется.

Perl работает аналогичным образом.

Common Lisp, как правило, компилируется в один из нативного или байтового кода. Это отличается между реализациями (и, в некоторой степени, внутри реализации, в зависимости от различных настроек оптимизации).


-5

Да. Все динамические языки являются интерпретируемым языком (но интерпретируемый язык может быть не динамическим).

Причина проста: если он динамический, ему нужен интерпретатор для выполнения динамизма на уровне двоичной компиляции.

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


2
Неправильно. Динамические языки могут быть скомпилированы (и иногда очень эффективно, например, с использованием JIT и методов адаптивной компиляции)
Basile

«Грубо говоря, JIT-компиляция сочетает в себе скорость скомпилированного кода с гибкостью интерпретации и накладными расходами интерпретатора ...» en.wikipedia.org/wiki/Just-in-time_compilation ваша программа не компилируется: она компилируется переводчик для вас
ClearMind

Читайте статьи, связанные с SELF
Старынкевич,

Конечно. Ваша ссылка упоминает: «Одна особенность Self заключается в том, что она основана на системе виртуальных машин того же типа, что и более ранние системы Smalltalk. То есть программы не являются самостоятельными объектами, как на таких языках, как C, но нуждаются в вся среда памяти, чтобы запустить ". не автономный = не двоичная скомпилированная виртуальная машина необходима для выполнения двоичной компиляции
ClearMind

1
Ваше определение компилятора слишком ограничено. Не каждый компилятор создает двоичный исполняемый файл. Для недавнего контрпример, изучите реализацию SBCL . Читайте последние Дракон книги и Лисп небольшими кусочками
Basile Starynkevitch
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.