Langphilia! /
KL1 /
KLIC-3.003 /
Patch / パッチとTARボールはこちら →
2002-03/,
2002-02/,
2002-01/,
2001/
KLIC-3.003 以降のパッチ。導入は自己責任で。不具合がありましたら、
上田研言語班 lang@ueda.info.waseda.ac.jp にご連絡下さい。また、(ライセンスに
制限を加えない)修正をお送り下されば、マージして公開致します。
- 2002-03-29
- 2002-03-26, いろいろゴミ捨て
- 2002-03-23
- 2002-03-21, ジェネリックオブジェクト関連のマクロを整理
- 2002-03-20
- random_numbers をコンシューマオブジェクトに変えました。
[R|Rs] を渡すと R に乱数を入れてくれます。[] を渡すと終了。
→ 使用例
- ジェネリックオブジェクトメソッド表の命名規約を変更
- 2002-03-19a : method_result, GD_RETURN 削除
- 2002-03-19, SHM 版を完全に削除
- 2002-03-16, compiler/ generate.kl1, normalize.kl1 :
gen_code/14 → gen_code/6, move_one_1 で P=arg(X0,J) の時
AssocList への追加が間違っているらしいものを修正
- 2002-03-15, {compiler, runtime}/*.kl1 : コメントなど
- 2002-03-12a
- signal_handlers - allocp
- compiler/obj.kl1, include/klic/ g_vector.h, generic.h
: new_generic, call_generic - offset
- 2002-03-12 : create_vector, step_after, trace_after - allocp
- 2002-03-11c : g_allocp をほとんど追放した
- 2002-03-11b
- 2002-03-11a : G_MAKE_THE_NEW_GOAL, GD_MAKE_GENERIC_GOAL - g_allocp
- 2002-03-11 : generator.unify の結果として成功・失敗を返すようにした
- 2002-03-09b :
gd_new, gd_generic, convert_c_string_to_klic_string - g_allocp
- 2002-03-09a : body_generic, generate - g_allocp
- 2002-03-09 : active_unify, generic_generate - g_allocp
- 2002-03-08b : do_unify*, makenewsusp, addhook - allocp
- 2002-03-08a, runtime/faisus.c, generic.c
: suspend_goal, record_susp - allocp
- 2002-03-08, Configure, MANIFEST,
runtime/ Makefile.head, Makefile.tail, config/???/*.mk.sh : 整理
- 2002-03-05g :
G_COPY_KL1_TERM_TO_NEWGEN, G?SET_NEWOBJ_IN_NEWGEN - g_allocp
- 2002-03-05f : generic_gc, G?_RETURN_FROM_GC - g_allocp
- 2002-03-05e, runtime/gc.c : generic_gc - g_allocp
- 2002-03-05d, include/klic/g_basic.h, runtime/ gc.c, gmvv.c
: make_larger_stack → push_gc_stack
- 2002-03-05c, include/klic/g_basic.h, runtime/ gc.c, gmv.c :
make_larger_stack, copy_one_goal, push_gc_stack, reserve_copy - sp
- 2002-03-05b, include/klic/ g_basic.h, g_methtab.h, gc_macro.h, gd_macro.h,
gg_macro.h, runtime/ gc.c, generic.c, gmvv.c, random.c (g_sp) : 削除
- 2002-03-05a, runtime/gc.c :
copy_one_goal, push_gc_stack, reserve_copy - max
- 2002-03-05, include/klic/g_extern.h, runtime/ export_table.c,
gc.c, sendrecv.c : general_gc, copy_terms, push_shm_stack - sp
- 2002-03-04a
- include/klic/alloc.h, runtime/ alloc.c, export_table.c, faisus.c
(klic_alloc)
- Configure, runtime/Makefile.tail, config/???/runtime.mk.sh
: DEBUGLIB を削除
- 2002-03-04, runtime/ cntlmsg.c, datamsg.c, debug.c, faisus.c,
gc.c, intrpt.c, kmain.c, print.c, sched.c, shm_throw.c, unify.c
[DEBUGLIB] : 削除
- 2002-03-02, runtime/config/*/* : 整理
- 2002-02-26d, runtime/config/pvm/ distio.c, distio.h, distpkt.c
: has_attached → static
- 2002-02-26c, compiler/klic.c, config.h.sh,
runtime/config/pvm/ distproc.c, distrmon.c, rmon_server.c,
: DIST_COMPILER_FLAG, DIST_LINKAGE_FLAG
- 2002-02-26b
- runtime/ bb.c, cmphsh.c
- runtime/ config/pvm/distproc.h, config/pvm-tcp/distpkt.c,
config/shm/distproc.h, debug.c, kmain.c : Close_net 削除
- runtime/ cntlmsg.c, ge_exref.c, ge_exref.h : get_exref_methtab
- 2002-02-26a, include/klic/struct.h, runtime/ bb.c,
faisus.c, intrpt.c, kmain.c, sched.c, unify.c : resumed_goals → static
- 2002-02-26, runtime/ asyncio.c, config/pvm-tcp/distpkt.c
: debugger_flag → static
- 2002-02-25c : global - *
- 2002-02-25b : global - *
- 2002-02-25a, runtime/ asyncio.c, asyncio.h, config/pvm-tcp/distpkt.c
: sigio_handlers, send_ready_message, dist_sigio_stream_handler - allocp
- 2002-02-25, include/klic/gg_macro.h, runtime/
cntlmsg.c, datamsg.c, ge_exref.c, random.c (GG_*, new_generic) : assert
- 2002-02-24c, include/klic/gd_macro.h, runtime/ gcode.c, gfloat.c, ggoal.c,
gmodule.c, gmvv.c, gpointer.c, gstring.c, gtermarray.c (GD_*) : assert
- 2002-02-24b, include/klic/ g_methtab.h, gc_methtab.h, gd_methtab.h,
gg_methtab.h, runtime/generic.c (regist, close) : 削除
- 2002-02-24a
- runtime/shm_obj.c (resume_same_prio) : 削除
- include/klic/gc_macro.h, runtime/
ge_readhook.c, ge_reply_hook, gio.c, gmerge.c, wakeup.c (GC_*) : assert
- 2002-02-24,
(enqueue_at_priority, G_MAKE_VAR, G_COPY_KL1_TERM_TO_NEWGEN) : assert
- 2002-02-22e, runtime/*.kl1 : public 宣言とレイアウト
- 2002-02-22d, runtime/asyncio.c (Call_sigio_handler) : 削除
- 2002-02-22c, include/klic/ g_basic.h, gc_macro.h, gd_macro.h, gg_macro.h,
runtime/ gmvv.c, gstring.c (G_HEAPALLOC_WITH_CHECK) : assert
- 2002-02-22b, (G_HEAPALLOC) : assert
- 2002-02-22a, include/klic/g_basic.h (G_HEAPALLOC) : assert
- 2002-02-22, include/klic/ bb.h, unify.h [COMPACTCODE] : 削除
- 2002-02-20g, include/klic/sighndl.h, runtime/ gunix.kl1, intrpt.c, signal.c
: klic_signal_handler, register_streamed_signal - allocp
- 2002-02-20f, include/klic/ g_basic.h, struct.h,
runtime/ gc.c, kmain.c : ごみを削除
- 2002-02-20e, include/klic/index.h (deref_and_test, not_*) : 削除
- 2002-02-20d, include/klic/gg_macro.h : ごみを削除
- 2002-02-20c, include/klic/gd_macro.h : ごみを削除
- 2002-02-20b, include/klic/ gc_macro.h, struct.h,
runtime/ generic.c, gobj.h, unify.c : ごみを削除
- 2002-02-20a, include/klic/gc_macro.h : ごみを削除
- 2002-02-20, compiler/obj.kl1, runtime/gc.c
- 2002-02-19e, include/klic/ alloc.h, struct.h, runtime/ alloc.c, gc.c :
gc_hook_table, num_gc_hooks, gc_hooktab_size → static
- 2002-02-19d : register_gc_hook, gc_asyncio_streams, gc_exp_table,
gc_timer_data, gc_decode_stack, gc_signal_streams, gc_postmortem_args
- allocp, ntop, otop, nsize, osize
- 2002-02-19c, runtime/ asyncio.c, gc.c, ktimer.c, signal.c, sysc.kl1 :
copy_one_term - allocp, ntop, otop, nsize, osize
- 2002-02-19b, runtime/gc.c :
copy_terms, copy_one_queue - ntop, otop, nsize, osize
- 2002-02-19a :
new_space_top, new_space_size, old_space_top, old_space_size → static
- 2002-02-19, runtime/gc.c : copy_terms, copy_one_queue - hp
- 2002-02-18e :
register_after_gc_hook, scan_imp_table, deallocate_garbage - allocp
- 2002-02-18d, runtime/ config/*/distpkt.c, ktimer.c :
set_simple_interval_timer_handler - allocp
- 2002-02-18c
- deallocate - allocp
- runtime/print.c : general_print の型を修正
- 2002-02-18b, runtime/ kmain.c, sched.c :
initiate_prioq, reinitiate_prioq - allocp
- 2002-02-18a, runtime/ faisus.c, step.c, step.h :
step_susp, step_unify_results - allocp
- 2002-02-18, runtime/unify.c : generator_unify - allocp
- 2002-02-17e, include/klic/ gc_macro.h, gd_macro.h, gg_macro.h,
runtime/generic.c : G_SUSPEND, G_MAKE_THE_NEW_GOAL - g_allocp
- 2002-02-17d :
general_gc, do_shallow_unify, do_shallow_unify_value - allocp
- 2002-02-17c : G_HEAPALLOC_WITH_CHECK - allocp
- 2002-02-17b : check_stack_for_alternatively,
enqueue_after_waiting, enqueue_throw_goal - allocp
- 2002-02-17a, compiler/write.kl1, include/klic/control.h, runtime/faisus.c
: interrupt_goal - allocp → interrupt_goal0
- 2002-02-17, include/klic/ alloc.h, control.h,
runtime/ intrpt.c, kmain.c, sched.c : klic_interrupt - allocp
- 2002-02-16
- include/Makefile.tail : susp.h がインストールされなくなってたのを修正
- マクロ heapp を関数 heapp() と set_heapp() にした
- 2002-02-08b : FUNCTORNUMBERBASE 削除
- 2002-02-08a : functors, arities
- 2002-02-08, runtime/ atomt.kl1, datamsg,c, print.c :
変えた atomnames に合わせた
- 2002-02-06b, compiler/klicdb.c, runtime/newatom.c :
atom.h, atom.c に [] と . も書くようにした
- 2002-02-06a, compiler/klicdb.c, include/klic/atomstuffs.h,
runtime/ debug.c, newatom.c : → atomname(), static atomnames
- 2002-02-06, compiler/klicdb.c, include/klic/atomstuffs.h, runtime/newatom.c
: atom.c にあった atomname = init_atomname; を newatom.c へ移動
- 2002-01-25, include/klic/control.h, runtime/ cntlmsg.c,
config/shm/distio.c, trace.c, version.c.tmplt : make 時の警告に従って修正
- 2002-01-23, compiler/ *.kl1
- 2002-01-22, compiler/ bb.kl1, cmacro.kl1, extern.kl1, gb.kl1, generate.kl1
: public 宣言, レイアウト. 1行に複数のゴール書くの止めようよ
- 2002-01-21, *.c を gcc でコンパイルして出てきた警告・エラーを修正
- 2002-01-18
- Configure : SHM 版をインストールしないようにした
- include/klic/g_extinl.h : 削除
- susp.h : 一度は runtime/ に追い出したけど自作 generator object
から使いたくなったので include/klic に移動。わがまま
- runtime/alloc.c (real_heapbytesize) :
引き算のオペランドが逆 (by 加藤@上田研)
- 2002-01-15a, runtime/unify.c (resume_goals) :
自作 generator object から呼びたくなったので extern に戻した。わがまま
- 2002-01-15, deallocate + allocp
- 2002-01-13
- runtime/config/pvm/*.?
- runtime/ datamsg.c, debug.c, export_table.c,
faisus.c, functt.kl1, gunix.kl1
- runtime/runtime.h: config/pvm/distio.h にあった
ioprintf, ioeprintf, iosprintf の宣言を移動
- 2002-01-12a
- include/klic/gd_macro.h (GD_body_no_arity) : 削除
- runtime/ alloc.c, g_pointer.h, g_termarray.h, gc.c,
gcode.c, ge_exref.c, ge_readhook.c, ge_replyhook.c,
gen.kl1, generic.c, gfloat.c, import_table.c
- 2002-01-12, runtime/ gg_shbusy.c, gg_shvar.c, ggoal.c
- 2002-01-11
- runtime/gio.c (functor_fclose_1) : FALL THRU しないようにした
- runtime/ gmerge.c, gmvv.c, gstring.c : テストのためのコメントを削除
- runtime/ gmodule.c, gpointer.c, gtermarray.c
- runtime/gobj.h : datamsg.c, faisus.c, gc.c, print.c, unify2.c
へそれぞれのローカルマクロを移動
- 2002-01-07b
- runtime/gunix.kl1 : NO_USESOCKET って何? 削除
- runtime/init_dist.c (before_exec, after_exec) :
cntlmsg.c へ移動して static にした
- runtime/import_table.c
- 2002-01-07a
- runtime/interpe.h : cntlmsg.c, export_table.c, import_table.c, sendrecv.c
へそれぞれのローカルオブジェクトを移動
- runtime/ intrpt.c, io.kl1, itimer.kl1
- 2002-01-07, runtime/ kmain.c, ktimer.c
- 2002-01-06c, runtime/ main.c, newatom.c, options.c
- 2002-01-06b
- runtime/options.h : kmain.c でだけ宣言されるものを kmain.c へ移動
- runtime/ otbl.c, pipedio.c
- 2002-01-06a
- runtime/print.c : if は表引きに置き換えられそう
- runtime/ profile.c, random.c, recsusp.c
- 2002-01-06, runtime/rmon.h
- 2002-01-05
- include/klic/interpe.h : BCOPY, BZERO 再定義防止
- runtime/sched.c
- 2002-01-04, runtime/sendrecv.c
- 2002-01-03, runtime/shm* : SHM版が使えないようなので意味はないけど
- 2002-01-02
- runtime/step.h : step.c の extern 宣言
- runtime/timing.c : 削除
- 2002-01-01
- include/klic/stdc.h : STRINGH, STDDEFH を集中
- runtime/trace.h : extern/static を trace.c と再配分
- 2001-12-31, include/klic/stdc.h : 互換性のためのコードを集める
- 2001-12-30, include/klic/extinl.h : 削除
- 2001-12-29
- include/klic/basic.h :
Const/Volatile 殲滅完了, NoReturn → NeverReturn
- runtime/config/pvm-tcp/distpkt.c, runtime/sendrecv.c :
引数違う fatal 呼び出し → fatalf
- illegal → invalid [GNU coding standard]
- 2001-12-28, include/klic/*.h :
runtime/ からしか #include されないファイルを runtime/ へ移動
- 2001-12-27,
include/klic/ gobjutil.h, msgfmt.h : % find . -type f | xargs grep 'gobjutil'
とかやってみても何も表示されないので消してみました
- 2001-12-25
- MANIFEST : % find . -name '*' | sort > MANIFEST
- include/klic/*.h : ごみコメントを削除
- include/klic/newatom.h : static を runtime/newatom.c へ移動
- runtime/*.c : extern 宣言をヘッダへ
- runtime/runtime.h : runtime/ でしか使わなそうな extern 宣言
- 2001-12-22
- ChangeLog : runtime/makeChangelog.perl
はうさん臭いので使わないことにした
- compiler/write.kl1 : Const → const
- include/klic/*.h : プロトタイプ宣言
- 2001-12-02, README.j : 以前として (thanks 増田@上田研)
- 2001-11-26, runtime/gunix.kl1 : mktemp → mkstemp (thanks 魏@上田研)
- 2001-11-25, compiler/klicdb.c (error_exit) : 引数違う
- 2001-11-24, compiler/klicdb.c, やっぱり Extern は容赦することにした
- 2001-11-23,
compiler/klic.c : -C option, .ext 再生成条件, プロトタイプ宣言
- 2001-11-22, include/klic/basic.h : Extern/Const/Volatile 撲滅計画発動
- 2001-11-21,
runtime/termio.kl1 : fork_with_pipes on klicio (by 金木@上田研)
- 2001-11-20
- FOR-DEVELOPERS.j, README.j : 誤字
- Makefile.tail : distclean/realclean 時に共有ライブラリを消す
- include/klic/*.h : マクロをおおむねカッコで囲んだ
- 2001-11-19, include/klic/*.h : 複数回展開防止
- 2001-11-18, klic-bugs@klic.org に流れたもの、その他
- compiler/klic.c : 引数の個数 (by ? 藤瀬@MRI, 横山@近山研)
- include/klic/control.h : REDCTION_COUNT
- include/klic/gg_macro.h : GG_ERROR_IN_IN → GG_ERROR_IN_NEW
- runtime/debug.c : sys_errlist[] → strerror() (by YOSHIKAWA@東大)
- runtime/gunix.kl1 : fork_with_pipes on unix (by 金木@上田研)
- extio/shared (by 五十嵐@上田研)
- extio, Prolog風の非同期ソケット入出力をサポート
- shared, libklic を共有ライブラリ化。バイナリが小さくなる
How to install from ${PATCH}.tgz
- % tar xzf ${PATCH}.tgz
or, % gzcat ${PATCH}.tgz | tar xf -
- % cd ${PATCH}/
- % ./Configure
- % make all && make tests
- # make install
How to apply ${PATCH}.patch
- 修正前のバイナリが ${OLD_INST_DIR}/{bin, lib, include}
以下にインストールされているものとします。
- 修正前のソースが ${OLD_SRC_DIR} 以下に展開されているものとします。
- ${PATCH}.patch を当てたバイナリを
${NEW_INST_DIR} 以下にインストールするとします。
- % cd ${OLD_SRC_DIR}
- % cat ${PATCH}.patch | patch -p1
extio/shared は -p0、2001-* は -p1。
- % ./Configure builddist
ソース *.kl1 を変更した場合、
${OLD_INST_DIR}/lib/klic/kl1cmp によって
それをコンパイルして、修正済み *.c を生成する必要があります
(*.kl1 を変更していない場合は、./Configure だけで良い)。
途中でKLICライブラリとコンパイラの場所を聞かれるので、
${OLD_INST_DIR}/lib/klic を答えて下さい。
それとは別にインストール先を聞かれますが、
こちらは ${NEW_INST_DIR} を答えて下さい。
- % make all && make tests
- # make install
開発環境
- PC-AT / Intel Pentium III (Single Processor)
- Debian GNU/Linux 2.2
how to make ${PATCH}.patch file
- ソース ${NEW_SRC_DIR}/*.{kl1, h, c} を書き換える。
- % diff -ruN ${OLD_SRC_DIR} ${NEW_SRC_DIR} > ${PATCH}.patch
how to make ${PATCH}.tgz file
- % cd ${NEW_SRC_DIR}
- % ./Configure builddist
- [PARALLEL ?] yes
- [DIST ?] yes
- [pvm, pvm-tcp, shm] shm
- これ以外の選択肢はデフォルトのまま
- % make all && make tests && make disttests && make verify
- # make install
- % make realclean
- % ./Configure builddist
コンパイラの出力 (*.kl1 → *.c) を変更した場合、セルフコンパイルする
- % make all && make tests && make disttests && make verify
- % make distclean
- % cd .. ; tar czf ${PATCH}.tgz ${NEW_SRC_DIR}
known bugs, misfeatures, and ヤなところ
- ドキュメント不足
- 標準入力を待っている間、その他の入出力がブロックされる
→ unix:unix([stdin(R)]) @node(1) とかして回避できる。
- public 宣言されていない述語をモジュール外部から呼び出せてしまう。
- klicio を unix に合わせる必要はない。単なる decorator なんだから。
- マクロ使い過ぎ
- グローバル変数使い過ぎ
- 条件コンパイルは論理的なインデントを破壊する
- KLIC-C のインタフェイスが分かりづらい。
何で G?SET_NEWOBJ_FOR_NEW は size を取るのに
G?SET_NEWOBJ, G?SET_NEWOBJ_IN_NEWGEN は取らないんだ?
- 未定義変数同士の単一化を検出すれば
ジェネレータオブジェクトは要らない気がする。
- モジュール変数・関数は static 宣言しろよ〜。
解析に手間がかかるじゃないか。
- 何で makeChangelog.perl が runtime/ にあるんだ?
- おそらく効率のために、
KL1 のモジュールが C の関数へ翻訳される
(述語呼び出しごとにプロセスが生成されるせいで効率が悪いのではないか
という非難もあるけど、逐次実行部分の検出による最適化は可能)。
このせいで KLIC-C ではマクロが乱用され、
KLIC 処理系のモジュール化が妨げられている。
ヒープ管理とか独立モジュールにした方が分かりやすいだろう。
- 移植性に関する矛盾
- GNU C 拡張機能である文式と、非 ANSI 環境への対応を混在させるな。
- BCMP, BCOPY, BZERO, INDEX を定義しておきながら memcmp とか使うな。
- 用語の不統一
- xxx があれば G_XXX は不要。
- G?_XXX と G?SET_NEWOBJ。下線つけるのかつけないのかはっきりしろ。
- 引数無しマクロに () が付いたり付かなかったり。ポリシー無さすぎ。
- 用語の重複
- dist: 分散 (distributed) と配布 (distribution)
- 不適切な表現
- texinfo が分からないので手が出せない documents/klicj.tex :
並列実装では、KLIC は複数プロセスを構成します。すべてのメッセージは、
unix ストリームを獲得するプロセスで処理します。例えば、`cd(Path)' メッセー
ジは、単一プロセスのワーク・ディレクトリと、他に何も存在しないワーク・ディ
レクトリを変更します。
KLIC-3.003 rewriting
KLIC-3.003 のソースが読むに耐えないので、俺好みに書き直すページ。
参考文献
- KLIC-3.003
- [HS] サミュエル P ハービソン / ガイ L スティール 共著, 斎藤信男 監訳,
新・詳説 C 言語 [H&Sリファレンス], ソフトバンク, 1994.
- [MC] STEVE McCONNELL 著, 石川勝 訳, コードコンプリート
−完全なプログラミングを目指して−, アスキー出版局, 1994.
- 藤原博文 著, C プログラミング専門課程, 技術評論社, 1994.
- Peter van der Linden 著, 梅原系 訳, エキスパート C プログラミング
−知られざる C の深層, アスキー出版局, 1996.
- [Th] デビッド・シーレン 著, 岩谷宏 訳, No Bugs! −バグは早めに追い出せ−,
ビレッジセンター出版局, 1992.
目標
- Simple. 無駄なコードを削除する。不要な名前を捨てる
- Readable. 可読性
- Clear. 暗黙の仮定を明文化する
- Consistent. 一貫性
- Portable. 移植性, 保守性
- Correct. 誤りを訂正する
- not Compatible. 後方互換性は無視する。ANSI C 非対応環境は切り捨て
- not Efficient. 実行効率よりも単純さ・可読性・保守性を重視する
- 新しい名前を導入しない。
どうしても必要なら下線で始まる名前を付ける。
下線で始まる名前は C 言語で処理系用に予約されている
*.h
*.h の複数回展開が防止されていないので、
同一のファイルを2回以上取り込まないように注意しなければならなかった。
#ifndef _INCLUDED_H_
#define _INCLUDED_H_
$INCLUDED.h の中身
#endif /* _INCLUDED_H_ */
のように2回以上の展開を防止すれば、何も考えずに取り込むことができる
[HS, 10.1]。
宣言の分散
*.h 内に static はありえない
各 *.c を C 言語におけるモジュールとみなすと、
*.h は対応するモジュールの外部インタフェイスである。
static はモジュールローカルなんだから、
*.h ではなく *.c で宣言すれば良い。
マクロ引数を()で囲む
マクロ式を()で囲む
マクロ関数の型
マクロ手続きをdo{ }while(0)で囲む
#define PROC() { .. }
だけだと、
if(..) PROC(); else ..
を展開した時に
if(..)
{ .. }
;
else ..
となり、コンパイルエラーが起きる。
これは呼び出し側(マクロ手続きのユーザ)の責任であるべきではない。
#define PROC() do{ .. }while(0)
なら、
if(..)
do{ .. }while(0);
else ..
となり、OK
[いつかの C Magazine.
さらにその記事は Nifty の C 言語フォーラムによるらしい]。
名前や宣言は囲まない
assert
型
Const, Volatile
const, volatile の別名として使われていた。
意味が異なる用語なら別名を付けるべきだが、
Const, Volatile の意味は正に ANSI C の const, volatile である。
const, volatile を使うプログラマを不正と審判するような規約は鬼。
既存の規約と衝突するような規約は有害。
非標準環境への対応は、[HS, 4.4.1] にあるような
「予約語を再定義することが正当化されるまれなケース」に当たると思う。
Copyright 2001-2002, TAKAGI Yusuke.