Today アクセスカウンター Yesterday アクセスカウンター

やっと動いたよォオオーー

他の例題をやりつつ,コンパイラのバグを取りつつ,この間からダラダラずっと取り組んでいた,n 番目の素数を求める nthprime2 D ルール (nthprime *n *nthprime) のコンパイルに,ようやく成功しました.こんなんに何日かかってるんだ,俺のクズ… orz

結局,ETI のレベルでのプログラム変換を徹底して,完全に C のレベルと同じことをする (ETI の配列 (というか,このレベルだと,何でも入るタプル.Java で言うところの,Object 型の配列) 機能とかは,いっさい使わない.本当に,ただのワード配列として,その上に全てのデータ構造をエンコードしていく) ようにしたのが勝因でした.

つまり,C コードへの変換が,死ぬほど単純化されるので,バグが入り込む余地が無くなる.ETI の上でバグ無しで動くのならば,C にコンパイルしても正しく動く (小手先の変なことはいっさいしない).出力結果まで,ほとんど同じ.

ETI (単に ETI の機能を使って出力しているので,C と違って余計なところまで表示されてる.あと,C とは若干構造がことなる部分もある)

[D]>(main (nthprime 2 *))
-------------------------D execution ---------------------
{5 2 2 1 3 7 () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ()}
{14 INT 2 PVAR () PVAR () REF 9 ARRAY 2 () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ()}
{1 2 2 1 3 7 2 15 7 17 19 1 27 () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ()}
{28 INT 2 INT 3 PVAR () REF 9 ARRAY 2 INT 2 INT 3 INT 5 INT 1 INT 2 PVAR () INT 2 INT 2 () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ()}
----------------------------------------------------------
succeeded.
(main (nthprime 2 3))


C にコンパイルしたもの

$ ./etc '(nthprime 2 *)'

----------------------------------------------------------

String : "(nthprime 2 *)"

Array[] = {26, CONS, SYM, 6, REF, 17, STR, 8, 0x0000006E, 0x00000074, 0x00000068, 0x00000070, 0x00000072, 0x00000069, 0x0000006D, 0x00000065, 0x00000000, CONS, INT, 2, REF, 22, CONS, PVAR, 0, NIL, 0};

Prity print : Memory : {

length : 26


1 Cons
2 (sym (ref 6))
4 (ref 17)
6 String
7 strlen : 8
8 "nthprime"
17 Cons
18 (i 2)
20 (ref 22)
22 Cons
23 (pvar)
25 ()
}

Symbolic expression => (nthprime 2 *23)



{4 2 2 1 3}


{4 2 2 2 *3}

Memory : {

length : 4


1 (i 2)
3 (pvar)
}
nthprime2
Dynamic linking : nthprime2.dll

.....
succeeded !
call : nthprime2



{5 2 2 1 3 7}

Array[] = {14, INT, 2, PVAR, 0, PVAR, 0, REF, 9, ARRAY, 2, NIL, 0, NIL, 0};
Remove : nthprime2.dll

succeeded.
Array[] = {24, INT, 2, INT, 3, PVAR, 0, REF, 9, ARRAY, 2, INT, 2, INT, 3, INT, 5, INT, 1, INT, 2, PVAR, 0, INT, 2};
Memory : {

length : 24


1 (i 2)
3 (i 3)
5 (pvar)
7 (ref 9)
9 Array
10 arrlen : 2
11 (i 2)
13 (i 3)
15 (i 5)
17 (i 1)
19 (i 2)
21 (pvar)
23 (i 2)
}


(nthprime 2 3)

----------------------------------------------------------

やっぱり C 速いよ C.100 とかでも一瞬だ.400 ぐらいまでも一瞬だけど,それ以上は再帰呼び出ししてるからスタックが溢れちゃう.

$ ./etc '(nthprime 100 *)'

----------------------------------------------------------

(省略)
succeeded.
Array[] = {3720, INT, 100, INT, 541, PVAR, 0, REF, 9, ARRAY, 100, INT, 2, INT, 3, INT, 5, INT, 7, INT, 11, INT, 13, INT, 17, INT, 19, INT, 23, INT, 29, INT, 31, INT, 37, INT, 41, INT, 43, INT, 47, INT, 53, INT, 59, INT, 61, INT, 67, INT, 71, INT, 73, INT, 79, INT, 83, INT, 89, INT, 97, INT, 101, INT, 103, INT, 107, INT, 109, INT, 113, INT, 127, INT, 131, INT, 137, INT, 139, INT, 149, INT, 151, INT, 157, INT, 163, INT, 167, INT, 173, INT, 179, INT, 181, INT, 191, INT, 193, INT, 197, INT, 199, INT, 211, INT, 223, INT, 227, INT, 229, INT, 233, INT, 239, INT, 241, INT, 251, INT, 257, INT, 263, INT, 269, INT, 271, INT, 277, INT, 281, INT, 283, INT, 293, INT, 307, INT, 311, INT, 313, INT, 317, INT, 331, INT, 337, INT, 347, INT, 349, INT, 353, INT, 359, INT, 367, INT, 373, INT, 379, INT, 383, INT, 389, INT, 397, INT, 401, INT, 409, INT, 419, INT, 421, INT, 431, INT, 433, INT, 439, INT, 443, INT, 449, INT, 457, INT, 461, INT, 463, INT, 467, INT, 479, INT, 487, INT, 491, INT, 499, INT, 503, INT, 509, INT, 521, INT, 523, INT, 541, INT, 543, INT, 1, INT, 100, PVAR, 0, INT, 2, INT, 3, INT, 3, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 3, INT, 3, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 3, INT, 3, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 23, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 3, INT, 3, INT, 5, INT, 5, INT, 3, INT, 3, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 3, INT, 3, INT, 5, INT, 5, INT, 7, INT, 7, INT, 11, INT, 11, INT, 13, INT, 13, INT, 17, INT, 17, INT, 19, INT, 19, INT, 23, INT, 23, INT, 29};

(省略)

(nthprime 100 541)

昨日書いた,C 言語の関数呼び出しを使わざるを得ない問題は,まだ未解決なのですが… そのせいで,再帰が多くなりすぎると C スタックが溢れたりとか,いろいろ問題が.

あと,致命的なのがもう一つ.nthprime は,primeArray を nthprime が再帰的に呼び出すという構造になっているのですが,今のところ別々に C にコンパイル (nthprime.c と primeArray.c) して,手作業で dll を作るという,情けない状況 (ETI のレベルでは,全てのルール呼び出しは実行時に動的ディスパッチされるので,静的に依存関係を解決する必要が無い)… つまり,こゆこと.

$ gcc -c -shared -std=c99 -o nthprime.o nthprime.c
nthprime.c: In function `nthprime2':
nthprime.c:262: warning: implicit declaration of function `primeArray5'

$ gcc -c -shared -std=c99 -o primeArray.o primeArray.c

$ gcc -shared primeArray.o nthprime.o -o nthprime.dll

それぞれのファイルは,こんな感じ (読み飛ばしてください)

// nthprime.c
#include "et.h"

bool nthprime2(word stack[], word mem[]) {
word base;

nthprime2 :

{
// (getArrayElement stack 1 *A)
base = stack[1];
// (getArrayElement mem 0 *B) = mem[0]
// (:= *C (+ (INT "mem[0]") 1))
int C = mem[0] + 1;
// (:= *D (+ (INT "mem[0]") 2))
int D = mem[0] + 2;
// (setArrayElement mem 0 (INT "D"))
mem[0] = D;
// (setArrayElement mem (INT "C") PVAR)
mem[C] = PVAR;
// (:= *E (+ 3 base))
int E = 3 + base;
// (setArrayElement stack (INT "E") (INT "C"))
stack[E] = C;
// (updateArrayLength (INT "E") stack)

if(stack[0] < E)
stack[0] = E;

// (nthprime21 stack mem)

goto nthprime21;
}

nthprime2_fail :

nthprime21 :
{

// (getArrayElement stack 1 *F)
base = stack[1];
// (not (== (1 (INT 1) base stack mem)))
if(ideref(1, base, stack, mem) == 1)
goto nthprime211;

// (nthprime22 stack mem)

goto nthprime22;
}

nthprime21_fail :

nthprime211 :
{

// (getArrayElement stack 1 *G)
base = stack[1];
// (:= *H (+ 2 base))
int H = 2 + base;
// (getArrayElement stack (INT "H") *I) = stack[H]
// (setArrayElement mem (INT "stack[H]") INT)
mem[stack[H]] = INT;
// (:= *J (+ (INT "stack[H]") 1))
int J = stack[H] + 1;
// (setArrayElement mem (INT "J") 2)
mem[J] = 2;
// (getArrayElement stack base *K) = stack[base]
// (setArrayElement stack 1 (INT "stack[base]"))
stack[1] = stack[base];
// (:= *L (- base 1))
int L = base - 1;
// (setArrayElement stack 0 (INT "L"))
stack[0] = L;
return (bool)stack[base];
}

nthprime211_fail :

nthprime22 :
{

// (getArrayElement stack 1 *M)
base = stack[1];
// (getArrayElement mem 0 *N) = mem[0]
// (:= *O (+ (INT "mem[0]") 1))
int O = mem[0] + 1;
// (:= *P (+ (INT "mem[0]") 2))
int P = mem[0] + 2;
// (setArrayElement mem 0 (INT "P"))
mem[0] = P;
// (setArrayElement mem (INT "O") PVAR)
mem[O] = PVAR;
// (:= *Q (+ 3 base))
int Q = 3 + base;
// (setArrayElement stack (INT "Q") (INT "O"))
stack[Q] = O;
// (updateArrayLength (INT "Q") stack)

if(stack[0] < Q)
stack[0] = Q;

// (:= *R (+ 1 base))
int R = 1 + base;
// (getArrayElement stack (INT "R") *S) = stack[R]
// (deref (REF (INT "stack[R]")) mem (REF *T))
word T = stack[R];
while(mem[T] == REF)
T = mem[T + 1];

// (:= *U (+ (REF "T") 1))
int U = T + 1;
// (getArrayElement mem (REF "T") INT)
if(mem[T] != INT)
goto nthprime22_fail;

// (getArrayElement mem (INT "U") *V) = mem[U]
// (:= *W (x (INT "mem[U]") 2))
int W = mem[U] * 2;
// (:= *X (+ (INT "W") 2))
int X = W + 2;
// (getArrayElement mem 0 *Y) = mem[0]
// (:= *A1 (+ (INT "mem[0]") 1))
int A1 = mem[0] + 1;
// (:= *B1 (+ (INT "mem[0]") (INT "X")))
int B1 = mem[0] + X;
// (setArrayElement mem 0 (INT "B1"))
mem[0] = B1;
// (setArrayElement mem (INT "A1") ARRAY)
mem[A1] = ARRAY;
// (:= *C1 (+ (INT "A1") 1))
int C1 = A1 + 1;
// (setArrayElement mem (INT "C1") (INT "mem[U]"))
mem[C1] = mem[U];
// (deref (REF (INT "O")) mem (REF *D1))
word D1 = O;
while(mem[D1] == REF)
D1 = mem[D1 + 1];

// (getArrayElement mem (REF "D1") PVAR)
if(mem[D1] != PVAR)
goto nthprime22_fail;

// (:= *E1 (+ (REF "D1") 1))
int E1 = D1 + 1;
// (setArrayElement mem (REF "D1") REF)
mem[D1] = REF;
// (setArrayElement mem (INT "E1") (INT "A1"))
mem[E1] = A1;
// (print stack)
printStack(stack);
// (print mem)
printArray(mem);
// (:= *F1 (+ 3 base))
int F1 = 3 + base;
// (getArrayElement stack (INT "F1") *G1) = stack[F1]
// (deref (REF (INT "stack[F1]")) mem (REF *H1))
word H1 = stack[F1];
while(mem[H1] == REF)
H1 = mem[H1 + 1];

// (:= *I1 (+ (REF "H1") 2))
int I1 = H1 + 2;
// (setArrayElement mem (INT "I1") INT)
mem[I1] = INT;
// (:= *J1 (+ (INT "I1") 1))
int J1 = I1 + 1;
// (setArrayElement mem (INT "J1") 2)
mem[J1] = 2;
// (getArrayElement mem 0 *K1) = mem[0]
// (:= *L1 (+ (INT "mem[0]") 1))
int L1 = mem[0] + 1;
// (:= *M1 (+ (INT "mem[0]") 2))
int M1 = mem[0] + 2;
// (setArrayElement mem 0 (INT "M1"))
mem[0] = M1;
// (setArrayElement mem (INT "L1") INT)
mem[L1] = INT;
// (:= *N1 (+ (INT "L1") 1))
int N1 = L1 + 1;
// (setArrayElement mem (INT "N1") 3)
mem[N1] = 3;
// (getArrayElement stack 0 *O1) = stack[0]
// (:= *P1 (+ (INT "stack[0]") 1))
int P1 = stack[0] + 1;
// (:= *Q1 (+ (INT "P1") 1))
int Q1 = P1 + 1;
// (setArrayElement stack (INT "Q1") (INT "L1"))
stack[Q1] = L1;
// (:= *R1 (+ 3 base))
int R1 = 3 + base;
// (getArrayElement stack (INT "R1") *S1) = stack[R1]
// (getArrayElement stack 0 *T1) = stack[0]
// (:= *U1 (+ (INT "stack[0]") 1))
int U1 = stack[0] + 1;
// (:= *V1 (+ (INT "U1") 2))
int V1 = U1 + 2;
// (setArrayElement stack (INT "V1") (INT "stack[R1]"))
stack[V1] = stack[R1];
// (getArrayElement mem 0 *W1) = mem[0]
// (:= *X1 (+ (INT "mem[0]") 1))
int X1 = mem[0] + 1;
// (:= *Y1 (+ (INT "mem[0]") 2))
int Y1 = mem[0] + 2;
// (setArrayElement mem 0 (INT "Y1"))
mem[0] = Y1;
// (setArrayElement mem (INT "X1") INT)
mem[X1] = INT;
// (:= *A2 (+ (INT "X1") 1))
int A2 = X1 + 1;
// (setArrayElement mem (INT "A2") 0)
mem[A2] = 0;
// (getArrayElement stack 0 *B2) = stack[0]
// (:= *C2 (+ (INT "stack[0]") 1))
int C2 = stack[0] + 1;
// (:= *D2 (+ (INT "C2") 3))
int D2 = C2 + 3;
// (setArrayElement stack (INT "D2") (INT "X1"))
stack[D2] = X1;
// (getArrayElement mem 0 *E2) = mem[0]
// (:= *F2 (+ (INT "mem[0]") 1))
int F2 = mem[0] + 1;
// (:= *G2 (+ (INT "mem[0]") 2))
int G2 = mem[0] + 2;
// (setArrayElement mem 0 (INT "G2"))
mem[0] = G2;
// (setArrayElement mem (INT "F2") INT)
mem[F2] = INT;
// (:= *H2 (+ (INT "F2") 1))
int H2 = F2 + 1;
// (setArrayElement mem (INT "H2") 1)
mem[H2] = 1;
// (getArrayElement stack 0 *I2) = stack[0]
// (:= *J2 (+ (INT "stack[0]") 1))
int J2 = stack[0] + 1;
// (:= *K2 (+ (INT "J2") 4))
int K2 = J2 + 4;
// (setArrayElement stack (INT "K2") (INT "F2"))
stack[K2] = F2;
// (:= *L2 (+ 1 base))
int L2 = 1 + base;
// (getArrayElement stack (INT "L2") *M2) = stack[L2]
// (getArrayElement stack 0 *N2) = stack[0]
// (:= *O2 (+ (INT "stack[0]") 1))
int O2 = stack[0] + 1;
// (:= *P2 (+ (INT "O2") 5))
int P2 = O2 + 5;
// (setArrayElement stack (INT "P2") (INT "stack[L2]"))
stack[P2] = stack[L2];
// (getArrayElement stack 0 *Q2) = stack[0]
// (getArrayElement stack 1 *R2)
base = stack[1];
// (:= *S2 (+ (INT "stack[0]") 1))
int S2 = stack[0] + 1;
// (setArrayElement stack (INT "S2") base)
stack[S2] = base;
// (:= *T2 (+ (INT "S2") 5))
int T2 = S2 + 5;
// (setArrayElement stack 0 (INT "T2"))
stack[0] = T2;
// (setArrayElement stack 1 (INT "S2"))
stack[1] = S2;
// (call (primeArray5 stack mem))
primeArray5(stack, mem);
// (:= *V2 (+ 1 base))
int V2 = 1 + base;
// (getArrayElement stack (INT "V2") *W2) = stack[V2]
// (deref (REF (INT "stack[V2]")) mem (REF *X2))
word X2 = stack[V2];
while(mem[X2] == REF)
X2 = mem[X2 + 1];

// (:= *Y2 (+ (REF "X2") 1))
int Y2 = X2 + 1;
// (getArrayElement mem (REF "X2") INT)
if(mem[X2] != INT)
goto nthprime22_fail;

// (getArrayElement mem (INT "Y2") *A3) = mem[Y2]
// (:= *B3 (- (INT "mem[Y2]") 1))
int B3 = mem[Y2] - 1;
// (:= *C3 (+ 3 base))
int C3 = 3 + base;
// (getArrayElement stack (INT "C3") *D3) = stack[C3]
// (deref (REF (INT "stack[C3]")) mem (REF *E3))
word E3 = stack[C3];
while(mem[E3] == REF)
E3 = mem[E3 + 1];

// (getArrayElement mem (REF "E3") ARRAY)
if(mem[E3] != ARRAY)
goto nthprime22_fail;

// (:= *F3 (x (INT "B3") 2))
int F3 = B3 * 2;
// (:= *G3 (+ (INT "F3") 2))
int G3 = F3 + 2;
// (:= *H3 (+ (REF "E3") (INT "G3")))
int H3 = E3 + G3;
// (getArrayElement mem (INT "H3") *I3) = mem[H3]
// (:= *J3 (+ (INT "H3") 1))
int J3 = H3 + 1;
// (getArrayElement mem (INT "J3") *K3) = mem[J3]
// (:= *L3 (+ 2 base))
int L3 = 2 + base;
// (getArrayElement stack (INT "L3") *M3) = stack[L3]
// (deref (REF (INT "stack[L3]")) mem (REF *N3))
word N3 = stack[L3];
while(mem[N3] == REF)
N3 = mem[N3 + 1];

// (getArrayElement mem (REF "N3") PVAR)
if(mem[N3] != PVAR)
goto nthprime22_fail;

// (:= *O3 (+ (REF "N3") 1))
int O3 = N3 + 1;
// (setArrayElement mem (REF "N3") (INT "mem[H3]"))
mem[N3] = mem[H3];
// (setArrayElement mem (INT "O3") (INT "mem[J3]"))
mem[O3] = mem[J3];
// (getArrayElement stack base *P3) = stack[base]
// (setArrayElement stack 1 (INT "stack[base]"))
stack[1] = stack[base];
// (:= *Q3 (- base 1))
int Q3 = base - 1;
// (setArrayElement stack 0 (INT "Q3"))
stack[0] = Q3;
return (bool)stack[base];
}

nthprime22_fail :

return false;

}


// primeArray.c

#include "et.h"

bool primeArray5(word stack[], word mem[]) {
word base;

primeArray5 :

{
// (getArrayElement stack 1 *A)
base = stack[1];
// (getArrayElement mem 0 *B) = mem[0]
// (:= *C (+ (INT "mem[0]") 1))
int C = mem[0] + 1;
// (:= *D (+ (INT "mem[0]") 2))
int D = mem[0] + 2;
// (setArrayElement mem 0 (INT "D"))
mem[0] = D;
// (setArrayElement mem (INT "C") PVAR)
mem[C] = PVAR;
// (:= *E (+ 6 base))
int E = 6 + base;
// (setArrayElement stack (INT "E") (INT "C"))
stack[E] = C;
// (updateArrayLength (INT "E") stack)

if(stack[0] < E)
stack[0] = E;

// (primeArray51 stack mem)

goto primeArray51;
}

primeArray5_fail :

primeArray51 :
{

// (getArrayElement stack 1 *F)
base = stack[1];
// (not (== 4 5 base stack mem))
if(ideref(4, base, stack, mem) == ideref(5, base, stack, mem))
goto primeArray511;

// (primeArray52 stack mem)

goto primeArray52;
}

primeArray51_fail :

primeArray511 :
{

// (getArrayElement stack 1 *G)
base = stack[1];
// (getArrayElement stack base *H) = stack[base]
// (setArrayElement stack 1 (INT "stack[base]"))
stack[1] = stack[base];
// (:= *I (- base 1))
int I = base - 1;
// (setArrayElement stack 0 (INT "I"))
stack[0] = I;
return (bool)stack[base];
}

primeArray511_fail :

primeArray52 :
{

// (getArrayElement stack 1 *J)
base = stack[1];
// (getArrayElement mem 0 *K) = mem[0]
// (:= *L (+ (INT "mem[0]") 1))
int L = mem[0] + 1;
// (:= *M (+ (INT "mem[0]") 2))
int M = mem[0] + 2;
// (setArrayElement mem 0 (INT "M"))
mem[0] = M;
// (setArrayElement mem (INT "L") PVAR)
mem[L] = PVAR;
// (:= *N (+ 6 base))
int N = 6 + base;
// (setArrayElement stack (INT "N") (INT "L"))
stack[N] = L;
// (updateArrayLength (INT "N") stack)

if(stack[0] < N)
stack[0] = N;

// (:= *O (+ 2 base))
int O = 2 + base;
// (getArrayElement stack (INT "O") *P) = stack[O]
// (deref (REF (INT "stack[O]")) mem (REF *Q))
word Q = stack[O];
while(mem[Q] == REF)
Q = mem[Q + 1];

// (getArrayElement mem (REF "Q") ARRAY)
if(mem[Q] != ARRAY)
goto primeArray52_fail;

// (:= *R (+ 3 base))
int R = 3 + base;
// (getArrayElement stack (INT "R") *S) = stack[R]
// (deref (REF (INT "stack[R]")) mem (REF *T))
word T = stack[R];
while(mem[T] == REF)
T = mem[T + 1];

// (:= *U (+ (REF "T") 1))
int U = T + 1;
// (getArrayElement mem (REF "T") INT)
if(mem[T] != INT)
goto primeArray52_fail;

// (getArrayElement mem (INT "U") *V) = mem[U]
// (:= *W (x (INT "mem[U]") 2))
int W = mem[U] * 2;
// (:= *X (+ (INT "W") 2))
int X = W + 2;
// (:= *Y (+ (REF "Q") (INT "X")))
int Y = Q + X;
// (getArrayElement mem (INT "Y") *A1) = mem[Y]
// (:= *B1 (+ (INT "Y") 1))
int B1 = Y + 1;
// (getArrayElement mem (INT "B1") *C1) = mem[B1]
// (deref (REF (INT "L")) mem (REF *D1))
word D1 = L;
while(mem[D1] == REF)
D1 = mem[D1 + 1];

// (getArrayElement mem (REF "D1") PVAR)
if(mem[D1] != PVAR)
goto primeArray52_fail;

// (:= *E1 (+ (REF "D1") 1))
int E1 = D1 + 1;
// (setArrayElement mem (REF "D1") (INT "mem[Y]"))
mem[D1] = mem[Y];
// (setArrayElement mem (INT "E1") (INT "mem[B1]"))
mem[E1] = mem[B1];
// (:= *F1 (+ 6 base))
int F1 = 6 + base;
// (getArrayElement stack (INT "F1") *G1) = stack[F1]
// (deref (REF (INT "stack[F1]")) mem (REF *H1))
word H1 = stack[F1];
while(mem[H1] == REF)
H1 = mem[H1 + 1];

// (:= *I1 (+ (REF "H1") 1))
int I1 = H1 + 1;
// (getArrayElement mem (REF "H1") INT)
if(mem[H1] != INT)
goto primeArray52_fail;

// (getArrayElement mem (INT "I1") *J1) = mem[I1]
// (:= *K1 (+ 6 base))
int K1 = 6 + base;
// (getArrayElement stack (INT "K1") *L1) = stack[K1]
// (deref (REF (INT "stack[K1]")) mem (REF *M1))
word M1 = stack[K1];
while(mem[M1] == REF)
M1 = mem[M1 + 1];

// (:= *N1 (+ (REF "M1") 1))
int N1 = M1 + 1;
// (getArrayElement mem (REF "M1") INT)
if(mem[M1] != INT)
goto primeArray52_fail;

// (getArrayElement mem (INT "N1") *O1) = mem[N1]
// (:= *P1 (x (INT "mem[I1]") (INT "mem[N1]")))
int P1 = mem[I1] * mem[N1];
// (not (< (1 (INT (INT "P1")) base stack mem)))
if(ideref(1, base, stack, mem) < P1)
goto primeArray521;

// (primeArray53 stack mem)

goto primeArray53;
}

primeArray52_fail :

primeArray521 :
{

// (getArrayElement stack 1 *Q1)
base = stack[1];
// (:= *R1 (+ 2 base))
int R1 = 2 + base;
// (getArrayElement stack (INT "R1") *S1) = stack[R1]
// (deref (REF (INT "stack[R1]")) mem (REF *T1))
word T1 = stack[R1];
while(mem[T1] == REF)
T1 = mem[T1 + 1];

// (:= *U1 (+ 4 base))
int U1 = 4 + base;
// (getArrayElement stack (INT "U1") *V1) = stack[U1]
// (deref (REF (INT "stack[U1]")) mem (REF *W1))
word W1 = stack[U1];
while(mem[W1] == REF)
W1 = mem[W1 + 1];

// (:= *X1 (+ (REF "W1") 1))
int X1 = W1 + 1;
// (getArrayElement mem (REF "W1") INT)
if(mem[W1] != INT)
goto primeArray521_fail;

// (getArrayElement mem (INT "X1") *Y1) = mem[X1]
// (:= *A2 (+ 1 base))
int A2 = 1 + base;
// (getArrayElement stack (INT "A2") *B2) = stack[A2]
// (deref (REF (INT "stack[A2]")) mem (REF *C2))
word C2 = stack[A2];
while(mem[C2] == REF)
C2 = mem[C2 + 1];

// (:= *D2 (+ (REF "C2") 1))
int D2 = C2 + 1;
// (getArrayElement mem (REF "C2") *E2) = mem[C2]
// (getArrayElement mem (INT "D2") *F2) = mem[D2]
// (:= *G2 (x (INT "mem[X1]") 2))
int G2 = mem[X1] * 2;
// (:= *H2 (+ (INT "G2") 2))
int H2 = G2 + 2;
// (:= *I2 (+ (REF "T1") (INT "H2")))
int I2 = T1 + H2;
// (setArrayElement mem (INT "I2") (INT "mem[C2]"))
mem[I2] = mem[C2];
// (:= *J2 (+ (INT "I2") 1))
int J2 = I2 + 1;
// (setArrayElement mem (INT "J2") (INT "mem[D2]"))
mem[J2] = mem[D2];
// (:= *K2 (+ 4 base))
int K2 = 4 + base;
// (getArrayElement stack (INT "K2") *L2) = stack[K2]
// (deref (REF (INT "stack[K2]")) mem (REF *M2))
word M2 = stack[K2];
while(mem[M2] == REF)
M2 = mem[M2 + 1];

// (:= *N2 (+ (REF "M2") 1))
int N2 = M2 + 1;
// (getArrayElement mem (REF "M2") INT)
if(mem[M2] != INT)
goto primeArray521_fail;

// (getArrayElement mem (INT "N2") *O2) = mem[N2]
// (:= *P2 (+ (INT "mem[N2]") 1))
int P2 = mem[N2] + 1;
// (:= *Q2 (+ 4 base))
int Q2 = 4 + base;
// (getArrayElement stack (INT "Q2") *R2) = stack[Q2]
// (:= *S2 (+ (INT "stack[Q2]") 1))
int S2 = stack[Q2] + 1;
// (setArrayElement mem (INT "stack[Q2]") INT)
mem[stack[Q2]] = INT;
// (setArrayElement mem (INT "S2") (INT "P2"))
mem[S2] = P2;
// (:= *T2 (+ 3 base))
int T2 = 3 + base;
// (getArrayElement stack (INT "T2") *U2) = stack[T2]
// (:= *V2 (+ (INT "stack[T2]") 1))
int V2 = stack[T2] + 1;
// (setArrayElement mem (INT "stack[T2]") INT)
mem[stack[T2]] = INT;
// (setArrayElement mem (INT "V2") 1)
mem[V2] = 1;
// (:= *W2 (+ 1 base))
int W2 = 1 + base;
// (getArrayElement stack (INT "W2") *X2) = stack[W2]
// (deref (REF (INT "stack[W2]")) mem (REF *Y2))
word Y2 = stack[W2];
while(mem[Y2] == REF)
Y2 = mem[Y2 + 1];

// (:= *A3 (+ (REF "Y2") 1))
int A3 = Y2 + 1;
// (getArrayElement mem (REF "Y2") INT)
if(mem[Y2] != INT)
goto primeArray521_fail;

// (getArrayElement mem (INT "A3") *B3) = mem[A3]
// (:= *C3 (+ (INT "mem[A3]") 2))
int C3 = mem[A3] + 2;
// (:= *D3 (+ 1 base))
int D3 = 1 + base;
// (getArrayElement stack (INT "D3") *E3) = stack[D3]
// (:= *F3 (+ (INT "stack[D3]") 1))
int F3 = stack[D3] + 1;
// (setArrayElement mem (INT "stack[D3]") INT)
mem[stack[D3]] = INT;
// (setArrayElement mem (INT "F3") (INT "C3"))
mem[F3] = C3;
// (primeArray51 stack mem)

goto primeArray51;
}

primeArray521_fail :

primeArray53 :
{

// (getArrayElement stack 1 *G3)
base = stack[1];
// (getArrayElement mem 0 *H3) = mem[0]
// (:= *I3 (+ (INT "mem[0]") 1))
int I3 = mem[0] + 1;
// (:= *J3 (+ (INT "mem[0]") 2))
int J3 = mem[0] + 2;
// (setArrayElement mem 0 (INT "J3"))
mem[0] = J3;
// (setArrayElement mem (INT "I3") PVAR)
mem[I3] = PVAR;
// (:= *K3 (+ 6 base))
int K3 = 6 + base;
// (setArrayElement stack (INT "K3") (INT "I3"))
stack[K3] = I3;
// (updateArrayLength (INT "K3") stack)

if(stack[0] < K3)
stack[0] = K3;

// (:= *L3 (+ 2 base))
int L3 = 2 + base;
// (getArrayElement stack (INT "L3") *M3) = stack[L3]
// (deref (REF (INT "stack[L3]")) mem (REF *N3))
word N3 = stack[L3];
while(mem[N3] == REF)
N3 = mem[N3 + 1];

// (getArrayElement mem (REF "N3") ARRAY)
if(mem[N3] != ARRAY)
goto primeArray53_fail;

// (:= *O3 (+ 3 base))
int O3 = 3 + base;
// (getArrayElement stack (INT "O3") *P3) = stack[O3]
// (deref (REF (INT "stack[O3]")) mem (REF *Q3))
word Q3 = stack[O3];
while(mem[Q3] == REF)
Q3 = mem[Q3 + 1];

// (:= *R3 (+ (REF "Q3") 1))
int R3 = Q3 + 1;
// (getArrayElement mem (REF "Q3") INT)
if(mem[Q3] != INT)
goto primeArray53_fail;

// (getArrayElement mem (INT "R3") *S3) = mem[R3]
// (:= *T3 (x (INT "mem[R3]") 2))
int T3 = mem[R3] * 2;
// (:= *U3 (+ (INT "T3") 2))
int U3 = T3 + 2;
// (:= *V3 (+ (REF "N3") (INT "U3")))
int V3 = N3 + U3;
// (getArrayElement mem (INT "V3") *W3) = mem[V3]
// (:= *X3 (+ (INT "V3") 1))
int X3 = V3 + 1;
// (getArrayElement mem (INT "X3") *Y3) = mem[X3]
// (deref (REF (INT "I3")) mem (REF *A4))
word A4 = I3;
while(mem[A4] == REF)
A4 = mem[A4 + 1];

// (getArrayElement mem (REF "A4") PVAR)
if(mem[A4] != PVAR)
goto primeArray53_fail;

// (:= *B4 (+ (REF "A4") 1))
int B4 = A4 + 1;
// (setArrayElement mem (REF "A4") (INT "mem[V3]"))
mem[A4] = mem[V3];
// (setArrayElement mem (INT "B4") (INT "mem[X3]"))
mem[B4] = mem[X3];
// (:= *C4 (+ 1 base))
int C4 = 1 + base;
// (getArrayElement stack (INT "C4") *D4) = stack[C4]
// (deref (REF (INT "stack[C4]")) mem (REF *E4))
word E4 = stack[C4];
while(mem[E4] == REF)
E4 = mem[E4 + 1];

// (:= *F4 (+ (REF "E4") 1))
int F4 = E4 + 1;
// (getArrayElement mem (REF "E4") INT)
if(mem[E4] != INT)
goto primeArray53_fail;

// (getArrayElement mem (INT "F4") *G4) = mem[F4]
// (:= *H4 (+ 6 base))
int H4 = 6 + base;
// (getArrayElement stack (INT "H4") *I4) = stack[H4]
// (deref (REF (INT "stack[H4]")) mem (REF *J4))
word J4 = stack[H4];
while(mem[J4] == REF)
J4 = mem[J4 + 1];

// (:= *K4 (+ (REF "J4") 1))
int K4 = J4 + 1;
// (getArrayElement mem (REF "J4") INT)
if(mem[J4] != INT)
goto primeArray53_fail;

// (getArrayElement mem (INT "K4") *L4) = mem[K4]
// (:= *M4 (mod (INT "mem[F4]") (INT "mem[K4]")))
int M4 = mem[F4] % mem[K4];
// (not (== (INT 0) (INT (INT "M4")) base stack mem))
if(0 == M4)
goto primeArray531;

// (primeArray54 stack mem)

goto primeArray54;
}

primeArray53_fail :

primeArray531 :
{

// (getArrayElement stack 1 *N4)
base = stack[1];
// (:= *O4 (+ 3 base))
int O4 = 3 + base;
// (getArrayElement stack (INT "O4") *P4) = stack[O4]
// (:= *Q4 (+ (INT "stack[O4]") 1))
int Q4 = stack[O4] + 1;
// (setArrayElement mem (INT "stack[O4]") INT)
mem[stack[O4]] = INT;
// (setArrayElement mem (INT "Q4") 1)
mem[Q4] = 1;
// (:= *R4 (+ 1 base))
int R4 = 1 + base;
// (getArrayElement stack (INT "R4") *S4) = stack[R4]
// (deref (REF (INT "stack[R4]")) mem (REF *T4))
word T4 = stack[R4];
while(mem[T4] == REF)
T4 = mem[T4 + 1];

// (:= *U4 (+ (REF "T4") 1))
int U4 = T4 + 1;
// (getArrayElement mem (REF "T4") INT)
if(mem[T4] != INT)
goto primeArray531_fail;

// (getArrayElement mem (INT "U4") *V4) = mem[U4]
// (:= *W4 (+ (INT "mem[U4]") 2))
int W4 = mem[U4] + 2;
// (:= *X4 (+ 1 base))
int X4 = 1 + base;
// (getArrayElement stack (INT "X4") *Y4) = stack[X4]
// (:= *A5 (+ (INT "stack[X4]") 1))
int A5 = stack[X4] + 1;
// (setArrayElement mem (INT "stack[X4]") INT)
mem[stack[X4]] = INT;
// (setArrayElement mem (INT "A5") (INT "W4"))
mem[A5] = W4;
// (primeArray51 stack mem)

goto primeArray51;
}

primeArray531_fail :

primeArray54 :
{

// (getArrayElement stack 1 *B5)
base = stack[1];
// (:= *C5 (+ 3 base))
int C5 = 3 + base;
// (getArrayElement stack (INT "C5") *D5) = stack[C5]
// (deref (REF (INT "stack[C5]")) mem (REF *E5))
word E5 = stack[C5];
while(mem[E5] == REF)
E5 = mem[E5 + 1];

// (:= *F5 (+ (REF "E5") 1))
int F5 = E5 + 1;
// (getArrayElement mem (REF "E5") INT)
if(mem[E5] != INT)
goto primeArray54_fail;

// (getArrayElement mem (INT "F5") *G5) = mem[F5]
// (:= *H5 (+ (INT "mem[F5]") 1))
int H5 = mem[F5] + 1;
// (:= *I5 (+ 3 base))
int I5 = 3 + base;
// (getArrayElement stack (INT "I5") *J5) = stack[I5]
// (:= *K5 (+ (INT "stack[I5]") 1))
int K5 = stack[I5] + 1;
// (setArrayElement mem (INT "stack[I5]") INT)
mem[stack[I5]] = INT;
// (setArrayElement mem (INT "K5") (INT "H5"))
mem[K5] = H5;
// (primeArray51 stack mem)

goto primeArray51;
}

primeArray54_fail :

return false;

}


