インタプリタ言語のコード行に到達するたびに、解釈し直されますか?
-
06-09-2019 - |
質問
何バイトコードは、ルビー、パール、またはPHPのように、プログラムのために生成されていないと仮定し、この場合には、再解釈するたびに以下の行1で実行リーチライン1再度?
while ($indexArrayMoviesData < $countArrayMoviesData + $countNewlyAddedMoviesData) {
# do something
}
ループが10万回を実行している場合は、は、その行が10万回を再解釈されることはありますか?
そうであれば、バイトコードの作成は、彼のプログラムのアップだけではなく、最初のスタートを支援するだけでなく、実行時に? (コードが再び再解釈する必要がないため)
解決
典型的には、バイトコードに変換されます、そのバイトコードが実行される。
しかし、例えばPHPの場合には、バイトコードは、すべてのリクエスト/ページビューで再生しています。あなたは、このようなXCacheと、APCまたはeAcceleratorのようキャッシュ、(それがPHPの場合にはしばしば呼ばれていますようまたはオペコード)バイトコードをインストールする場合を除きます。
他のヒント
perlのを含め、最近の言語の場合、コードが実行される前にプリコンパイルされています。だから、分析作業のほとんどは一度だけ実行されます。
これは、彼らがそれらを実行するたびにすべての行を解釈シェル、の場合はそうではない。
それがうまくいけばチェックします。
の値は、すべての可能性でも、バイトコードは、それが任意のより効率的ではない、場所を取るために追加の操作を必要とするループ内で更新されている場合。
非常に、非常に少数の通訳がこれを行います。例では、あなたが実際にプログラム的にあなたのコードのテキストを書き換える可能性がありハイパーカードのための年齢、古い、使用されなくなったの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が、なぜ本当のオペコードを使用しない?」