27

Perl はコンパイルまたは解釈されますか?

4

9 に答える 9

57

あなたは明確な質問を提供していないので、あなたは明確な答えを得るつもりはありません。

Perlは常に、コンパイル中か実行中の2つの状態のいずれかになります。そのため、「コンパイル時」と「実行時」の話を目にします。通常、1つのコンパイルフレーズの後に1つの実行フェーズが続きますが、そのようにする必要はありません。

これらの2つのフェーズは、前後にトレードすることもできます。Aneval STRINGは、インタプリタがコンパイラを呼び出すための方法です(したがって、do FILEandもそうですrequire)。ブロックは、コンパイラーがインタープリターを呼び出すためのBEGIN方法です(したがって、useandもそうですno)。

を実行するときperl -cは、実行時フェーズを省略します。コンパイル時のフェーズをスキップする方法はさまざまですが、特に便利でありふれた方法はありません。Apachemod_perlは、スクリプトを1回だけコンパイルしますが、何度も実行します。バイトローダーを使用する場合は、同じことができます。など。

Perlがコンパイルされているか解釈されているかについての正解は、単に「はい」です。

于 2011-03-21T12:12:25.873 に答える
27

まあ、それはコンパイルされた言語が何を意味するかによって異なります。おそらくこれが、グーグルがあなたの質問に対する明確な答えをもたらさなかった理由です.

1 つの観点は、コンパイルとは、ソース コードの記述から別の記述へのコンパイル、つまりコード生成を意味するということです。

これらの前提を受け入れると、Perl 6 はコンパイル可能になり、Perl 5 以前はインタープリター言語になります。

Perl 6 は特にParrot バイトコードにコンパイルされています。したがって、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 で削除されました。おそらくバグがあったため、私にはわかりません。)

一方、コンパイルとは、ソース ツリーを別の種類の表現に解析する行為であると主張する場合、その解析によって Perl はコンパイル済み言語になります。Perl は、実行を開始する前にソース ファイルを完全に解析する必要があります。この定義により、解析の直前にソース ファイルの実行を開始できる言語はすべて、インタープリター言語になります。

これを見る3 つ目の方法は、「解釈された」および「コンパイルされた」という言葉が、この分野の専門家によってどのように最も頻繁に使用されているかということです。Perl について考えるときにプログラマーの無作為なサブセットが「コンパイル済み」または「解釈済み」を選択するように求められた場合、ほとんどの人が「解釈済み」を選択することに大金を賭けるでしょう。Perl の性質に関する理論的な議論のためではなく、「コンパイル済み」は通常、「コンパイル」、「リンク」、「オブジェクト コード」などの考えを呼び起こすためです。 "。Perl が本当に解釈されているのか、それとも実際にコンパイルされているのかを判断しようとするときに、正しいか間違っているかを知っておくとよいでしょう。あなたの探求において、あなたは多くの議論に出くわすことになるでしょう。

于 2011-03-21T10:48:54.953 に答える
0

Perl はインタープリター言語です。ただし、効率のために内部的に p-code にコンパイルされます。

于 2011-03-21T10:50:56.593 に答える
0

ウィキペディアから: 「Perl は、高レベルで汎用のインタープリター型の動的プログラミング言語です」. Perl 6 ではコンパイルも可能です ( Wikipediaを参照してください)。

于 2011-03-21T10:54:18.783 に答える
-1

両方。まず、Perl 6 スクリプトがバイトコードにコンパイルされます (そして最適化されます)。次に、それが実行されます (ただし、これには Perl インタープリターが必要です)。バイトコードは一種の実行可能コードであり、それが実行される環境から独立しています (同じバイトコードは、ARM プロセッサの Unix 環境、x86 の Windows システム、および x64 の Haiku で実行できます)。

Perl 6 は、Parrot VM (仮想マシン) バイトコードにコンパイルできます。Parrot VM は Python と Ruby でも使用されます。

これにより、Perl、Ruby、および Python は、解釈されるだけの PHP よりも高速になります (コンパイルも可能ですが、これにはサードパーティのコンポーネントが必要です)。

于 2011-03-21T10:55:27.183 に答える
-2

ほとんどの場合解釈されますが、コンパイルされることもあります。 perl コンパイラについて

于 2011-03-21T10:50:59.693 に答える