2

Ruby、Perl、PHPのように、プログラムに対してバイトコードが生成されないとします。この場合、実行が1行目に達するたびに、以下の1行目が再解釈されますか?

while ($indexArrayMoviesData < $countArrayMoviesData + $countNewlyAddedMoviesData) {
  # do something
}

つまり、ループが100,000回実行された場合、その行は100,000回再解釈されますか?

もしそうなら、バイトコードの作成は、プログラムの最初の起動だけでなく、実行中も役立ちますか?(コードを再度解釈する必要がないため)

4

5 に答える 5

5

通常、バイトコードに変換され、そのバイトコードが実行されます。

しかし、たとえばPHPの場合、バイトコードはすべてのリクエスト/ページビューで再生成されます。XCache、APC、EAcceleratorなどのバイトコード(またはPHPの場合はよく呼ばれるopcode)キャッシュをインストールしない限り。

于 2009-05-28T19:20:38.447 に答える
3

perlを含む最近の言語では、コードは実行される前にプリコンパイルされます。したがって、ほとんどの分析作業は1回だけ実行されます。

これは、実行するたびにすべての行を解釈するシェルには当てはまりません。

于 2009-05-28T19:22:24.420 に答える
2

すべてのコンサルタントが知っているように、あなたの質問に対する答えは「状況によって異なります」です。

そうです、一部の解釈された言語では、その行は毎回再解釈される可能性があります。ほとんどのシェルは大まかにこのように処理していると思います。

Basicの元のバージョンもこの方法でそれを行いました。

現在のほとんどの通訳者は少なくとも言語をトークン化するため、テキストを毎回再スキャンする必要はありません。つまり、BASICっぽいプログラムのような

 00010 LET A=42
 00020 DO WHILE A > 0
 00025    LET A = A - 1
 00030 ENDDO

少なくとも、キーワードの小さなトークンと変数のアドレスに変換します。

 LET    $0003, 42
 LABEL  00020 
 LETEST A, 0
 IFTRUEGOTO   00030
 SUB    $0005, $0003, 1
 GOTO   00020
 LABEL  00030

ここで、翻訳の大文字の各単語は、内部的には単一の整数です。このように、それを翻訳するための単一の字句解析パスがあり、その後にインタプリタがトークン値を解釈することができます。

もちろん、そこまで行くと、「ねえ、本物のオペコードを使ってみませんか?」と思っていることに気付くでしょう。

于 2009-05-28T19:17:28.033 に答える
2

インタプリタが適切な場合は、ループ中に$countArrayMoviesDataまたは$countNewlyAddedMoviesDataが変更されたかどうかを確認し、変更されていない場合は、合計を計算して保持できます。

ループ内で値が更新されると、おそらくバイトコードでさえ加算操作が必要になり、効率が向上しなくなります。

于 2009-05-28T19:22:24.420 に答える
2

非常に少数の通訳者がこれを行います。例としては、コードのテキストをプログラムで実際に書き直すことができる、古くて使用されなくなったHypercard用のHypertalkインタープリターがあります(これは単なる文字列です!)

バイトコードを生成しないインタープリターでさえ、最初にコードを解析します。これは、1行ずつ実行するのが難しく、一度にすべてを実行する方がはるかに簡単だからです。したがって、本当に単純なインタープリターには基本的にツリーがあり、2つの子を持つ「where」ループのノードがあります。1つは条件式の「less than」式で、もう1つはループの本体のブロックです。

于 2009-05-28T19:23:41.047 に答える