インタプリタ言語のコード行に到達するたびに、解釈し直されますか?

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

  •  06-09-2019
  •  | 
  •  

質問

何バイトコードは、ルビー、パール、またはPHPのように、プログラムのために生成されていないと仮定し、この場合には、再解釈するたびに以下の行1で実行リーチライン1再度?

while ($indexArrayMoviesData < $countArrayMoviesData + $countNewlyAddedMoviesData) {
  # do something
}
ループが10万回を実行している場合は、

は、その行が10万回を再解釈されることはありますか?

そうであれば、バイトコードの作成は、彼のプログラムのアップだけではなく、最初のスタートを支援するだけでなく、実行時に? (コードが再び再解釈する必要がないため)

役に立ちましたか?

解決

典型的には、バイトコードに変換されます、そのバイトコードが実行される。

しかし、例えばPHPの場合には、バイトコードは、すべてのリクエスト/ページビューで再生しています。あなたは、このようなXCacheと、APCまたはeAcceleratorのようキャッシュ、(それがPHPの場合にはしばしば呼ばれていますようまたはオペコード)バイトコードをインストールする場合を除きます。

他のヒント

perlのを含め、最近の言語の場合、コードが実行される前にプリコンパイルされています。だから、分析作業のほとんどは一度だけ実行されます。

これは、彼らがそれらを実行するたびにすべての行を解釈シェル、の場合はそうではない。

インタプリタが賢明である場合は$ countArrayMoviesDataまたは$ countNewlyAddedMoviesDataがループの間、彼らはその後、合計が計算され、保管することができていなかった場合に変更された場合は、

それがうまくいけばチェックします。

の値は、すべての可能性でも、バイトコードは、それが任意のより効率的ではない、場所を取るために追加の操作を必要とするループ内で更新されている場合。

非常に、非常に少数の通訳がこれを行います。例では、あなたが実際にプログラム的にあなたのコードのテキストを書き換える可能性がありハイパーカードのための年齢、古い、使用されなくなったのHyperTalkインタプリタである(それは単なる文字列です!)

バイトコードを生成しなくても通訳は、それが線でその行を行うのは難しいと、最初にコードを解析し、はるかに簡単に一度にすべてを行うこと。だから、本当にシンプルなインタプリタは、基本的には二人の子供を持つ「どこで」ループのノードで、木を持っています。1つの条件のための表現「未満」、およびループの本体に1つのブロック

すべてのコンサルタントが知っているように、

あなたの質問への答えは、「それは依存しています。」です。

そうだね、いくつかのインタプリタ言語では、その行は、それぞれの時間を再解釈することができます。私はほとんどのシェルは大体このようにそれを扱う疑います。

基本の元のバージョンにも、このようにそれをやっています。

テキストは毎回再スキャンする必要がないように、

現在のほとんどの通訳は、の少なくともの、言語をトークン化します。つまり、

のような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

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

もちろん、あなたがそこまで行くと、あなた自身が考えて見つける「geeが、なぜ本当のオペコードを使用しない?」

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