MIX (プログラミング)

MIX とは、ドナルド・クヌースが著書 "The Art of Computer Programming" ("TAoCP") で使った仮想計算機である。1960年代に生まれた MIX は、今後の "TAoCP" の版では MMIX という新たな（仮想の）コンピュータアーキテクチャで置換される予定である。MIX と MMIX のソフトウェア実装（MIXware および MMIXware）はクヌースが開発しており、自由に利用可能となっている。クヌースの MIX/MMIX エミュレータからの派生版も存在する。GNU MDK がその一例で、フリーソフトウェアとして幅広いプラットフォーム上で動作する。
TAoCP 本文中の記述によれば、MIX は「世界初の多機種複合型コンピュータ」で、型番は MIX という綴りをローマ数字として解釈したものと同じ 1009 であると設定されている。この数は「MIX によく似ていて MIX を簡単にシミュレートできる実在のコンピュータ 16 種」の型番から取って平均した（mixした）ものであるとあるが、具体的にその機種を検討してみるとかなり恣意的であり、このラインナップについてはこじつけと見てよいであろう。
アーキテクチャ.
MIX は二進法と十進法のハイブリッド型コンピュータである。二進法でプログラムする場合、各バイトは6ビットで構成される（値は 0 から 63 まで）。十進法では、1バイトは2桁の十進数字で構成される（値は 0 から 99 まで）。5バイトと符号で1ワードが構成される。MIX 用プログラムの多くは二進法でも十進法でも動作する（1バイトに63より大きい値を格納しようとしない限り）。
1ワードで表せる範囲は、二進モードでは −1,073,741,823 から 1,073,741,823 まで（これらの値を含む）、十進モードでは −9,999,999,999 から 9,999,999,999 まで（これらの値を含む）である。符号-仮数表現であるため、MIX では “−0” と “+0” が表現上区別される。これは、現代のコンピュータの多くが固定長整数の表現に採用している2の補数表現とは大きく異なる点である（浮動小数点数の表現には現代のコンピュータでもよく使われている）。
レジスタ.
MIX ではレジスタは9本存在する。
バイトは最低でも6ビットで構成される。命令ではバイト単位にレジスタ上の操作位置を指定でき、"(first:last)" の形式で表される（命令の修飾部）。0番目のフィールドは1ビットの符号を指す。
MIX では、直前の操作によってオーバフローが発生したかどうかを記録するフィールドと、比較結果を3種類の値（大きい、等しい、小さい）で示すフィールドも持っている。以下の図では、各レジスタをフィールドに分割して表示している。
メモリと入出力.
MIXマシンには、4000ワードのストレージ（メモリ）があり、アドレスは 0 から 3999 までである。以下のような各種入出力機器も含まれる。
命令.
各命令はメモリ上の1ワードに格納され、4つの部分から構成される。メモリアドレス部（2バイトと符号ビット）、インデックス指定部（1バイト、rIx レジスタの番号を指定）、修飾部（1バイト）、命令コード（1バイト）である。修飾部はアドレス指定されたワード内のフィールド位置の指定に使われる。全ての命令コードにはニーモニックが対応している。
MIX では自己書き換えコードをよく使う。特にサブルーチンからの自動復帰機能（リターンスタック）が命令セット上考慮されていないので、その場合も自己書き換えコードを使う。自己書き換えの際には、命令の中の修飾部を駆使して、命令ワード内の特定の部分だけを書き換える（例えば、アドレス部だけを書き換えるなどする）。
MIXプログラムを書く場合、MIXAL というアセンブリ言語を使う。
なお、シフト命令を見てもわかるとおり、MIXではバイトの内部構造が影響するような命令を持たない（例えばビット演算）。このため、二進法でも十進法でも同じプログラムが動作するのである。