* KHPC ver.0.01の内部資料的なもの
-(by [[K]], 2016.05.19)

** 基本仕様
-KHPCの2番目のバージョン。KHPCは[[persistent-C>persistent_C]]の簡易実装を目指したツール群。
-基本方針: とにかくできるだけ手抜きをする。次のバージョンでまともにすればいい。手抜きは美徳である。

-このバージョンの目玉:「persistent命令」をサポートする。

** ダウンロード
-開発中
-http://khfdpl.osask.jp/download/khpc001a.zip
--ソースはTab=4を想定。

** 関数群
-[[KHPC_v000doc01]]に準ずる。
** サンプルコード
 #include <stdio.h>
 #include <khpc0.h>
 
 persistent int i = 0, sum = 0;
 persistent char str[16] = "hello, world";
 
 int main()
 {
     persistent_load(0);
     for (; i <= 100; i++) {
         persistent_save(0);
         sum += i;
     }
     printf("sum=%d\n", sum);
     return 0;
 }
** ビルド方法
-(1) prompt>mksrc test.c > pd-test.c を実行する。
--すると pd-test.c というファイルが生成される。
-(2) prompt>mksrc :PDEF test.c > pdef.c を実行する。
--すると pdef.c が生成される。
-(3) prompt>gcc -o test.exe -O3 -I. pd-test.c pdef.c khpc0.c とする。
--これで出来上がり。
--gccでtest.cを指定する必要はないです。test.cの内容はpd-test.cにすべて反映されています。
--khpc0.cはライブラリです。
-(4) なんでこんなややこしい仕様なのかというと、分割コンパイルにも対応できるようにするためです。もし、ファイルが、prog0.c prog1.c prog2.cの3つに分割されていたら、以下のようにします。
 prompt>mksrc prog0.c > pd-prog0.c
 prompt>mksrc prog1.c > pd-prog1.c
 prompt>mksrc prog2.c > pd-prog2.c
 prompt>mksrc :PDEF prog0.c prog1.c prog2.c > pdef.c
 prompt>gcc -o prog.exe -O3 -I. pd-prog0.c pd-prog1.c pd-prog2.c pdef.c khpc0.c
--説明の都合上、プロンプトから入力するかのように書いていますが、実際はバッチファイルかMakefileにするのがよいでしょう。

** persistent命令の変換アルゴリズム
-与えられたソースから「persistent」を含む宣言を探し出す。そしてその変数名を内部のバッファに貯める。
--ソースは1つとは限らない。分割コンパイルなどで複数のソースに分かれているかもしれないので。
-ソースをすべてチェックしたら、以下のようなテキストファイルを出力する。
--"abc", "def", "ghi"という3つの変数がpersistent属性を持っていたとする。
 void persistent_grp(int grpId, const char *path, const char *tmp, const char *memo);

~
-pd-test.cの実体はこんな感じです。なーんだ、と言いたくなる内容かもしれません。
 #define persistent
 #include "test.c"
 void persistent_def(void *p, int size, int grpId, const char *id);
 
 void persistent_default_test_c()
 {
     persistent_def(&i, sizeof(i), 0, "i");
     persistent_def(&sum, sizeof(sum), 0, "sum");
     persistent_def( str, sizeof(str), 0, "str");
 }
-pdef.cの実体はこんな感じです。
 void persistent_grp(int grpId, const char *path, const char *tmp, const char *memo);
 
 void persistent_default_test_c();
 
 void persistent_default()
 {
     persistent_grp(0, "p-vars.pbd", "p-vars.pb_", "(local)");
     persistent_def(&abc, sizeof(abc), 0, "abc");
     persistent_def(&def, sizeof(def), 0, "def");
     persistent_def(&ghi, sizeof(ghi), 0, "ghi");
     persistent_default_test_c();
     return;
 }
--このソースを含めてコンパイル&リンクすればいい。
--このpersistent_default()という関数はpersistent_load()が最初に実行された時のみ、呼ばれるようにしておく。
-元のソースからpersistentの語を消す必要があるが、それは-Dpersistent=というオプションをgccに渡すことで実現したい。
-この persistent_default() は persistent_load(0); のタイミングで自動的に呼び出されます。

~
-しまった、これではダメだ。extern宣言を入れない限り、別のソースではコンパイルできないなあ。
--そしてextern宣言を入れる道は、いばらの道・・・。
--じゃあ、ひとまず分割コンパイルには対応しないで、ソースの末尾にくっつける構想で行くかな・・・。
** 関数群
-[[KHPC_v000doc01]]に準ずる。



** メモなど

* こめんと欄
#comment


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS