Perlはコンパイルされているのですか、それとも解釈されたプログラミング言語ですか?

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

質問

Perlはまとめられていますか、それとも解釈されていますか?

役に立ちましたか?

解決

まあ、それはあなたがコンパイルされた言語の意味に依存します。たぶんこれがグーグルがあなたの質問に明確な答えをもたらさなかった理由です。

1つの視点は、コンパイルがソースコードの説明から別のコードの説明にコンパイルすることを意味するということです。 コード生成.

これらの施設を受け入れると、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は内部bytecodeを書き出すことをサポートしていましたが、 バージョン5.10で削除されました. 。おそらくそれがバギーだったので、私は知りません。)

一方で, 、コンピレーションがソースツリーを他の種類の表現に解析する行為であると主張する場合、その解析はパールが編集された言語になります。 Perlは、ソースファイルを実行し始める前に完全に解析する必要があります。この定義により、解析の直前にソースファイルの実行を開始できる言語は、解釈された言語になります。

3番目の方法 これを見るのは、これらの単語がどのように「解釈された」と「コンパイルされた」が、現場の専門家によって使用される頻繁に使用される方法からです。プログラマーのランダムなサブセットが、Perlを考えるときに「コンパイルされた」または「解釈」を選択するように求められた場合、ほとんどが「解釈」を選択すると、良いお金を賭けます。 Perlの性質に関する理論的な議論のためではなく、「コンパイルされた」は通常、「コンパイル」、「リンク」、「オブジェクトコード」などの考えを呼び出すため、「解釈」は「コードを書く」と見なされます。 "。正しいか間違っているか、それはPERLであるかどうかを判断しようとするときに知っておくと良いかもしれません、 本当に, 、解釈または実際にコンパイルされています。あなたはあなたの探求について多くの議論に遭遇するつもりです。

他のヒント

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

Perlは常に2つの州のいずれかにあります。コンパイルまたは実行中です。だからこそ、「コンパイル時」と「実行時」の話を見ることができます。通常、1つのコンパイルフレーズに続いて1つの実行フェーズを取得しますが、そのようにする必要はありません。

これらの2つのフェーズは、前後に取引することもできます。 an eval STRING 通訳者がコンパイラを呼び出す方法です(したがって、そうです do FILErequire)。 a BEGIN ブロックは、コンパイラが通訳を呼び出す方法です(したがって、そうです useno).

走るとき perl -c, 、実行時間フェーズを省略します。コンパイルタイムフェーズをスキップするにはさまざまな方法がありますが、それらのどれも特に便利なものではありません。アパッチ mod_perl スクリプトを1回だけコンパイルしますが、何度も実行します。 Byteloaderを使用する場合、同じことができます。 et cetera。

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グラフはどのように実行されますか?ウィキペディアから、通訳者の1つの定義は

インタープリターシステムの一部であるコンパイラによって作成された保存された事前コンパイルされたコードを明示的に実行します

つまり、オペコードグラフが解釈されることを意味します。

Perl5をLLVM Bytecodeにコンパイルするオプションを提供するための作業が停止されています。これは、JITをマシンコードにコンパイルすることができます。これはJavaが使用するのと同じアプローチです。

Perlは解釈された言語です。ただし、効率のためにP-Codeに内部的にコンパイルします。

から ウィキペディア: :「Perlは高レベルの汎用です、 解釈, 、ダイナミックプログラミング言語」。Perl6では、コンパイルも許可します(繰り返しますが、参照 ウィキペディア).

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

Perl 6は、Parrot VM(Virtual Machine)Bytecodeにコンパイルできます。 Parrot VMは、PythonとRubyでも使用されています。

これがPerl、Ruby、PythonをPHPよりも速くする理由です。これは、解釈されたばかりです(同様にコンパイルできますが、これにはサードパーティのコンポーネントが必要です)。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top