MIXは、ドナルド・クヌースの著書『コンピュータプログラミングの技法』(TAOCP )に登場する架空のコンピュータです。MIXの型番は1009で、これは著者が重要だと考えた同時代の市販コンピュータの型番と名称を組み合わせて付けられたものです。また、「MIX」をローマ数字で読むと1009となります。
1960年代のMIXはその後、新しい(これも仮説上の)コンピュータアーキテクチャであるMMIXに取って代わられ、 TAOCPの今後の版に組み込まれる予定です。
MIXおよびMMIXアーキテクチャの両方に対応するソフトウェア実装は、Knuthによって開発され、無償で公開されている(それぞれ「MIXware」および「MMIXware」という名称)。KnuthのMIX/MMIXエミュレータの派生版もいくつか存在する。GNU MDKはそのようなソフトウェアパッケージの一つであり、無償で、幅広いプラットフォームで動作する。
彼らの教育の目的は、ジョン・L・ヘネシーとデビッド・A・パターソンの『コンピュータ構成と設計 - ハードウェア・ソフトウェア・インターフェース』におけるDLXアーキテクチャと非常によく似ている。
MIXは、バイナリと10進数のハイブリッドコンピュータです。バイナリでプログラムした場合、各バイトは6ビット(値の範囲は0~63)です。10進数では、各バイトは2桁の10進数(値の範囲は0~99)です。MIXバイトの2つの解釈(バイナリと10進数)は、異なるマシンタイプを表しており、直接互換性があるようには設計されていません。
「MIXには、バイナリと10進数の両方の性質を同時に持つという特異な特性があります。MIXプログラマーは、基数2の演算を行うマシンをプログラミングしているのか、基数10の演算を行うマシンをプログラミングしているのかを実際には知りません。そのため、MIXで書かれたアルゴリズムは、ほとんど変更を加えることなくどちらのタイプのマシンでも使用でき、どちらのタイプのマシンでもMIXを簡単にシミュレートできます。バイナリマシンに慣れているプログラマーはMIXをバイナリとして考えることができ、10進数に慣れているプログラマーはMIXを10進数として考えることができます。別の惑星から来たプログラマーは、MIXを3進数コンピュータとして考えることを選択するかもしれません。」[ 1 ]
バイトは、5バイトと符号1つからなるワードにまとめられます。MIX向けに書かれたほとんどのプログラムは、バイナリで解釈した場合に1バイトに63を超える値、10進数で解釈した場合に99を超える値を格納しようとしない限り、バイナリでも10進数でも動作します。
バイナリモードでは、ワードの範囲は −1,073,741,823 ~ 1,073,741,823 (両端を含む) であり、 10進モードでは −9,999,999,999 ~ 9,999,999,999 (両端を含む) です。MIXアーキテクチャにおける整数の符号と絶対値表現では、「 − 0」と「+0」が区別されます。これは、整数の2の補数表現にゼロの表現が1つ含まれているものの、与えられたビット数に対して表現可能な正の整数の数よりも負の整数が1つ多く含まれる現代のコンピュータとは対照的です。
MIXには9つのレジスタがあります。
1バイトは少なくとも6ビットであると想定されます。ほとんどの命令は、(first:last)の形式の接尾辞を使用して、レジスタのどの「フィールド」(バイト)を変更するかを指定できます。0番目のフィールドは1ビットの符号です。
MIX は、前の操作でオーバーフローが発生したかどうかも記録し、1トリットの比較インジケータ (より小さい、等しい、より大きい) を備えています。
MIXマシンは、4000ワードのメモリ(各ワードは5バイトと符号)を備え、アドレスは0から3999までです。また、さまざまな入出力デバイスも搭載されています。
メモリ内の各マシン命令は1ワードを占め、4つの部分から構成されます。読み書きするメモリ内のアドレス(2バイトとワードの符号)、アドレスに加算するインデックス指定(1バイト、使用するrIインデックスレジスタを記述)、レジスタまたはメモリ位置のどの部分を読み取ったり変更したりするかを指定する変更(1バイト)、および操作コード(1バイト)です。すべての操作コードには、関連付けられたニーモニックがあります。
MIXプログラムは、特にサブルーチンからの復帰時に、自己書き換えコードを頻繁に使用します。これは、MIXには自動サブルーチン復帰スタックがないためです。自己書き換えコードは、変更バイトによって容易に実現されます。変更バイトを使用すると、プログラムは例えば対象命令のアドレス部分にデータを格納し、命令の残りの部分は変更せずに残すことができます。
MIXプログラムは通常、MIXALアセンブリ言語を使用して作成されます。例については、「ハローワールドプログラム一覧」ページを参照してください。
MIXはソフトウェアとして以下のように実装されています。