回答:
サブルーチンコール/リターンおよび割り込み処理用のハードウェアスタックを備えた多くの低レベルマイクロコントローラーがありますが、そこにデータ(変数)を格納することは不可能ではないにしても困難であり、純粋なソフトウェアデータスタックの実装は非常に非効率的です。8051は1つの古典的な例であり、ローエンドPIC(PIC12 / PIC16)は別の例です。これらのマシンでは、自動変数に静的な格納場所を割り当てることでデータスタックがエミュレートされ、これらの場所の再利用量はコンパイラーの洗練度に依存します。
スタックエミュレーションがこの方法で実行されている場合、再帰(直接または間接的にそれ自体を呼び出す関数)が機能しないことに注意してください。関数の各インスタンスは、おそらく「プライベート」変数に対して同じ静的な場所を再利用するためです。一部のコンパイラーは、再帰の制限された使用を許可します(通常#pragma
、ある種の手段によって実装されます)。これにより、どれほど遅くしても真のデータスタックが作成されます。
余談ですが、DEC PDP-8やIBM System / 360など、サブルーチンや割り込みの処理も含めて、ハードウェアスタックがまったくないCPUアーキテクチャが存在します。これらのマシンでは、PC(リターンアドレス)とステータスレジスタ(割り込み用)はレジスタまたはメモリロケーションに保存されていましたが、すべてのインスタンスで、スタックを簡単に作成できる十分に柔軟なアドレスモードがマシンにあったと思いますソフトウェアで。
「スタックのサポート」とは
ハードウェアサポートなしでエミュレーションを介してこれをエミュレートできます。エミュレーションは、変数を使用してRAMで同じようなものを生成するコンパイラー生成コードです。最新のコンピュータアーキテクチャでスタックを直接サポートしていないことはまれです。
プログラミング言語の変数のセマンティクスは、ストレートアセンブリよりも高い言語の場合、ターゲットハードウェアアーキテクチャとはほとんど関係ありません。コンパイラの仕事は、プログラミング言語のセマンティックコントラクトに準拠するマシンコードを生成することです。