a4_log11
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* acl4の開発ログ #11
-(by [[K]], 2026.06.01)
-''acl4開発のもくじ → [[a4_i01]]''
** 2026.04.11(土) #0
-[[a4_d0004]](typedDef について)を書きました。
-今後の予定:
--ソースコードを少しだけ整えたあとで、以下のことをやりた...
--[1] tt0003b.c (2026.03.17(火)#2→[[a4_log08]]) で作った...
--[2] 同様にミニコンパイラと適当な定義ファイルで、x86用の...
--[3] 同様にミニコンパイラと適当な定義ファイルで、簡易JIT...
** 2026.04.11(土) #1
-今ふと思ったんですが、プリプロセッサのマクロって面白いで...
-普通のプログラムだと、変数への代入順序はとても重要です。
a=1;
b=2;
c=a+b;
printf("%d\n", c);
-これがプリプロセッサだと逆順に書いてもうまくいってしまう...
#define c a+b
#define b 2
#define a 1
printf("%d\n", c);
-当たり前なんだけど、なんだかおもしろいです。
-(ちなみに逆順に限らず、3行のdefineはどんな順序で書いて...
** 2026.04.11(土) #2
-acl4をたくさん使ってだんだんわかってきたので、もっと使い...
-上記の簡易Cインタプリタ・簡易Cコンパイラ・簡易C-JITコン...
--メモリリーク発見機能が大活躍なので、もうちょっと強化し...
--プログラムの部品化の粒度を見直したい。
** 2026.04.12(日) #0
-なんか気分が乗ってきたので、全面書き直しのほうを先にやっ...
-旧acl4では、メモリリークの一覧が簡単に見えてとても便利で...
-例えば以下は、[[a4_0005]]に書いたt0005b.cを改造したもの...
// tt0005a.c
#define a_Version 1
#include <acl4v1.c>
class_(Data) { SetElm elm[2]; int age; };
int main()
{
Set0 index[2]; char *k;
Set0_ini(_a_ &index[0], NULL);
Set0_ini(_a_ &index[1], NULL);
// nameだけではなく、phoneでもデータを検索できるよう...
Data data[4], *p; int i;
data[0].elm[0].k = "Kawai"; data[0].age = 20; dat...
data[1].elm[0].k = "Suzuki"; data[1].age = 22; dat...
data[2].elm[0].k = "Tanaka"; data[2].age = 25; dat...
data[3].elm[0].k = "Yamamoto"; data[3].age = 30; dat...
for (i = 0; i < 4; i++) {
data[i].elm[0].n = strlen(data[i].elm[0].k);
data[i].elm[1].n = strlen(data[i].elm[1].k);
Set0_add(&index[0], &data[i].elm[0]);
Set0_add(&index[1], &data[i].elm[1]);
}
k = "Tanaka"; p = Set0_findKn(&index[0], k, strlen(k...
if (p == NULL) printf("name(key)=%s: not found\n", k);
if (p != NULL) printf("name=%s age=%d phone=%s\n", (...
k = "0X0-XXXX-XXXX"; p = ptrSub(Set0_findKn(&index[1...
if (p == NULL) printf("name(key)=%s: not found\n", k);
if (p != NULL) printf("name=%s age=%d phone=%s\n", (...
Set0_din(_a_ &index[0]);
// Set0_din(_a_ &index[1]); // わざとdeinitを忘れてみる.
a_malloc_debugList(_a);
a_DbgObjInfTbl_debugList(_a);
return 0;
}
// 実行結果.
>tt0005a
name=Tanaka age=25 phone=0Y0-YYYY-YYYY
name=Suzuki age=22 phone=0X0-XXXX-XXXX
tt0005a.c(35): malloc_debugList()
[p:00afccf0 sz:24 / a4_0016.c(345)] ← [註]従来からのメ...
tt0005a.c(36): DbgObjInfTbl_debugList()
[VecChr / a4_0016.c(402)] ← [註]acl4v1のオブジェクト...
[Set0 / tt0005a.c(10)] ← [註]acl4v1のオブジェクト...
-今までは、 malloc_debugList しかありませんでした。だから...
-ちなみに a4_0016.c の345行目は VecChr_reserve() の中です...
-一方で、 acl4v1 から見えるようになった DbgObjInfTbl_debu...
-これはデバッグがはかどります!
-(ちなみに、 Set0 が VecChr を内部で使っているのでした。)
-「うきょー」って言いたくなる気持ちが伝わったでしょうか・...
** 2026.04.13(月) #0
-ちなみに今は「どのオブジェクトなのかを特定するために、in...
-メモリリークやオブジェクトに関するエラー表示について、最...
-まず、この方法は基本的にはうまくいきました。どのオブジェ...
-しかし問題もありました。それは名前を付けるのが面倒という...
-・・・それで名前を省略したり、同じ名前を適当に連発したり...
-そうなってから名前を付けなおしてデバッグするわけですが、...
-__LINE__とか__FILE__を書けば行番号表示に必要な情報が取れ...
-また、このマクロ変数は目立つし長いので、ソースコードに書...
-2026年になって、メモリリークを検出する機構をacl4用にまた...
-一方で実行時エラーを表示するために、関数を呼び出した行番...
-やってみてわかったこと: サイズだけではよくわからない。...
** 2026.04.13(月) #1
-私は、VecChrで作った可変長配列の中にオブジェクトを並べて...
-たとえば、"apple", "banana", "grape", "lemon", "melon", ...
VecChr array[1], *p; VecChr_ini(_a_ array);
p = VecChr_stkAdd(array, sizeof (VecChr)); VecChr_iniCpy...
p = VecChr_stkAdd(array, sizeof (VecChr)); VecChr_iniCpy...
p = VecChr_stkAdd(array, sizeof (VecChr)); VecChr_iniCpy...
// stkAdd()は、指定されたサイズだけarrayを拡張し、その先...
// そこを VecChr で init して、 文字列をコピーしているの...
-一方で、VecChrはサイズの拡大のために realloc() を使って...
-もしもメモリアドレスが変わらないなら、オブジェクトをリン...
-でもメモリアドレスが変わるなら、リンクリストでつなぐ方式...
--オブジェクトのアドレスは変わってもいいようにします。
--上記例でたとえばarrayの中身をdeinitせず、親のarrayのみ...
--デバッグモードとはいえ、速いほうが望ましいのでできれば ...
** 2026.04.15(水) #0
-リファクタリングをすると、そういえばここも直したいって思...
-大半の記述は直す必要はないので、コピー&ペーストしてきて...
** 2026.04.15(水) #1
-[[a4_d0005]] (a_DbgObjInf の使い方) を書きました。
** 2026.04.16(木) #0
-[Q] 結局 acl4 って何ができますか?
-[A1] デバッグレベルの提供
--一般にCコンパイラには、最適化レベルとデバッグ情報(シン...
--acl4は違います。デバッグレベル2以上にすれば(=これをデ...
--なお、デバッグモードではなくても「ファイルオープンのエ...
--デバッグモードはプリプロセッサ制御で実現しています。リ...
--このようにデバッグチェックがリリースモード時の実行速度...
-[A2] デバッグモードで提供される機能(メモリ管理支援など)
--mallocしたけどfreeしてないメモリを一覧形式で表示する関...
--mallocしてないメモリをfreeしてしまった(もしくは二重にf...
--freeしたりreallocでサイズを小さくすると、解放された部分...
--initしたけどdeinitはしていないオブジェクトの一覧も見ら...
--また同じオブジェクトに対してinitを2度してしまったとか、...
--これらのサポート機能のおかげで、私は自分の作ったプログ...
-[A3] 動的可変長配列のクラス VecChr の提供
--C++には vector<T> という動的可変長配列があります。これ...
--動的可変長配列があれば事前にサイズを決めておく必要はな...
-[A4] プリプロセッサを作るための一通りの機能を提供
--プリプロセッサで処理したいソースコードをC言語の文字列で...
--基本的にすべてオンメモリで処理するので高速ですし、一時...
--プリプロセッサ関数はより細分化された細かい関数で構成さ...
-[A5] Cコンパイラ・Cインタプリタを作るための機能を提供(...
--Cコンパイラなどの言語を作ることを考えると、結局はソース...
--この「変換」は実はプリプロセッサが得意とするところなの...
--acl4 では既にプリプロセッサ処理は好きなだけ利用できる状...
** 2026.04.17(金) #0
-プリプロセッサが、文字列リテラルに対してstrlenできるよう...
** 2026.04.17(金) #1
-acl4 → acl4v1 での主な改善点:
--DbgObjInf が入ったので、init/deinit に関するバグを簡単...
--VecChr の sizeof が「ポインタ1つ分」になりました。 VecC...
--parseArgs() を使いやすくするために結果の渡し方を改良し...
--Preprocessor_Eval で、演算子や特殊な変数や関数の追加な...
--プリプロセッサの機能が密結合になっていた部分があったの...
--typedDef と普通の define の処理ルーチンを統合します(予...
** 2026.04.18(土) #0
-やっと、acl4v1でもプリプロセッサが動きましたー。でもまだ...
-そのテストの時に、デバッグモードにするとやたらと低速にな...
* こめんと欄
#comment
終了行:
* acl4の開発ログ #11
-(by [[K]], 2026.06.01)
-''acl4開発のもくじ → [[a4_i01]]''
** 2026.04.11(土) #0
-[[a4_d0004]](typedDef について)を書きました。
-今後の予定:
--ソースコードを少しだけ整えたあとで、以下のことをやりた...
--[1] tt0003b.c (2026.03.17(火)#2→[[a4_log08]]) で作った...
--[2] 同様にミニコンパイラと適当な定義ファイルで、x86用の...
--[3] 同様にミニコンパイラと適当な定義ファイルで、簡易JIT...
** 2026.04.11(土) #1
-今ふと思ったんですが、プリプロセッサのマクロって面白いで...
-普通のプログラムだと、変数への代入順序はとても重要です。
a=1;
b=2;
c=a+b;
printf("%d\n", c);
-これがプリプロセッサだと逆順に書いてもうまくいってしまう...
#define c a+b
#define b 2
#define a 1
printf("%d\n", c);
-当たり前なんだけど、なんだかおもしろいです。
-(ちなみに逆順に限らず、3行のdefineはどんな順序で書いて...
** 2026.04.11(土) #2
-acl4をたくさん使ってだんだんわかってきたので、もっと使い...
-上記の簡易Cインタプリタ・簡易Cコンパイラ・簡易C-JITコン...
--メモリリーク発見機能が大活躍なので、もうちょっと強化し...
--プログラムの部品化の粒度を見直したい。
** 2026.04.12(日) #0
-なんか気分が乗ってきたので、全面書き直しのほうを先にやっ...
-旧acl4では、メモリリークの一覧が簡単に見えてとても便利で...
-例えば以下は、[[a4_0005]]に書いたt0005b.cを改造したもの...
// tt0005a.c
#define a_Version 1
#include <acl4v1.c>
class_(Data) { SetElm elm[2]; int age; };
int main()
{
Set0 index[2]; char *k;
Set0_ini(_a_ &index[0], NULL);
Set0_ini(_a_ &index[1], NULL);
// nameだけではなく、phoneでもデータを検索できるよう...
Data data[4], *p; int i;
data[0].elm[0].k = "Kawai"; data[0].age = 20; dat...
data[1].elm[0].k = "Suzuki"; data[1].age = 22; dat...
data[2].elm[0].k = "Tanaka"; data[2].age = 25; dat...
data[3].elm[0].k = "Yamamoto"; data[3].age = 30; dat...
for (i = 0; i < 4; i++) {
data[i].elm[0].n = strlen(data[i].elm[0].k);
data[i].elm[1].n = strlen(data[i].elm[1].k);
Set0_add(&index[0], &data[i].elm[0]);
Set0_add(&index[1], &data[i].elm[1]);
}
k = "Tanaka"; p = Set0_findKn(&index[0], k, strlen(k...
if (p == NULL) printf("name(key)=%s: not found\n", k);
if (p != NULL) printf("name=%s age=%d phone=%s\n", (...
k = "0X0-XXXX-XXXX"; p = ptrSub(Set0_findKn(&index[1...
if (p == NULL) printf("name(key)=%s: not found\n", k);
if (p != NULL) printf("name=%s age=%d phone=%s\n", (...
Set0_din(_a_ &index[0]);
// Set0_din(_a_ &index[1]); // わざとdeinitを忘れてみる.
a_malloc_debugList(_a);
a_DbgObjInfTbl_debugList(_a);
return 0;
}
// 実行結果.
>tt0005a
name=Tanaka age=25 phone=0Y0-YYYY-YYYY
name=Suzuki age=22 phone=0X0-XXXX-XXXX
tt0005a.c(35): malloc_debugList()
[p:00afccf0 sz:24 / a4_0016.c(345)] ← [註]従来からのメ...
tt0005a.c(36): DbgObjInfTbl_debugList()
[VecChr / a4_0016.c(402)] ← [註]acl4v1のオブジェクト...
[Set0 / tt0005a.c(10)] ← [註]acl4v1のオブジェクト...
-今までは、 malloc_debugList しかありませんでした。だから...
-ちなみに a4_0016.c の345行目は VecChr_reserve() の中です...
-一方で、 acl4v1 から見えるようになった DbgObjInfTbl_debu...
-これはデバッグがはかどります!
-(ちなみに、 Set0 が VecChr を内部で使っているのでした。)
-「うきょー」って言いたくなる気持ちが伝わったでしょうか・...
** 2026.04.13(月) #0
-ちなみに今は「どのオブジェクトなのかを特定するために、in...
-メモリリークやオブジェクトに関するエラー表示について、最...
-まず、この方法は基本的にはうまくいきました。どのオブジェ...
-しかし問題もありました。それは名前を付けるのが面倒という...
-・・・それで名前を省略したり、同じ名前を適当に連発したり...
-そうなってから名前を付けなおしてデバッグするわけですが、...
-__LINE__とか__FILE__を書けば行番号表示に必要な情報が取れ...
-また、このマクロ変数は目立つし長いので、ソースコードに書...
-2026年になって、メモリリークを検出する機構をacl4用にまた...
-一方で実行時エラーを表示するために、関数を呼び出した行番...
-やってみてわかったこと: サイズだけではよくわからない。...
** 2026.04.13(月) #1
-私は、VecChrで作った可変長配列の中にオブジェクトを並べて...
-たとえば、"apple", "banana", "grape", "lemon", "melon", ...
VecChr array[1], *p; VecChr_ini(_a_ array);
p = VecChr_stkAdd(array, sizeof (VecChr)); VecChr_iniCpy...
p = VecChr_stkAdd(array, sizeof (VecChr)); VecChr_iniCpy...
p = VecChr_stkAdd(array, sizeof (VecChr)); VecChr_iniCpy...
// stkAdd()は、指定されたサイズだけarrayを拡張し、その先...
// そこを VecChr で init して、 文字列をコピーしているの...
-一方で、VecChrはサイズの拡大のために realloc() を使って...
-もしもメモリアドレスが変わらないなら、オブジェクトをリン...
-でもメモリアドレスが変わるなら、リンクリストでつなぐ方式...
--オブジェクトのアドレスは変わってもいいようにします。
--上記例でたとえばarrayの中身をdeinitせず、親のarrayのみ...
--デバッグモードとはいえ、速いほうが望ましいのでできれば ...
** 2026.04.15(水) #0
-リファクタリングをすると、そういえばここも直したいって思...
-大半の記述は直す必要はないので、コピー&ペーストしてきて...
** 2026.04.15(水) #1
-[[a4_d0005]] (a_DbgObjInf の使い方) を書きました。
** 2026.04.16(木) #0
-[Q] 結局 acl4 って何ができますか?
-[A1] デバッグレベルの提供
--一般にCコンパイラには、最適化レベルとデバッグ情報(シン...
--acl4は違います。デバッグレベル2以上にすれば(=これをデ...
--なお、デバッグモードではなくても「ファイルオープンのエ...
--デバッグモードはプリプロセッサ制御で実現しています。リ...
--このようにデバッグチェックがリリースモード時の実行速度...
-[A2] デバッグモードで提供される機能(メモリ管理支援など)
--mallocしたけどfreeしてないメモリを一覧形式で表示する関...
--mallocしてないメモリをfreeしてしまった(もしくは二重にf...
--freeしたりreallocでサイズを小さくすると、解放された部分...
--initしたけどdeinitはしていないオブジェクトの一覧も見ら...
--また同じオブジェクトに対してinitを2度してしまったとか、...
--これらのサポート機能のおかげで、私は自分の作ったプログ...
-[A3] 動的可変長配列のクラス VecChr の提供
--C++には vector<T> という動的可変長配列があります。これ...
--動的可変長配列があれば事前にサイズを決めておく必要はな...
-[A4] プリプロセッサを作るための一通りの機能を提供
--プリプロセッサで処理したいソースコードをC言語の文字列で...
--基本的にすべてオンメモリで処理するので高速ですし、一時...
--プリプロセッサ関数はより細分化された細かい関数で構成さ...
-[A5] Cコンパイラ・Cインタプリタを作るための機能を提供(...
--Cコンパイラなどの言語を作ることを考えると、結局はソース...
--この「変換」は実はプリプロセッサが得意とするところなの...
--acl4 では既にプリプロセッサ処理は好きなだけ利用できる状...
** 2026.04.17(金) #0
-プリプロセッサが、文字列リテラルに対してstrlenできるよう...
** 2026.04.17(金) #1
-acl4 → acl4v1 での主な改善点:
--DbgObjInf が入ったので、init/deinit に関するバグを簡単...
--VecChr の sizeof が「ポインタ1つ分」になりました。 VecC...
--parseArgs() を使いやすくするために結果の渡し方を改良し...
--Preprocessor_Eval で、演算子や特殊な変数や関数の追加な...
--プリプロセッサの機能が密結合になっていた部分があったの...
--typedDef と普通の define の処理ルーチンを統合します(予...
** 2026.04.18(土) #0
-やっと、acl4v1でもプリプロセッサが動きましたー。でもまだ...
-そのテストの時に、デバッグモードにするとやたらと低速にな...
* こめんと欄
#comment
ページ名: