0

私が思いついた次の例を使用して、私の心の疑問を説明します。

以下に記述された C++ コードを検討してください。

#include<iostream.h>

void main()
{
 cout<<"LULZ \n";
 cout<<"\n Enter anything\n";
 int a;
 cin>>a;

 goto noexistence; 

}

さて、私の質問は、このコードがコンパイルされ、別のケースでは解釈された場合、エンド ユーザーへの出力はどのように異なるでしょうか? これをコンパイルすると、コンパイル時エラーが発生し、そのようなラベルが存在しない (noexistence) というメッセージが表示されます。

しかし、このコードを解釈するとどうなるでしょうか? C/C++ 用のインタープリターが存在するかどうかはわかりません (CERN から CINT ROOT について聞いたことがありますが、その操作方法はわかりません) 理論的に言えば、ラベルが存在しないこの誤謬を解釈はどのようにキャッチするのでしょうか。定義された?

「コードは行ごとに実行される」という解釈を何度も読んだので、この質問をしています。この「一行一行」という概念が、私にはまったく理解できませんでした。この質問が今私を食べているので、誰かがそれに光を当てることができますか。

4

2 に答える 2

3

インタープリターは入力コードを読み取り、実行前にすばやく解析します。

場合によっては、解析が単に行をリンクされたリストに読み込むだけの場合もあります。これがすべてインタープリター実装の解析である場合、goto ラベルのすべての入力行のスキャンが開始され、ラベルが見つからないというエラーが出力されます。

よりスマートなインタープリターは、既に実行された行の実行を続行するときに、ジャンプ テーブルを作成できます。この場合、ラベルはこのテーブルで検索でき (後方参照の場合)、次の行でスキャンすることもできます (前方参照の場合)。

別のインタープリターは、すべての入力のすべてのトークンを解析し、最初のステートメントを実行する前にジャンプ テーブルを作成することを選択できます。このようなインタープリターは、ジャンプ テーブルをチェックしてエラー メッセージを出力するだけです。

だから、それは本当にすべて依存しています。ただし、コンパイラは、実行を試みる前に、入力を解析して実行可能ファイルにコンパイルします。

于 2012-07-29T09:27:18.160 に答える
0

コンパイラーインタープリターバイトコードC++について読みましたか?

C++ 標準は、C++ プログラムがどのように実行されるかを示していません。頭の中で(または鉛筆と紙で)それを行うこともできますし、たくさんの人間の奴隷を使うこともできます(しかしそれは非倫理的です)、魔法を使って C++ プログラムを実行させることもできます。ほとんどの人は、コンパイラとコンピュータを使用します。

C ++のインタープリターを使用できます

実質的にも歴史的にも、C++ は、実際のハードウェア用の実際のコンパイラで何らかの方法でコンパイルできるという主な (語られていない) 前提を持って C から進化してきました。

そして、インタープリターとコンパイラーは白黒の区別ではありません。中間の方法があります (特に、バイト コードまたは抽象構文ツリーに変換してから、それを解釈します)。

「インタープリター」を行ごとに機能するものと定義するつもりはありません。ほとんどの通訳者はそのようには機能しません。彼らは通常、少なくとも「関数」全体を読み取って解析します。

于 2012-07-29T09:23:21.250 に答える