こういう風に,一つのルールのまとまり (部分評価の際,同じ名前で同じアリティのルールは自動的にまとめらる) を一個の C 関数に落としていくっていうやり方は,まぁわかりやすいし直感的なんだけど,あまり可能性が広がらない,つまらないアプローチ.

これでは,C 言語のライブラリを使ってプログラミングをしていくのと,あまり変わらない.いや,それでも良いんだけど.

それだと,せっかく等価変換ルールという,理論的に扱いやすい形式で書かれていることのメリットを十分に活かせない.従来の,古いスタイルの,ライブラリを糊付けしていくプログラミングと何も変わらない.

全部が ET ルールという柔軟な形で書かれていれば,もっともっと大きな可能性が開けるのである.

例えば,巨大な ET ルールのライブラリというか,データベースを想像してみよう.そして,そこから必要なルールを取ってきて (この取ってくる方法もいろいろ考えられている.従来のような,文字列で検索したり,名前で機能を想像したり,機能ごとにまとめたり (ポケット一つの原則に反する) というアプローチは,どうしようもなく原始的で古い) ,それを組み合わせることによって,目的の機能が実現できたとする.

# ほんとに将来的には,仕様から,それの制約を充足するプログラムが自動的に組み立てられる (プログラム合成) のが理想的.今のところ,これは計算機科学の聖杯伝説ですが.

従来のライブラリなどは,汎用性を重視するため,どうしてもさまざまなオーバーヘッドが付きまとう.そのため,何度も何度も,プログラムの問題領域にあわせて,細かくチューニングしたハッシュだのなんだのが再発明されることとなった.

特に,オブジェクト指向のライブラリなんかは,モジュール化が進んでいて使いやすい反面,どうしてもオーバヘッドが大きくなる.汎用性やモジュール性と,最適化や特化はトレードオフの関係になる.たとえば,GNU の,特に GCC なんかは,関数呼び出しのオーバヘッドの削減など,効率を重視するあまり,数千行クラスの関数があったり,専用の抽象データ型が何個も何個も車輪していたり.

全部が ET ルールで書かれていれば,モジュールを部分評価して,無駄な部分を全て取り除いて,余計な中間部分を融合して,全ての末尾関数呼び出しや相互再帰を goto に,再帰呼び出しを,パターンに応じて最適化したり,といった,モジュール性や再利用と処理効率を両立できる可能性が生まれる.

極端な話,一個一個 C の関数に落としていくってのは,

(lenght () *N) --> (= *N 0).
(length (? | *Xs) *N) --> (length *Xs *N1), (:= *N (+ *N1 1)).

みたいな D ルールを,
bool
lenght(List* X) {

if(nil(X))
return 0;

return 1 + length(cdr(X));
}
みたいにしちゃうのと同じってことで.
D ルールを,こうやって,一個一個,B ルールの関数に落としていって,それをまた B ルールとして組み合わせていき,ってのは,従来的で馴染み深いけど,柔軟性が決定的に失われてしまう.

