* acl4のプログラムのページ0006
-(by [[K]], 2026.02.17)

** (1) C言語に変換したい
-[[a4_p0005]]で実行は簡単にできました。
-今度は実行するのではなく、「C言語に変換する」っていうのをやってみます。つまりトランスパイラです(トランスコンパイラとも言います)。
-C言語に変換できれば、高速に実行することもできます(きっと最適化してくれるので)。
-C言語に変換できれば、高速に実行することもできます(きっとコンパイラが最適化してくれるので)。

** (2) p0006a.c [16行] : 即興で作ったトランスパイラ
 #define a_Version 1
 #include <acl4.c>
 
 int main(int argc, const char **argv)
 {
     if (argc < 2) return 1;
     Preprocessor pp[1]; Preprocessor_ini(pp);                            // プリプロセッサの初期化.
     Preprocessor_SourceFiles_addFile(pp->sfs, argv[1], strlen(argv[1])); // 入力ファイルを指定.
     Preprocessor_SourceFiles_addFile(pp->sfs, "a4vm-asm-p0006a.h", 17);  // 最初にこれをインクロードさせる.
     VecChr vc[1]; VecChr_ini(vc); pp->put0->dst = vc;                    // 出力先のオブジェクトを指定.
     Preprocessor_main(pp); Preprocessor_din(pp);                         // プリプロセッサ処理. およびメモリ開放.
     printf("%.*s}\n", (int) vc->n, vc->p);
     VecChr_din(vc);
     a_malloc_debugList(_arg);
     return 0;
 }
-適当に作った定義ファイル: a4vm-asm-p0006a.h  (内容は仮です。たぶん全部作り直します。)
 #include <stdio.h>
 
 int main()
 {
     int R00, R01, R02, R03;
 
 #define Lod_RI(r,i)      r = (i);
 #define Lbl_T(t)         t:
 #define Add_RR(r,s)      r += s;
 #define Add_RI(r,i)      r += (i);
 #define Jle_RIT(r,i,t)   if (r <= (i)) goto t;
 #define Jlt_RIT(r,i,t)   if (r <  (i)) goto t;
 #define Dbg_Ret_R(r)     return r;
 #define Dbg_Ret_I(i)     return i;
 #define Dbg_Putc_R(r)    putchar(r);
 #define Dbg_Putc_I(i)    putchar(i);
 #define Dbg_PutDec_R(r)  printf("%d", r);

** (3) 実行結果
-p0004a0.txt:
 #define c   R00 // 整数レジスタ
 #define lp  L0000 // ラベル
 
   Lod_RI(c, 0x20)
 Lbl_T(lp)
   Dbg_Putc_R(c)
   Add_RI(c, 1)
   Jlt_RIT(c, 0x7f, lp)
   Dbg_Putc_I('\n')
   Dbg_Ret_I(0)

 >p0006a p0004a0.txt
 #line 1 "a4vm-asm-p0006a.h"
 #include <stdio.h>
 
 int main()
 {
     int R00, R01, R02, R03;
 
 #line 3 "p0004a0.txt"
 
   R00 = (0x20);
 L0000:
   putchar(R00);
   R00 += (1);
   if (R00 <  (0x7f)) goto L0000;
   putchar('\n');
   return 0;
 }
--こんな感じでちゃんと動いています。これをリダイレクトしてファイルにしてCコンパイラでコンパイルすれば、もちろん動きます。

-p0005a0.txt:
 #define i   R00 // 整数レジスタ
 #define s   R01
 #define lp  L0000 // ラベル
 
   Lod_RI(s, 0)
   Lod_RI(i, 0)
 Lbl_T(lp)
   Add_RR(s, i)
   Add_RI(i, 1)
   Jle_RIT(i, 1000, lp)
   Dbg_PutDec_R(s)
   Dbg_Putc_I('\n')
   Dbg_Ret_I(0)

 >p0006a p0005a0.txt
 #line 1 "a4vm-asm-p0006a.h"
 #include <stdio.h>
 
 int main()
 {
     int R00, R01, R02, R03;
 
 #line 4 "p0005a0.txt"
 
   R01 = (0);
   R00 = (0);
 L0000:
   R01 += R00;
   R00 += (1);
   if (R00 <= (1000)) goto L0000;
   printf("%d", R01);
   putchar('\n');
   return 0;
 }

--これも問題なく動きました。

** (4) 考察
-アセンブラの構文体系を xxx(...) の形式で作っておけば、アセンブラ・実行エンジン・トランスパイラはすごく簡単に作れることが分かりました。
-低級言語はこれが一番いいんじゃないかと思います。


** (99) 更新履歴
-2026.02.17(火) 初版

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS