スタックマシン
レジスタマシンでは「レジスタ+オフセット」のアドレス指定に相当するが、一般にレジスタマシンの命令ではオフセットフィールドのビット幅が大きい。
1960年代、メインフレームであっても主記憶容量が小さかったため、コード密度を高くすることは重要な課題だった。初期のミニコンピュータやマイクロコンピュータでも同様だった。もっと最近では携帯機器へのソフトウェアのダウンロードで、ダウンロード時間短縮のためにコード密度を高くする必要が生じた。コード密度が高ければ、キャッシュメモリや命令プリフェッチの効果が高まる。組み込みシステムでは搭載するROMを小さくできる。ただし、コード密度を高めすぎると実行性能が低下することがある。
バロースのアーキテクチャは、スタックマシンにタグ付きメモリを組み合わせたものである(各メモリワードの一部ビットでデータ型などを表す)。タグ付きメモリはオペコード(命令コード)の縮小に貢献している。つまり、整数や浮動小数点数といった区別はメモリワード自身が持っているので、命令コードで示す必要がない。スタックマシンであるためオペランドも少なく、結果として命令長が小さくて済むようになっている。
ただし、これによってレジスタマシンのコードが純粋なスタックマシンほどコンパクトになるわけではない。このようなハイブリッド方式のマシンで、スタックマシンのように頻繁にプッシュやポップを行うと性能は悪くなる。スタック操作はプロシージャコールの際にのみ行う方がよく、当然ながらメモリ参照せずにレジスタのみで処理するのが最善である。
第2世代スタックマシンと呼ばれるものは、データスタックからメモリアドレッシングの処理を肩代わりするアドレスレジスタ群を備えている。例えば、MuP21は "A" というレジスタを持っており、もっと最近の GreenArrays のプロセッサは A と B という2つのレジスタを持っている。
x86ファミリは基本的にレジスタ指向の命令セットだが、初期は外付けされ、後には内蔵・一体化された、浮動小数点関係のx87命令と浮動小数点レジスタは、スタック(マシン)指向である。これも一種のハイブリッドと言えよう。これは初期(1980年代)に、命令空間やチップ面積を節約する必要があったためである。現代の64ビット化されたx86であるx64では、(互換のために従来のFPUも残されているが)通常使用されるSSEの浮動小数点関係の命令も全てレジスタ指向の命令(レジスタ指向のSIMD命令)となっている。
スタックマシンの実装方式は2つあり、レジスタファイルのみを小さなスタックとして利用する実装と、スタック自体はメモリ上にあって、スタックのトップを指すレジスタを持つ実装である。後者の例としては、バロース B5000 や HP 3000 がある。稀に、メモリ上のスタックとレジスタファイルによる小さいスタックを別々のスタックとして持つ実装もある。B5000の場合、スタックトップの2つのデータは CPU レジスタに割り当てられ、残りスタックデータをメインメモリに割り当てていた。
回路素子の高速化によりメモリアクセスなどの配線遅延が問題となるに連れて、スタックを階層構造のキャッシュに収める実装が現れた。明示的なロード命令を用いない限り、スタック内のオペランドが使われる順序は、スタックトップから下方へ積まれている順序と一致する。このため、スタックトップから優先してより高速の記憶素子に収められた状態を保つだけで、オペランドの強力なプリフェッチが実現され、配線遅延が隠蔽される。仮想スタックマシンの多くでは、スタックトップはメモリ領域ではなくホストマシンのレジスタファイルで実装されるレジスタで実現されている。FPGA上のJAVAプロセッサであるJOPでは、レジスタファイルよりさらに高速で小さい記憶素子である、命令パイプライン上のラッチ回路をスタックトップ2個に充てている。
多くのスタックマシンは、スタックのトップN個の場所に対応するレジスタファイルを備えており、ロード命令やALU命令はその最上位近辺を対象とし、プッシュによってあふれた最下位のレジスタの内容はメモリ上のスタックに自動的に転送される。このため命令自体を小さくでき、命令のデコーダも小さくできる。しかし、命令が明示的にレジスタファイル内の個々のレジスタを指定できれば、コンパイラでレジスタの利用効率を向上させる最適化が可能となる。
HP 3000 やタンデムコンピューターズの T/16 はスタックマシンだが、RISCマシンへ移行する際にスタックマシンのコード列を等価なRISCのコード列に変換するトランスレータを用意した。この際に局所的最適化を施して、スタックアーキテクチャのオーバーヘッドの多くを除去している。例えばアドレス計算の反復を、使ってないレジスタに保持することで1回にしている。