a4_p0008
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* acl4のプログラムのページ0008
-(by [[K]], 2026.05.04) ([[a4_i01]]: acl4 の目次...
** (1) プリプロセッサは善か悪か?(この部分は[[a4_p0007]]...
-私はかつてC言語のプリプロセッサのマクロが嫌いでした。関...
#define Square(x) (x)*(x)
-みたいなのがあると、xは二度評価されて、副作用があったり...
-こんなのやるくらいなら inline 関数を書いたほうがマシです。
-そもそも x * x って書けないところからして、許せないんで...
-まあ最適化が強くないコンパイラでも、関数呼び出しコードを...
~
-私は今はプリプロセッサが大好きです。プリプロセッサは世界...
** (2) プログラム p0008a.c について #0 (プリプロセッサ)...
-acl4 ライブラリを使って、プリプロセッサを作りました。acl...
-''[p0007b.txt]:''
#define Square(x) (x)*(x)
#define One 1
#define Two 2
#define Three 3
#define Four 4
#define Five 5
#define Six 6
#define Seven 7
#define Eight 8
#define Nine 9
#define Ten 10
#define Eleven 11
#define Twelve 12
#if (Square(2+3)!=11)
Square(Three + Seven)
#endif
-これをプリプロセッサにかけるとこうなります。
>p0008a pp:1 src:p0007b.txt
#line 14 "p0007b.txt"
(3 + 7)*(3 + 7)
-もし #line を出力しないでほしければ、こうします。
>p0008a pp:1 src:p0007b.txt mod:2
(3 + 7)*(3 + 7)
** (3) プログラム p0008a.c について #1 (コマンドライン計...
-プリプロセッサでは #if で式の値を計算する必要があります...
-せっかくなので、それを使ってやろうと考えました。ファイル...
>p0008a calc:1 src:inline:1+2+3+4+5+6+7+8+9+10
55
-結局中身はプリプロセッサなので、#defineとかが混ざってい...
>p0008a calc:1 src:p0007b.txt
100
-だから計算機プログラムとしては、ちょっと多機能です(笑)。
** (4) プログラム p0008a.c について #2 (簡易Cコンパイラ)
-さてここからが本気です(笑)。
-実は p0008a.c 内で使っている自作プリプロセッサは、普通の...
-これは acl4 ライブラリのプリプロセッサ関数が標準で持って...
-これを使って何ができるかと考えて、今回はCコンパイラを作...
-''[p0007e.txt]:''
int i, j; // 素数を表示するプログラム.
for (i = 2; i < 100; i++) {
for (j = 2; j * j <= i; j++) {
if (i % j == 0) goto skip;
}
printf("%d ", i);
skip: ;
}
printf("\n");
-コンパイルしてみます。
>p0008a cc:1 src:p0007e.txt
ADD(ESP,-4096);
MOV(DWORD [ESP+(23)*4+1024],2);
JMP(L4);
LABEL(L2:);
MOV(DWORD [ESP+(24)*4+1024],2);
JMP(L8);
LABEL(L6:);
MOV(EAX,[ESP+(23)*4+1024]); CDQ(); IDIV(DWORD [ESP+(24)*...
MOV(EAX,[ESP+(128)*4+1024]); CMP(EAX,0); SETE(AL); MOVZX...
MOV(EAX,[ESP+(129)*4+1024]); CMP(EAX,0); JNE(L22);
LABEL(L7:);
(以下略)
-こんな感じの出力が出てきます。全く最適化されていないので...
-ここで強調したいのは、出力コードの質の低さではなく、これ...
-p0008a.c のコード内で、Cコンパイラの処理は以下のように書...
1: if (strtol(getArg(argc, argv, "cc:", "0"), NULL, 0) !...
2: a_convVc_pp(vc0, vc1, 1 + 2 + 2 * 16, dbg, "[prep...
3: a_convVc_clang_clout(vc1, vc0, 1); if (dbg != 0) ...
4: VecChr_N(vc1) = 0; VecChr_printf(vc1, "Ent_III(25...
5: a_convVc_pp(vc1, vc0, 1 + 2 * 16, dbg, "[asm_a4vm...
6: a_convVc_pp(vc0, vc1, 1 + 2 * 16, dbg, "[asm_x86-...
7: a_convVc_pp(vc1, vc0, 1 + 2 * 16, 1, "%.*s\n", ...
8: }
-1行目と8行目は「cc:1になったときに以下を実行せよ」と言っ...
-2行目では、まず与えられたC言語のソースコードに対してプリ...
-3行目では、C言語の a=b+c; を Add(a, b, c); みたいな形式...
-5行目は、 a_convVc_clang_clout() の出力結果に、 conv_clo...
-6行目は、5行目の出力結果に、 conv_a4vm_asmX86Bit32Typ0.h...
-7行目は、6行目の出力結果に、 conv_asmX86Bit32Typ0_Typ1.h...
-つまりC言語で書かれたの関数(今は170行くらい)を一度呼ん...
-C言語を作ったことがあればわかるのですが、これは結構衝撃...
-なお、もし変換の中間結果に関心がなければ、最後の3回のプ...
** (5) プログラム p0008a.c について #3 (C言語JITコンパイ...
-せっかくコンパイルできたのですから、これをアセンブルして...
-まずは先の p0007e.txt がきちんと動くか確かめてみます。
>p0008a cjit:1 src:p0007e.txt
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 ...
-このようにうまくいきます。
-p0008a.c のコード内で、C言語JITコンパイラの処理は以下の...
1: if (strtol(getArg(argc, argv, "cjit:", "0"), NULL, 0...
2: a_convVc_pp(vc0, vc1, 1 + 2 + 2 * 16, dbg, "[pre...
3: a_convVc_clang_clout(vc1, vc0, 1); if (dbg != 0)...
4: VecChr_N(vc1) = 0; VecChr_printf(vc1, "Ent_III(2...
5: a_convVc_pp(vc1, vc0, 1 + 2 * 16, dbg, "[asm_a4v...
6: a_convVc_pp(vc0, vc1, 1 + 2 * 16, dbg, "[asm_x86...
7: a_convVc_pp(vc1, vc0, 1 + 2 * 16, dbg, "[asm_db]...
8: intptr_t bn = a_conv_asmDb_bin(vc0->p, VecChr_N(...
9: if (bn > 0) {
10: if (dbg != 0) { printf("[binary]\n"); hexDum...
11: void (*pf)(); pf = (void (*)()) bin; pf();
12: }
13: }
-1行目から6行目までは cc:1 の時と全く同じです。
-7行目ではプリプロセッサを使ってアセンブルをしています。...
DB(0x81); DB(0xC0+4); DD(-4096);
DB(0xC7); DB(0x84); DB(0x24); DD((23)*4+1024); DD(2);
DB(0xE9); DD_L(4, 1, -4);
LBL(2);
DB(0xC7); DB(0x84); DB(0x24); DD((24)*4+1024); DD(2);
DB(0xE9); DD_L(8, 1, -4);
LBL(6);
(以下略)
-アセンブラが46行で書けるというは、非常にくるっています(...
#define RET() DB(0xC3)
#define CDQ() DB(0x99)
#define PUSH_R(r) DB(0x50+r)
#define POP_R(r) DB(0x58+r)
#define PUSH_I(i) DB(0x68); DD(i)
#define CALL_I(i) DB(0xE8); DD_R(i-4)
#define ADD_RI(r,i) DB(0x81, 0xC0+r); DD(i)
#define SUB_RI(r,i) DB(0x81, 0xC0+r+5*8); DD(i)
#define CMP_RI(r,i) DB(0x81, 0xC0+r+7*8); DD(i)
#define IMUL_RI(r,i) DB(0x69, 0xC0+r*9); DD(i)
#define MOV_RI(r,i) DB(0xB8+r); DD(i)
#define SHL_RI(r,i) DB(0xC1, 0xC0+r+4*8, i)
#define SAR_RI(r,i) DB(0xC1, 0xC0+r+7*8, i)
#define JMP_T(t) DB(0xE9); DD_L(t, 1, -4)
#define JNE_T(t) DB(0x0F, 0x85); DD_L(t, 1, -4)
(以下略)
-8行目では、このDB/DW/DDの列を実際のバイナリデータに変換...
-9行目以降で、生成した機械語の関数を呼び出して実行させて...
-嘘みたいに簡単にC言語のJITコンパイラができました。
-ここでは動作画面などは省略しますが、[[a4_p0007]]で例示し...
** (6) プログラム p0008a.c について #4 (C言語インタプリ...
-JITコンパイラが簡単に作れることはわかりました。でもCPUの...
-p0008a.c のコード内で、C言語インタプリタの処理は以下のよ...
1: if (strtol(getArg(argc, argv, "clang:", "0"), NULL, 0...
2: a_convVc_pp(vc0, vc1, 1 + 2 + 2 * 16, dbg, "[prep...
3: a_convVc_clang_clout(vc1, vc0, 1); if (dbg != 0) ...
4: VecChr_N(vc1) = 0; VecChr_printf(vc1, "Ent_III(25...
5: a_convVc_pp(vc1, vc0, 1 + 2 * 16, dbg, "[asm_a4vm...
6: a_convVc_pp(vc0, vc1, 1 + 2 * 16, dbg, "[asm_db]\...
7: intptr_t bn = a_conv_asmDb_bin(vc1->p, a_VecChr_N...
8: intptr_t a4arg[10]; a4arg[0] = 0; A4vm_exec0((int...
9: }
-ここでは動作画面などは省略しますが、[[a4_p0007]]で例示し...
** (7) 主張のまとめ
-プリプロセッサ関数があれば、プログラミング言語はこんなに...
--C言語コンパイラ・C言語JITコンパイラ・x86アセンブラ・C言...
-今回、 p0007b.txt ~ p0007h.txt が動かせればそれでよいと...
-将来C言語以外の言語を作る際も、 a4vm のアセンブラまで変...
-今回の p0008a.c が全部まぜこぜの all-in-one で実装されて...
|RIGHT: 8.0KB|(参考用) printf("hello, world\n"); のみのプ...
|RIGHT:23.5KB|Mode=0: ppのみ|
|RIGHT:28.0KB|Mode=1: pp+cc|
|RIGHT:30.0KB|Mode=2: pp+cc+cjit|
|RIGHT:35.5KB|Mode=3: pp+cc+cjit+clang|
|RIGHT:37.5KB|Mode=4: pp+cc+cjit+clang+calc+graphic(=全部)|
** (8) ダウンロード
-https://essen.osask.jp/files/a4_p0008.zip (55,887バイト)...
--ソースコード、サンプルプログラム、37.5KBの実行ファイル...
** (9) p0008a.c のソースコード
#define a_Version 1
#include <acl4v1.c>
#include <windows.h>
#include "a4_t0002.c"
#include "a4_t0003.c"
#define Mode 4
// 0:pp-only, 1:pp+cc, 2:pp+cc+cjit, 3:all-graphic 4:all
#if (Mode >= 4)
a_Win *win;
void openWin(intptr_t x, intptr_t y) { win = a_mallo...
void setPix(intptr_t x, intptr_t y, intptr_t c) { wi...
void flushWin() { a_Win_flushAll0(win); }
void waitInf() { if (win != NULL) { flushWin(); } fo...
#endif
int main(int argc, const char **argv)
{
const char *src = getArg(argc, argv, "src:", "");
int dbg = strtol(getArg(argc, argv, "dbg:", "0"), NU...
VecChr vc0[1], vc1[1]; VecChr_iniArg(_a_ vc0, src, 2...
#if (Mode >= 2)
static a_AsmDbConstTable tbl[5] = {
{ "printf", 0, 0, (intptr_t) printf },
#if (Mode >= 4)
{ "openWin", 0, 0, (intptr_t) openWin },
{ "setPix", 0, 0, (intptr_t) setPix },
{ "flushWin", 0, 0, (intptr_t) flushWin },
{ "waitInf", 0, 0, (intptr_t) waitInf },
#endif
};
intptr_t binSz = 64 * 1024; char *bin = a_malloc...
#endif
if (strtol(getArg(argc, argv, "pp:", "0"), NULL, 0) ...
int mod = strtol(getArg(argc, argv, "mod:", "1")...
a_convVc_pp(vc0, vc1, 1 + 2 + mod * 16, 1, "%.*s...
}
#if (Mode >= 1)
if (strtol(getArg(argc, argv, "cc:", "0"), NULL,...
a_convVc_pp(vc0, vc1, 1 + 2 + 2 * 16, dbg, "...
a_convVc_clang_clout(vc1, vc0, 1); if (dbg !...
VecChr_N(vc1) = 0; VecChr_printf(vc1, "Ent_I...
a_convVc_pp(vc1, vc0, 1 + 2 * 16, dbg, "[asm...
a_convVc_pp(vc0, vc1, 1 + 2 * 16, dbg, "[asm...
a_convVc_pp(vc1, vc0, 1 + 2 * 16, 1, "%.*s...
}
#endif
#if (Mode >= 2)
if (strtol(getArg(argc, argv, "cjit:", "0"), NUL...
a_convVc_pp(vc0, vc1, 1 + 2 + 2 * 16, dbg, "...
a_convVc_clang_clout(vc1, vc0, 1); if (dbg !...
VecChr_N(vc1) = 0; VecChr_printf(vc1, "Ent_I...
a_convVc_pp(vc1, vc0, 1 + 2 * 16, dbg, "[asm...
a_convVc_pp(vc0, vc1, 1 + 2 * 16, dbg, "[asm...
a_convVc_pp(vc1, vc0, 1 + 2 * 16, dbg, "[asm...
intptr_t bn = a_conv_asmDb_bin(vc0->p, VecCh...
if (bn > 0) {
if (dbg != 0) { printf("[binary]\n"); he...
void (*pf)(); pf = (void (*)()) bin; pf();
}
}
#endif
#if (Mode >= 3)
if (strtol(getArg(argc, argv, "clang:", "0"), NU...
a_convVc_pp(vc0, vc1, 1 + 2 + 2 * 16, dbg, "...
a_convVc_clang_clout(vc1, vc0, 1); if (dbg !...
VecChr_N(vc1) = 0; VecChr_printf(vc1, "Ent_I...
a_convVc_pp(vc1, vc0, 1 + 2 * 16, dbg, "[asm...
a_convVc_pp(vc0, vc1, 1 + 2 * 16, dbg, "[asm...
intptr_t bn = a_conv_asmDb_bin(vc1->p, a_Vec...
intptr_t a4arg[10]; a4arg[0] = 0; A4vm_exec0...
}
#endif
#if (Mode >= 4)
if (strtol(getArg(argc, argv, "calc:", "0"), NUL...
a_convVc_pp(vc0, vc1, 1 + 2 + 2 * 16, dbg, "...
Preprocessor_Eval ev[1]; Preprocessor_Eval_i...
Token0 t0[1]; Token0_ini1(t0); t0->s = vc1->...
for (;;) {
const char *t = Token1_get(t0);
if (t0->c == ',' || t0->c == ';') { prin...
if (t0->c == 0) break;
t0->s = t; intptr_t i = Preprocessor_eva...
if (ev->err != 0) break;
printf("%d", (int) i);
}
printf("\n"); Preprocessor_Eval_din(_a_ ev);
}
#endif
#if (Mode >= 2)
BufFree_flush(_a_ bf); BufFree_din(_a_ bf);
#endif
VecChr_din4(_a_ vc0, vc1, 0, 0);
a_malloc_debugList(_a); a_DbgObjInfTbl_debugList(_a);
return 0;
}
** (99) 更新履歴
-2026.05.04(月) 初版
終了行:
* acl4のプログラムのページ0008
-(by [[K]], 2026.05.04) ([[a4_i01]]: acl4 の目次...
** (1) プリプロセッサは善か悪か?(この部分は[[a4_p0007]]...
-私はかつてC言語のプリプロセッサのマクロが嫌いでした。関...
#define Square(x) (x)*(x)
-みたいなのがあると、xは二度評価されて、副作用があったり...
-こんなのやるくらいなら inline 関数を書いたほうがマシです。
-そもそも x * x って書けないところからして、許せないんで...
-まあ最適化が強くないコンパイラでも、関数呼び出しコードを...
~
-私は今はプリプロセッサが大好きです。プリプロセッサは世界...
** (2) プログラム p0008a.c について #0 (プリプロセッサ)...
-acl4 ライブラリを使って、プリプロセッサを作りました。acl...
-''[p0007b.txt]:''
#define Square(x) (x)*(x)
#define One 1
#define Two 2
#define Three 3
#define Four 4
#define Five 5
#define Six 6
#define Seven 7
#define Eight 8
#define Nine 9
#define Ten 10
#define Eleven 11
#define Twelve 12
#if (Square(2+3)!=11)
Square(Three + Seven)
#endif
-これをプリプロセッサにかけるとこうなります。
>p0008a pp:1 src:p0007b.txt
#line 14 "p0007b.txt"
(3 + 7)*(3 + 7)
-もし #line を出力しないでほしければ、こうします。
>p0008a pp:1 src:p0007b.txt mod:2
(3 + 7)*(3 + 7)
** (3) プログラム p0008a.c について #1 (コマンドライン計...
-プリプロセッサでは #if で式の値を計算する必要があります...
-せっかくなので、それを使ってやろうと考えました。ファイル...
>p0008a calc:1 src:inline:1+2+3+4+5+6+7+8+9+10
55
-結局中身はプリプロセッサなので、#defineとかが混ざってい...
>p0008a calc:1 src:p0007b.txt
100
-だから計算機プログラムとしては、ちょっと多機能です(笑)。
** (4) プログラム p0008a.c について #2 (簡易Cコンパイラ)
-さてここからが本気です(笑)。
-実は p0008a.c 内で使っている自作プリプロセッサは、普通の...
-これは acl4 ライブラリのプリプロセッサ関数が標準で持って...
-これを使って何ができるかと考えて、今回はCコンパイラを作...
-''[p0007e.txt]:''
int i, j; // 素数を表示するプログラム.
for (i = 2; i < 100; i++) {
for (j = 2; j * j <= i; j++) {
if (i % j == 0) goto skip;
}
printf("%d ", i);
skip: ;
}
printf("\n");
-コンパイルしてみます。
>p0008a cc:1 src:p0007e.txt
ADD(ESP,-4096);
MOV(DWORD [ESP+(23)*4+1024],2);
JMP(L4);
LABEL(L2:);
MOV(DWORD [ESP+(24)*4+1024],2);
JMP(L8);
LABEL(L6:);
MOV(EAX,[ESP+(23)*4+1024]); CDQ(); IDIV(DWORD [ESP+(24)*...
MOV(EAX,[ESP+(128)*4+1024]); CMP(EAX,0); SETE(AL); MOVZX...
MOV(EAX,[ESP+(129)*4+1024]); CMP(EAX,0); JNE(L22);
LABEL(L7:);
(以下略)
-こんな感じの出力が出てきます。全く最適化されていないので...
-ここで強調したいのは、出力コードの質の低さではなく、これ...
-p0008a.c のコード内で、Cコンパイラの処理は以下のように書...
1: if (strtol(getArg(argc, argv, "cc:", "0"), NULL, 0) !...
2: a_convVc_pp(vc0, vc1, 1 + 2 + 2 * 16, dbg, "[prep...
3: a_convVc_clang_clout(vc1, vc0, 1); if (dbg != 0) ...
4: VecChr_N(vc1) = 0; VecChr_printf(vc1, "Ent_III(25...
5: a_convVc_pp(vc1, vc0, 1 + 2 * 16, dbg, "[asm_a4vm...
6: a_convVc_pp(vc0, vc1, 1 + 2 * 16, dbg, "[asm_x86-...
7: a_convVc_pp(vc1, vc0, 1 + 2 * 16, 1, "%.*s\n", ...
8: }
-1行目と8行目は「cc:1になったときに以下を実行せよ」と言っ...
-2行目では、まず与えられたC言語のソースコードに対してプリ...
-3行目では、C言語の a=b+c; を Add(a, b, c); みたいな形式...
-5行目は、 a_convVc_clang_clout() の出力結果に、 conv_clo...
-6行目は、5行目の出力結果に、 conv_a4vm_asmX86Bit32Typ0.h...
-7行目は、6行目の出力結果に、 conv_asmX86Bit32Typ0_Typ1.h...
-つまりC言語で書かれたの関数(今は170行くらい)を一度呼ん...
-C言語を作ったことがあればわかるのですが、これは結構衝撃...
-なお、もし変換の中間結果に関心がなければ、最後の3回のプ...
** (5) プログラム p0008a.c について #3 (C言語JITコンパイ...
-せっかくコンパイルできたのですから、これをアセンブルして...
-まずは先の p0007e.txt がきちんと動くか確かめてみます。
>p0008a cjit:1 src:p0007e.txt
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 ...
-このようにうまくいきます。
-p0008a.c のコード内で、C言語JITコンパイラの処理は以下の...
1: if (strtol(getArg(argc, argv, "cjit:", "0"), NULL, 0...
2: a_convVc_pp(vc0, vc1, 1 + 2 + 2 * 16, dbg, "[pre...
3: a_convVc_clang_clout(vc1, vc0, 1); if (dbg != 0)...
4: VecChr_N(vc1) = 0; VecChr_printf(vc1, "Ent_III(2...
5: a_convVc_pp(vc1, vc0, 1 + 2 * 16, dbg, "[asm_a4v...
6: a_convVc_pp(vc0, vc1, 1 + 2 * 16, dbg, "[asm_x86...
7: a_convVc_pp(vc1, vc0, 1 + 2 * 16, dbg, "[asm_db]...
8: intptr_t bn = a_conv_asmDb_bin(vc0->p, VecChr_N(...
9: if (bn > 0) {
10: if (dbg != 0) { printf("[binary]\n"); hexDum...
11: void (*pf)(); pf = (void (*)()) bin; pf();
12: }
13: }
-1行目から6行目までは cc:1 の時と全く同じです。
-7行目ではプリプロセッサを使ってアセンブルをしています。...
DB(0x81); DB(0xC0+4); DD(-4096);
DB(0xC7); DB(0x84); DB(0x24); DD((23)*4+1024); DD(2);
DB(0xE9); DD_L(4, 1, -4);
LBL(2);
DB(0xC7); DB(0x84); DB(0x24); DD((24)*4+1024); DD(2);
DB(0xE9); DD_L(8, 1, -4);
LBL(6);
(以下略)
-アセンブラが46行で書けるというは、非常にくるっています(...
#define RET() DB(0xC3)
#define CDQ() DB(0x99)
#define PUSH_R(r) DB(0x50+r)
#define POP_R(r) DB(0x58+r)
#define PUSH_I(i) DB(0x68); DD(i)
#define CALL_I(i) DB(0xE8); DD_R(i-4)
#define ADD_RI(r,i) DB(0x81, 0xC0+r); DD(i)
#define SUB_RI(r,i) DB(0x81, 0xC0+r+5*8); DD(i)
#define CMP_RI(r,i) DB(0x81, 0xC0+r+7*8); DD(i)
#define IMUL_RI(r,i) DB(0x69, 0xC0+r*9); DD(i)
#define MOV_RI(r,i) DB(0xB8+r); DD(i)
#define SHL_RI(r,i) DB(0xC1, 0xC0+r+4*8, i)
#define SAR_RI(r,i) DB(0xC1, 0xC0+r+7*8, i)
#define JMP_T(t) DB(0xE9); DD_L(t, 1, -4)
#define JNE_T(t) DB(0x0F, 0x85); DD_L(t, 1, -4)
(以下略)
-8行目では、このDB/DW/DDの列を実際のバイナリデータに変換...
-9行目以降で、生成した機械語の関数を呼び出して実行させて...
-嘘みたいに簡単にC言語のJITコンパイラができました。
-ここでは動作画面などは省略しますが、[[a4_p0007]]で例示し...
** (6) プログラム p0008a.c について #4 (C言語インタプリ...
-JITコンパイラが簡単に作れることはわかりました。でもCPUの...
-p0008a.c のコード内で、C言語インタプリタの処理は以下のよ...
1: if (strtol(getArg(argc, argv, "clang:", "0"), NULL, 0...
2: a_convVc_pp(vc0, vc1, 1 + 2 + 2 * 16, dbg, "[prep...
3: a_convVc_clang_clout(vc1, vc0, 1); if (dbg != 0) ...
4: VecChr_N(vc1) = 0; VecChr_printf(vc1, "Ent_III(25...
5: a_convVc_pp(vc1, vc0, 1 + 2 * 16, dbg, "[asm_a4vm...
6: a_convVc_pp(vc0, vc1, 1 + 2 * 16, dbg, "[asm_db]\...
7: intptr_t bn = a_conv_asmDb_bin(vc1->p, a_VecChr_N...
8: intptr_t a4arg[10]; a4arg[0] = 0; A4vm_exec0((int...
9: }
-ここでは動作画面などは省略しますが、[[a4_p0007]]で例示し...
** (7) 主張のまとめ
-プリプロセッサ関数があれば、プログラミング言語はこんなに...
--C言語コンパイラ・C言語JITコンパイラ・x86アセンブラ・C言...
-今回、 p0007b.txt ~ p0007h.txt が動かせればそれでよいと...
-将来C言語以外の言語を作る際も、 a4vm のアセンブラまで変...
-今回の p0008a.c が全部まぜこぜの all-in-one で実装されて...
|RIGHT: 8.0KB|(参考用) printf("hello, world\n"); のみのプ...
|RIGHT:23.5KB|Mode=0: ppのみ|
|RIGHT:28.0KB|Mode=1: pp+cc|
|RIGHT:30.0KB|Mode=2: pp+cc+cjit|
|RIGHT:35.5KB|Mode=3: pp+cc+cjit+clang|
|RIGHT:37.5KB|Mode=4: pp+cc+cjit+clang+calc+graphic(=全部)|
** (8) ダウンロード
-https://essen.osask.jp/files/a4_p0008.zip (55,887バイト)...
--ソースコード、サンプルプログラム、37.5KBの実行ファイル...
** (9) p0008a.c のソースコード
#define a_Version 1
#include <acl4v1.c>
#include <windows.h>
#include "a4_t0002.c"
#include "a4_t0003.c"
#define Mode 4
// 0:pp-only, 1:pp+cc, 2:pp+cc+cjit, 3:all-graphic 4:all
#if (Mode >= 4)
a_Win *win;
void openWin(intptr_t x, intptr_t y) { win = a_mallo...
void setPix(intptr_t x, intptr_t y, intptr_t c) { wi...
void flushWin() { a_Win_flushAll0(win); }
void waitInf() { if (win != NULL) { flushWin(); } fo...
#endif
int main(int argc, const char **argv)
{
const char *src = getArg(argc, argv, "src:", "");
int dbg = strtol(getArg(argc, argv, "dbg:", "0"), NU...
VecChr vc0[1], vc1[1]; VecChr_iniArg(_a_ vc0, src, 2...
#if (Mode >= 2)
static a_AsmDbConstTable tbl[5] = {
{ "printf", 0, 0, (intptr_t) printf },
#if (Mode >= 4)
{ "openWin", 0, 0, (intptr_t) openWin },
{ "setPix", 0, 0, (intptr_t) setPix },
{ "flushWin", 0, 0, (intptr_t) flushWin },
{ "waitInf", 0, 0, (intptr_t) waitInf },
#endif
};
intptr_t binSz = 64 * 1024; char *bin = a_malloc...
#endif
if (strtol(getArg(argc, argv, "pp:", "0"), NULL, 0) ...
int mod = strtol(getArg(argc, argv, "mod:", "1")...
a_convVc_pp(vc0, vc1, 1 + 2 + mod * 16, 1, "%.*s...
}
#if (Mode >= 1)
if (strtol(getArg(argc, argv, "cc:", "0"), NULL,...
a_convVc_pp(vc0, vc1, 1 + 2 + 2 * 16, dbg, "...
a_convVc_clang_clout(vc1, vc0, 1); if (dbg !...
VecChr_N(vc1) = 0; VecChr_printf(vc1, "Ent_I...
a_convVc_pp(vc1, vc0, 1 + 2 * 16, dbg, "[asm...
a_convVc_pp(vc0, vc1, 1 + 2 * 16, dbg, "[asm...
a_convVc_pp(vc1, vc0, 1 + 2 * 16, 1, "%.*s...
}
#endif
#if (Mode >= 2)
if (strtol(getArg(argc, argv, "cjit:", "0"), NUL...
a_convVc_pp(vc0, vc1, 1 + 2 + 2 * 16, dbg, "...
a_convVc_clang_clout(vc1, vc0, 1); if (dbg !...
VecChr_N(vc1) = 0; VecChr_printf(vc1, "Ent_I...
a_convVc_pp(vc1, vc0, 1 + 2 * 16, dbg, "[asm...
a_convVc_pp(vc0, vc1, 1 + 2 * 16, dbg, "[asm...
a_convVc_pp(vc1, vc0, 1 + 2 * 16, dbg, "[asm...
intptr_t bn = a_conv_asmDb_bin(vc0->p, VecCh...
if (bn > 0) {
if (dbg != 0) { printf("[binary]\n"); he...
void (*pf)(); pf = (void (*)()) bin; pf();
}
}
#endif
#if (Mode >= 3)
if (strtol(getArg(argc, argv, "clang:", "0"), NU...
a_convVc_pp(vc0, vc1, 1 + 2 + 2 * 16, dbg, "...
a_convVc_clang_clout(vc1, vc0, 1); if (dbg !...
VecChr_N(vc1) = 0; VecChr_printf(vc1, "Ent_I...
a_convVc_pp(vc1, vc0, 1 + 2 * 16, dbg, "[asm...
a_convVc_pp(vc0, vc1, 1 + 2 * 16, dbg, "[asm...
intptr_t bn = a_conv_asmDb_bin(vc1->p, a_Vec...
intptr_t a4arg[10]; a4arg[0] = 0; A4vm_exec0...
}
#endif
#if (Mode >= 4)
if (strtol(getArg(argc, argv, "calc:", "0"), NUL...
a_convVc_pp(vc0, vc1, 1 + 2 + 2 * 16, dbg, "...
Preprocessor_Eval ev[1]; Preprocessor_Eval_i...
Token0 t0[1]; Token0_ini1(t0); t0->s = vc1->...
for (;;) {
const char *t = Token1_get(t0);
if (t0->c == ',' || t0->c == ';') { prin...
if (t0->c == 0) break;
t0->s = t; intptr_t i = Preprocessor_eva...
if (ev->err != 0) break;
printf("%d", (int) i);
}
printf("\n"); Preprocessor_Eval_din(_a_ ev);
}
#endif
#if (Mode >= 2)
BufFree_flush(_a_ bf); BufFree_din(_a_ bf);
#endif
VecChr_din4(_a_ vc0, vc1, 0, 0);
a_malloc_debugList(_a); a_DbgObjInfTbl_debugList(_a);
return 0;
}
** (99) 更新履歴
-2026.05.04(月) 初版
ページ名: