プログラミング
ALGOLのトレンチコートを着た野良猫たち
A few feral cats in an ALGOL trenchcoat. (wiki.xxiivv.com)
要約
この記事は、ALGOL風の構文と連結評価方式を持つプログラミング言語POP-2を紹介しています。POP-2は明示的なオペランドスタックを持ち、Uxnプラットフォームへのコンパイルが容易で、そのエレガントさと小さなフットプリントが特徴です。代入、関数、変数、制御フロー、I/O、配列などの機能が、スタックベースの評価メカニズムを中心に解説されています。
全文翻訳
ALGOLのトレンチコートを着た野良猫たち。
POP-2の構文はALGOLに似ており、代入はインフィックス記法ですが、評価スキームは深く連結しています。
foo := 123; (Pascalの場合)
123 -> foo; (POP-2の場合)
この言語にはオペランドスタックという明確な概念があります。したがって、前述の代入は、最初のステートメントがスタックに値を残し、次のステートメントがそれを消費する2つの別個のステートメントとして記述できます。
123;
-> foo;
典型的なPOP-2プログラマーインタープリター
この言語はUxn用に容易にコンパイルできます。実際、この言語は非常にエレガントで小さいため、コンパイラ全体が800行未満で2.5KBのメモリに収まります。
一見すると、この言語はPascalに少し似ています。ステートメントはキーワードで始まり、その後に式が続き、セミコロンで終わります。評価は、必要に応じてスタックに値を残しながらプログラムを通過することから成ります。
function sum x y;
x + y;
end
sum(5,6) * 2;
しかし、すべてがスタックマシンによって評価されることを覚えておくことが重要です。複数の値を返す関数は、単にそれらを次の関数が使用するためにスタックに残すだけです。
コメント
コメントステートメントは、終了セミコロンまでテキストの長さをブロックします。
comment
これはコメントです。複数行にまたがることができます。
;
変数
変数はvarsステートメント内で割り当てられます。これらは任意の長さを持つことができます。デフォルトでは、16ビットシステムでは、変数は2つの8ビットセルで構成されます。
comment
これらは3つの変数x、y、zです。
vars x y z;
comment
変数fooは10バイト長です。
vars foo:10;
If/Then/Elseif/Else/Close
一見すると、この言語はまったく驚くようなものではありませんが、各ケースが値を返すのではなく、スタックに値をプッシュすることに注意してください。
vars x;
4 -> x;
if x > 4 then
1;
elseif x = 4 then
2;
else
3;
close
2
Function/End
関数は典型的なALGOL形式で宣言されます。再帰は引数をスタックに残します。
function factRec n;
if n = 0 then
1;
else
n * factRec(n-1);
close
end
factRec(5);
Goto
ループは単純なGOTOで記述され、イテレータはありません。
comment
10回ループします。
vars i;
loop:
if i < 10 then
i + 1 -> i,
goto loop;
close
i;
10
I/O
元の実装では宛先なしで大きな矢印(=>)を使用していましたが、ここではこの実装のホストシステムがVarvaraであるため、複数の出力宛先を利用できます。
ASCII文字「H」を出力するためのコンソールポート番号(0x17、0x18):
0x48 => 23;
出力:
H
配列
変数はセルの長さを保持できます。各セルはバイトです。メモリ内の参照の絶対位置(ポインタ)は#プレフィックスでアクセスされます。
短い0x0048を配列の3番目と4番目のセルに格納するには:
vars array:10 i;
2 -> i;
0x48 -> (#array+i);
波括弧はポインタ演算を囲み、メモリ内の場所の値を取得できます。大きな矢印はそれをコンソールポートに送信します。
{array+i} => 23;
これらをすべて組み合わせることで、文字列印刷関数を作成できます。
comment
23はVarvaraのポート番号です。
function putChar c;
c => 23;
end
function printString s;
vars c:1 i;
0 -> i;
loop:
{s+i} >> 8 -> c;
if c then
putChar(c),
i + 1 -> i,
goto loop;
close
end
printString("Hello World!\n");
Source, Uxntal. Repository, Uxntal. A Modest Proposal, intercatlang. incoming: oscean 2026