たとえば,C では,関数をまたぐ大域的な最適化は,とても難しい.

これが,必要な関数を,必要なだけライブラリからもってきて,全て融合して一つの巨大な関数に自動的に変換することができたら,そこからさらにいろいろな最適化が容易になるかもしれない.

C が速い速いとよく言われるけど,それは全然甘い,と個人的には思っている.確かにむき出しの C は速いかもしれないけど,現実的には,何らかのライブラリなりフレームワークを使わない C 言語は,使い物にならない.そして,そういうものを使うと,柔軟性や汎用性と引き換えに,オーバーヘッドが何十にも重なって遅くなる.

よく,ML や Common Lisp の方が,同じ大きな規模ならば,C よりも速い,というのは,こういうカラクリだ.グリーンスパンのナントカ法則.素人が組んだゴテゴテした C プログラムよりも,確立された ML なり Commn Lisp という枠組みの中で最適化された処理系なりフレームワークを使って組まれたプログラムの方が,無駄が無く,その分柔軟だし速い.

というか,「速い」ってのは,開発速度の方が重要です.どんなプログラムでも,最初は手抜きで,とりあえず動けば良い的な部分をいっぱい含んでいるはず.一般的に,コンパイルってのはオーダが変わらない最適化なので,アルゴリズムの方が爆発的な速度差につながります.そこのボトルネックがでかすぎると,言語間の速度差など微差になってしまう.アセンブリでゴリゴリ書けば速くなる,なんてのは,都市伝説です.一般的には,「開発が進む」速度が速いプログラムほど,言語に関係なく実行速度も速くなる (十分に複雑なプログラムならば).

