OISC(One-instruction Set Computer)とは
OISC(One-instruction set computer)は、その名の通り、
命令がたった一つしかないコンピュータです。これは、従来のコンピュータが持つ多様な命令セットとは対照的です。一見すると非常に非効率に思えるかもしれませんが、高度なメモリマッピング技術を駆使することで、複雑な演算処理も実現できます。そのため、一部の実装では、唯一の命令として
Subleq(subtract and branch if less or equal to zero、減算と0以下なら分岐) が採用されています。
OISCは、別名で
URISC(Ultimate RISC、究極のRISC) と呼ばれることもあります。これは、
RISC(Reduced Instruction Set Computer)の概念を極限まで推し進めたものと解釈できます。また、いくつかのOISCをベースにしたプログラミング言語は、
チューリング完全であることが証明されており、理論的にはあらゆる計算が可能です。
OISCの利用
OISCは、命令が一つしかないという特性上、実用的なコンピュータとして利用されることは稀です。しかし、その特異な構造は、プログラミングの概念を深く理解するための教材として、また、
難解プログラミング言語 の世界で独自の存在感を放っています。
OISCを使ったプログラミングは、初期設定やメモリマッピングが非常に重要になります。限られた命令をどのように組み合わせ、効率的な処理を実現するかを考えることは、プログラミングの根本を理解する上で役立ちます。
Subleq命令の詳細
Subleqは、OISCの中でも特に一般的な命令です。通常、Subleqは
3つのパラメータを持ち、以下のような構文で表現されます。
`Subleq a, b, c`
この命令は、以下の処理を行います。
1.
bからaを減算 し、その結果をbに格納します。
2. 減算の結果が
0以下の場合、制御をアドレスcに移します。
3. 減算の結果が0より大きい場合は、次の命令に進みます。(この場合は次の命令がないため終了)
Subleqの動作例
以下にSubleqの簡単な動作例を示します。メモリ上のアドレスを、そのアドレスに格納されている値と共に示します。
アドレス | 値 |
---|
- | - |
0 | 7 |
1 | 7 |
2 | 4 |
3 | 3 |
7 | 1 |
この状態で、`subleq 0 1 7` が実行された場合:
1. アドレス1の値(7)からアドレス0の値(7)を減算し、結果(0)をアドレス1に格納します。
2. 減算結果が0なので、制御をアドレス7に移します。
3. アドレス7には値が格納されているだけで命令がないため、処理は終了します。
次に、アドレスを以下のように変更し、`subleq 2 3 7` を実行した場合:
アドレス | 値 |
---|
- | - |
0 | 7 |
1 | 0 |
2 | 4 |
3 | 3 |
7 | 1 |
1. アドレス3の値(3)からアドレス2の値(4)を減算し、結果(-1)をアドレス3に格納します。
2. 減算結果が0より小さいので、制御をアドレス7に移します。
3. アドレス7には値が格納されているだけで命令がないため、処理は終了します。
Subleqのソースコード
Subleqのソースコードを書く際には、可読性を向上させるために、構文を少し変更することがあります。例えば、数値の代わりに変数名を使用したり、コメントを記述したりすることが一般的です。
OISCのマシンアーキテクチャ例
OISCのアーキテクチャには、以下のようなものが存在します。
BitBitJump:ビット単位で処理を行うOISC。
ByteByteJump:バイト単位で処理を行うOISC。
Blues Machine:複雑なメモリマッピングを利用するOISC。
DJN: 1つの命令で乗算、加算、ジャンプなどの処理を行うことができるOISC。
これらのアーキテクチャは、それぞれ異なる特性を持っており、OISCの多様性を表しています。
関連項目
難解プログラミング言語:OISCは、
難解プログラミング言語のベースとして利用されることがあります。
外部リンク
Esolang wikiにおける、OISCの記事
*
Esolang wikiにおける、Subleqの記事