TL/1 の変なところ (キャリー付き加減算)

前回はプログラミング言語 TL/1 の変数は 1 バイトの幅しかないということを説明した。

1 バイトというと 0〜255 までの 256 種類の値しか表現できないわけで、その範囲内でプログラミングするのは大変なのだが、それを補うかのようにキャリー付き加減算の演算子 ADC と SBC が用意されている。 このキャリー付き加減算は TL/1 の最大の特徴と言えるだろう。

今時の高級言語を使っているとキャリーフラグとかボローフラグという言葉を聞くことさえそうそう無いが、要は計算の結果として変数の大きさを越えるような値になってしまった場合に立つ暗黙のフラグと考えればよい。

具体例で言うと、足し算の結果が 256 以上になってしまった場合にキャリーフラグが立つ。 そしてその後に ADC 演算子で足し算をしたときにキャリーフラグが立っていれば 1 大きい数になる。

VAR A,B
BEGIN
  A := 255 + 1
  B := 0 ADC 0
  WRITE(0: "A=", A, CRLF, "B=", B, CRLF)
END

このプログラムの実行結果としてこう表示されることになる。

A=0
B=1

同様に、ボローフラグは減算のときの繰り下がりを表現する。

変数が 1 バイトであるという制約をある程度カバーできる便利な機能ではあるのだが、今時のコンパイラ事情からするとやっかいな性質でもある。 単純な定数畳み込みが出来なくなるし順序の入れ替えはもってのほか。 LLVM のようなフレームワークに載せるのは難しいかもしれない。

Document ID: 187d1f79293789b0ee125d9da5863e28