Является ли Perl скомпилированным или интерпретируемым языком программирования?

компилируется или интерпретируется Perl?

7 ответов


Ну, это зависит от того, что вы подразумеваете под компилируемом языке. Возможно, именно поэтому googling не дал четкого ответа на ваш вопрос.

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

Если мы принимаем эти предпосылки, то Perl 6 может быть скомпилирован, а Perl 5 и старше-интерпретируемые языки.

Perl 6 специально скомпилирован в попугай байткод. Таким образом, Perl 6 является правильно скомпилированным языком, точно так же скажите:Java-это.

Perl 5 и старше анализирует исходный код Perl во внутренний список или дерево, но я не думаю, что его следует называть правильным компилятором, за исключением, возможно, в теоретическом смысле. Он не выводит байт-код, сборку или реальный машинный код, обычно связанный с компиляторами. Этап синтаксического анализа Perl для проверки синтаксиса Perl обычно называется "компиляцией" источника. Используется чтобы проверить синтаксическую валидность исходного файла Perl без его запуска.

он вызывается так:

perl -c myprog.pl

но если вы посмотрите на справку для параметров Perl,- c фактически означает "проверить".

-c                check syntax only (runs BEGIN and CHECK blocks)

(чтобы еще больше усложнить ситуацию, Perl 5 имел поддержку для написания внутреннего байт-кода, но это было удалены в версии 5.10. Возможно, потому, что он был глючным, я не знаю.)

С другой рука!--30-->, если вы утверждаете, что компиляция-это акт разбора исходного дерева на любой другой вид представления, ну, этот разбор делает Perl скомпилированным языком. Perl должен полностью проанализировать исходный файл, прежде чем начать его выполнение. По этому определению любой язык, который может начать выполнение исходного файла непосредственно перед синтаксическим анализом, будет интерпретируемым языком.

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


вы не получите определенного ответа, потому что вы не предоставили определенный вопрос.

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

эти две фазы также могут торговать взад и вперед. Ан eval STRING - Это способ для интерпретатора вызвать компилятор (так поэтому тожеdo FILE и require). А BEGIN block-это способ для компилятора вызвать интерпретатор (поэтому тоже use и no).

при выполнении perl -c, вы опускаете фазу времени выполнения. Существуют различные способы пропустить этап компиляции, но ни один из них не является особенно удобным или обычным. Апачи mod_perl только компилирует скрипты один раз, но выполняет их много раз. Если вы используете Byteloader, вы можете сделать то же самое. И так далее.

в правильный ответ на компиляцию или интерпретацию Perl-это просто да.


оба, на самом деле. Perl5 компилирует исходный код в объекты кода операции, а затем интерпретирует объекты кода операции. Последует длинный ответ.


Из Википедии,

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

по этому определению, Perl5 является компилятором. Он принимает исходный код Perl5 и создает график объектов кода операции.

$ perl -MO=Concise,-exec -E'for (1..3) { say "Hello, World!" }'
1  <0> enter 
2  <;> nextstate(main 48 -e:1) v:%,2048
3  <0> pushmark s
4  <$> const(IV 1) s
5  <$> const(IV 3) s
6  <$> gv(*_) s
7  <{> enteriter(next->c last->f redo->8) lKS/8
d  <0> iter s
e  <|> and(other->8) vK/1
8      <;> nextstate(main 47 -e:1) v:%,2048
9      <0> pushmark s
a      <$> const(PV "Hello, World!") s
b      <@> say vK
c      <0> unstack v
           goto d
f  <2> leaveloop vK/2
g  <@> leave[1 ref] vKP/REFC
-e syntax OK

однако компилятор Perl5 не создает машинный код. Итак, как выполняется график кода операции? Из Википедии одно определение для интерпретатора - это то, что

явно выполняет сохраненный предварительно скомпилированный код, созданный компилятором, который является частью системы интерпретатора

значит, графиков, инструкций интерпретированный.

работа идет вниз, чтобы предоставить возможность компиляции Perl5 в байт-код LLVM. Это, в свою очередь, может быть JIT-компиляции в машинный код. Это тот же подход, который использует Java.


Perl является интерпретируемым языком. Однако он компилируется внутренне в p-код для эффективности.


с Википедия: "Perl является высокого уровня, общего назначения,понял, динамический язык программирования". Perl 6 также допускает компиляцию (опять же, см. Википедия).


оба. Во-первых, скрипт Perl 6 компилируется в байт-код (и оптимизируется). Затем он выполняется (однако для этого вам все равно нужен интерпретатор Perl). Байт-код - это своего рода исполняемый код, который не зависит от среды, в которой он работает (тот же байт-код может работать в среде Unix на процессоре ARM, системе Windows с x86 и Haiku на x64).

Perl 6 можно скомпилировать в байт-код Parrot VM (виртуальной машины). Parrot VM также используется Python и Ruby.

Это что делает Perl, Ruby и Python быстрее, чем PHP, который просто интерпретируется (также может быть скомпилирован, но для этого вам нужны сторонние компоненты).


наиболее часто интерпретируется, но также может быть скомпилирован. о компиляторе perl