2012年8月6日月曜日

回路的プログラミング言語

今、日経ソフトウェアの付録を読んでるんですけど
(既に読破したやつw)
演算の回路について読んで
(ANDとかORとかNOTとか)
回路的プログラミング言語ってのもあってよいかと思いました
ググればありそうですけど

例えばBIGNUMを書こうとした時
回路的プログラミングをした方が簡単に書けるのではないかと
例えば1桁をBYTEにして
10を越えれば上のBYTEに接続して加算
10かけるとかして上の桁に代入する時も
上のBYTEに接続して代入とか
桁はスタックで管理して
桁増やす時はスタックに積んで
代入するなら接続とか
代入って演算もいいけど
接続って演算があってもいい気がします
同じ動作だとしても別名でも嬉しそう
リテラルの代入が代入で
変数からの代入が接続とか

簡単にBIGNUMのフローチャートを書いてみようか

toString
文字列に代入
toBIGNUM
BYTE配列に代入

加算
桁の数だけ繰り返し
同じ桁を足して10の商を一つ上の桁に加算

大小比較
符合がプラスとプラスなら
桁が大きい方が大きい
符合がマイナスとマイナスなら
符合が大きい方が小さい
符合がプラスとマイナスなら
符合がプラスの方が大きい
桁が同じなら
桁の数だけ繰り返し
桁の数が異なる場合
数が大きい方が大きい
全部等しい時のみ等しい

符合無視大小比較
桁が大きい方が大きい
桁が同じなら
桁の数だけ繰り返し
桁の数が異なる場合
数が大きい方が大きい
全部等しい時のみ等しい

減算
お互い0以上
減算A
引かれる数の方がプラスで
引く数がマイナスだと
加算
引かれる数の方がマイナスで
引く数がプラスだと
加算(符合はマイナス)
お互いマイナス
減算B

減算A
大小比較して
引く数が大きいなら
引く数引く引かれる数
符合はマイナス
引かれる数が大きいなら
引かれる数引く引く数
符合はプラス

減算B
大小比較して
引く数が大きいなら
引く数引く引かれる数
符合はプラス
引かれる数が大きいなら
引かれる数引く引く数
符合はマイナス

10の乗数Xの掛け算
桁の数だけ繰り返し
それぞれの桁のX上の桁に代入

掛け算
演算結果変数宣言
掛けられる数の桁の数だけ繰り返し
掛ける数の桁の数だけ繰り返し
掛ける数の桁をX数値をIとする
掛けられる数の桁をY数値をJとする
K=I*J
K掛ける10のX+Y乗(10の乗数Xの掛け算)
演算結果変数宣言+=K

割り算
演算結果変数宣言=0
i=1
while 1
割られる数<割る数*10のi乗(10の乗数iの掛け算):break
i++
wend
i--
tmp=割られる数
for iii i回
for ii 1~10
tmp<割る数*ii*10のiii乗(10の乗数iiiの掛け算):break
next
ii--
tmp-=割る数*ii*10のiii乗(10の乗数iiiの掛け算)
演算結果変数宣言+=割る数*ii*10のiii乗(10の乗数iiiの掛け算)
next

フローチャートのはずがだんだんHSPっぽくなっていったとかw

0 件のコメント:

コメントを投稿