# C は「実行」速度以外何もかも捨てた言語,Scheme は柔軟性以外何もかも捨てた言語というイメージが.ひげぽんさんが,Scheme で OS を書いたらどうだろうみたいな話をしていて,実は密かに期待しているのですが,OS みたいなシステムズプログラミングには,Lisp の皮を被った C 言語である,Common Lisp の方が良いのかも,という気が.まぁ,俺様 OS を作るぐらいなんだから,移植性なども一切無視した,独自仕様の俺様言語処理系もついでに作って,そこでは C スタックなどを一切放棄して,Scheme の継続がネイティブに使える (本質的に計算機と相性が悪い,特にレジスタとかコンテキストがいっぱいある RISC だと… というイメージもありますが,工夫次第でなんとかなるのかもしれない.ていうか,いまどきの計算機は速いし) とかだったら話は別ですし,やたら面白いのですが.

うーん,無駄に長くなった.

まぁ,要するに,古いアプローチには限界があるよ,ソフトウェアが巨大化するにしたがって,開発速度も実行速度も遅くなっていくよ,このままだとソフトウェア産業に未来無いよ,ということが言いたかったわけで.

ちょっと嬉しさで饒舌になりすぎた.聞き流してください.

さーてと,もっといろいろな例題を試しつつ,コンパイルのインフラをちゃんとしていかないとなぁ.いままでちょっと,やっつけでテキトーに書きすぎた.書いては捨て,書いては捨てではなく,ちゃんと形にしないと… ていうか,そろそろ一区切り付いてきたので,レポートを書き始めないと.

いろいろヤバイ.

今日の朝,手話の方から誘いがあって,昼まっからビアガーデンに行ってきた (さすがに途中で帰ってきた) ので,頭がちょっといたい.1 杯ぐらいしか飲んでないのに… 日に当てられたのかなぁ… 天気が良すぎでした.

いやぁ,それにしても,動いて良かったよ.

コメント

Secret

プロフィール
  • Author:あろは (alohakun)
  • 京都のデバッガベンダーに勤めるアラサー会社員。

    本ブログの内容は,あくまでも個人的な感想や意見であり,会社の意見を代表するものでは一切ありません.

    連絡先 : alohakun ___at___ gmail.com
    mixi : http://mixi.jp/show_friend.pl?id=182927
    twitter : http://twitter.com/alohakun













    あわせて読みたい


    この日記のはてなブックマーク数


    スカウター : ホワット・ア・ワンダフル・ワールド


    Map
FC2カウンター
ブロとも申請フォーム

この人とブロともになる

最近のコメント
リンク
最近のトラックバック
人生の残り日数
日本人男性の平均寿命は 28700日.
RSSフィード
カテゴリー
  1. RSSリーダー