Perlはコンパイルまたは解釈されますか?
まあ、それはあなたがコンパイルされた言語によって何を意味するかに依存します。たぶんこれがグーグルがあなたの質問に対する明確な答えをもたらさなかった理由です。
1つの視点は、コンパイルとは、ソースコード記述から別の記述へのコンパイルを意味するということです。つまり、 コード生成 です。
これらの前提を受け入れると、Perl 6をコンパイルでき、Perl5以前はインタープリター言語になります。
Perl 6は特に オウムのバイトコード にコンパイルされます。したがって、Perl 6は適切にコンパイルされた言語であり、同じように Java is です。
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は、実行を開始する前に、ソースファイルを完全に解析する必要があります。この定義により、解析の直前にソースファイルの実行を開始できる言語はすべてインタープリター型言語になります。
これを見る3番目の方法は、「解釈された」と「コンパイルされた」というこれらの単語がこの分野の専門家によって最も頻繁に使用される方法からです。 Perlについて考えるときに、プログラマーのランダムなサブセットが「コンパイル済み」または「インタープリター型」を選択するように求められた場合、ほとんどのプログラマーが「インタープリター型」を選択することは間違いありません。 Perlの性質に関する理論的な議論のためではなく、「コンパイルされた」は通常「コンパイル」、「リンク」、「オブジェクトコード」などの考えを呼び起こすため、「解釈された」は「コードを書く、試してみる」を意味すると解釈されます。 "。正しいか間違っているか、Perlが本当に解釈されているのか、実際にコンパイルされているのかを判断しようとするときに知っておくとよいでしょう。あなたはあなたの探求に関して多くの議論にぶつかるでしょう。
明確な質問を提供していないため、明確な回答は得られません。
Perlは常に、コンパイル中か実行中の2つの状態のいずれかになります。そのため、「コンパイル時」と「実行時」の話を目にします。通常、1つのコンパイルフレーズの後に1つの実行フェーズが続きますが、そのようにする必要はありません。
これらの2つのフェーズは、前後にトレードすることもできます。 eval STRING
は、インタープリターがコンパイラーを呼び出す方法です(したがって、do FILE
とrequire
も同様です)。 BEGIN
ブロックは、コンパイラーがインタープリターを呼び出す方法です(したがって、use
とno
も同様です)。
Perl -c
を実行するときは、実行時フェーズを省略します。コンパイル時のフェーズをスキップする方法はいくつかありますが、特に便利でありふれた方法はありません。 Apacheのmod_Perl
は、スクリプトを1回だけコンパイルしますが、何度も実行します。 Byteloaderを使用する場合は、同じことができます。など。
Perlがコンパイルされているか解釈されているかに対する正解は、単純にYES。です。
両方、本当に。 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グラフはどのように実行されますか?ウィキペディアから、インタプリタの1つの定義は次のようなものです。
インタプリタシステムの一部であるコンパイラによって作成された、保存されたプリコンパイル済みコードを明示的に実行します
つまり、OPCODEグラフが解釈されるということです。
Perl5をLLVMバイトコードにコンパイルするオプションを提供する作業が進行中です。これは、順番に、マシンコードにコンパイルすることができます。これは、Javaが使用するのと同じアプローチです。
Perlはインタープリター言語です。ただし、効率を上げるために内部でpコードにコンパイルされます。