先生が初めてC++を紹介してくれたとき、最初の定義の1つは、Java、C、C++などの「スタックベースの言語」に関するものでした。
今、私はこれについて返信で読みました、そして私は正直に混乱しています。
C ++はスタックベースの言語ですが、スタックは必要ありませんか?
先生が初めてC++を紹介してくれたとき、最初の定義の1つは、Java、C、C++などの「スタックベースの言語」に関するものでした。
今、私はこれについて返信で読みました、そして私は正直に混乱しています。
C ++はスタックベースの言語ですが、スタックは必要ありませんか?
「スタックベースの言語」と聞くと、私は通常、すべてがスタック上で行われる、つまり変数がないFORTHのような言語を思い浮かべます。あなたの先生がJavaと言ったとき、彼らはスタックベースのJVMを意味していると思います。
現在、C ++標準にはスタックやヒープの概念はまったくなく、自動ストレージや動的ストレージなどの概念しかありません。C ++は、より抽象的なアイデアの観点から指定されており、理論的には多くの異なる実装やハードウェアで動作することができます。もちろん、これらのアイデアはスタックのアイデアに直接マッピングされるため、すべての実装でスタックを使用することになります。
C ++(C、Java、および他のほとんどのブロック構造言語など)は、関数呼び出しのアクティブ化レコードを保持するために、ある種の後入れ先出しデータ構造の意味での「スタック」を必要とします。つまり、関数はそれ自体を任意の深さまで再帰的に呼び出すことができます。そのため、各呼び出しのパラメーター/ローカル変数は、前の呼び出しのパラメーター/ローカル変数から独立している必要があります。これらの関数呼び出しが返されると、それぞれのパラメーター/ローカル変数を破棄する必要があります。
ただし、ハードウェアのスタックを直接サポートするCPUで実行する必要はありません。スタックを直接ハードウェアでサポートしなくても、C ++(および上記のその他のブロック構造化言語)を実行することは完全に可能です。
たとえば、初期のCrayおよび(現在の)IBMメインフレームはスタックをサポートしていません。それにもかかわらず、C++をサポートできます。少なくともほとんどの場合、アクティベーションレコードに使用されるLIFOデータ構造は動的に割り当てられ、リンクリストに組み込まれます。各関数が呼び出されると、そのアクティブ化レコードが割り当てられ、リンクリストに追加されます。関数が戻ると、そのアクティベーションレコードがリストから削除され、メモリが解放されます。
したがって、スタックを提供する基本的な操作の本質としてスタックを考えると、やや抽象的な観点から物事を見る場合は、そうです、C++にはスタックが必要です。「スタック」をあまり抽象的に見ておらず、スタックポインタレジスタを備えたCPU(またはその順序のもの)のようなもので考える場合、いいえ、C ++は間違いなくスタックを必要としません(C、Javaについても同じことが言えます)。 、など)
非「スタックベースの言語」は、単にスタックを必要としない言語ではありません。
Javaのバイトコード言語は、その操作がレジスターではなくスタックで動作するため、スタックベースの言語です。一方、IntelマイクロプロセッサのASM言語はレジスタを使用しており、これはそのアーキテクチャにコンパイルされるように設計された言語に反映される可能性があります。
CおよびC++は、スタックベースである場合とそうでない場合があります。それは完全にコンパイラとターゲットOS/マイクロプロセッサ次第です。あなたはそれがそうであるかそうでないかを仮定することはできません。ただし、実際には、主にレジスタベースとして実装されます。
言語が完全にレジスターで動作する場合でも、レジスターに適合しない関数呼び出しとローカル変数のスタックがあります。このスタックの存在は言語をスタックベースにしません、それはそうするレジスタの不在です。
編集:ユーザーmikeraによって提案されたNitpick:Javaのバイトコード言語はスタックベースですが、レジスタベースのほとんどのアーキテクチャで実行するには、レジスタベースのアーキテクチャでスタックベースのバイトコード言語を変換するものが必要になります。この作業は、JVMのインタープリターによって、またはJITまたは非JITバイトコードからネイティブへのコンパイラーによって実行される場合があります。
セマンティクスです。
車について考えてみてください。車は、ラジオ、速度、パワーシート、CDプレーヤー、カップホルダーの数、塗装色などの観点から説明されています。機能リストには、これらすべてを実行するための電力の供給源については記載されていません。ほとんどすべての車は内燃機関に行くガスを使用し、エンジンは車輪を回して発電機を動かし、すべての付属品を動かすための電力を作ります。エンジンは必要ありませんが、ほとんどの車にはエンジンがあります。
言語仕様では、データの存続期間について説明しています。ライフタイムがどのように実装されているかはわかりません。C ++コンパイラの99%は、言語仕様が必要とするデータの存続期間の要件を満たすために、グローバルデータ、スタック、およびヒープを使用していることがわかりました。