Perl - это составной или интерпретированный язык программирования?

StackOverflow https://stackoverflow.com/questions/5376559

Вопрос

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

Это было полезно?

Решение

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

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

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

Perl 6 специально составлен в Попугающий байт -код. Анкет Perl 6, следовательно, является правильно скомпилированным языком, так же, скажем, Ява есть.

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. Анкет Предположительно, потому что это было багги, я не знаю.)

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

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

Другие советы

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

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

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

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

Правильный ответ на то, скомпилируется или интерпретируется Perl. ДА.

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


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

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

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

$ 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 не производит машинный код. Так как выполняется график OpCode? Из Википедии одно определение для переводчика - это то, что

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

Так что это означает, что графики OpCode интерпретируются.

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

Perl - это интерпретированный язык. Тем не менее, он находится внутренне в P-код для эффективности.

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

Оба. Во -первых, сценарий Perl 6 составлен в Bytecode (и оптимизирован). Затем он выполняется (однако, вам все еще нужен интерпретатор Perl для этого). Bytecode - это своего рода исполняемый код, который не зависит от среды, на которой он работает (тот же байт -код может работать на Enix Enviroment на процессоре ARM, системе Windows с X86 и Haiku на X64).

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

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

Чаще всего интерпретируется, но может быть составлено также.О компиляторе Perl

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top