text0016
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* 川合のプログラミング言語自作のためのテキスト第二版#0007
-(by [[K]], 2019.06.29)
** (14) TJ-03c
-TJ-03bではgccの速さに到達できなかったので、さらにもう一...
-TJ-03bとgccでは、機械語はこんな感じになっています(読み...
// TJ-03b.
MOV EBX,0
cont:
CMP EBX,100000000 // ループ処理.
JGE break; // ループ処理.
ADD EBX,1
JMP cont // ループ処理.
break:
(print i;の機械語)
(time;の機械語)
// gccの場合.
MOV EBX,0
cont:
ADD EBX,1
CMP EBX,100000000 // ループ処理.
JL cont // ループ処理.
break:
(print i;の機械語)
(time;の機械語)
-つまり、TJ-03bのレジスタ変数の導入によって i = i + 1; が...
-TJ-03aではループ処理は5命令でした。それがTJ-03bでは3命令...
-まずgccが内部で何をやっているのかを説明しましょう。gccは...
--[書き換え前] i = 0; while (i < 100000000) { i = i + 1; }
--[書き換え後] i = 0; do { i = i + 1; } while (i < 100000...
-まずこの書き換えによって処理内容に違いがないことを確認し...
-さてではなぜこの書き換えをするかですが、do~whileにする...
-ということでなぜgccがTJ-03bよりも高速になっているのかは...
-ではTJ-03cではどうしたらいいでしょうか。gccみたいに「書...
→ mainより前の部分はTJ-03bと同じなので省略
int main(int argc, const char **argv)
{
static String def[] = { ";", "=", "+", "-", "print",...
→ この部分もTJ-03bと同じなので省略
for (pc = 0; pc < pc1; pc++) {
if (varNum[pc + 1] == 1 /* = */) { // 2単語目が"...
→ この部分もTJ-03bと同じなので省略
} else if (varNum[pc] == 12 /* do */ && varNum[p...
wqc = qc;
pc++;
continue;
} else if (varNum[pc] == 10 /* } */ && varNum[pc...
if (varNum[pc + 3] == regvar && '0' <= varNa...
code[qc++] = 0x81;
code[qc++] = 0xc0 + 7 * 8 + EBX;
qc += put32(&code[qc], var[varNum[pc + 5...
} else {
if (varNum[pc + 3] == regvar || varNum[p...
code[qc++] = 0x8b; // MOV EAX,[...]
code[qc++] = EAX * 8 + 0x05;
qc += put32(&code[qc], (int) &var[varNum...
code[qc++] = 0x8b; // MOV ECX,[...]
code[qc++] = ECX * 8 + 0x05;
qc += put32(&code[qc], (int) &var[varNum...
code[qc++] = 0x39;
code[qc++] = 0xc8;
}
code[qc++] = 0x0f;
code[qc++] = 0x8c;
qc += put32(&code[qc], &code[wqc] - &code[qc...
} else if (varNum[pc] == 5 /* while */ && varNum...
→ この部分もTJ-03bと同じなので省略
} else if (varNum[pc] == 10 /* } */) {
→ この部分もTJ-03bと同じなので省略
} else if (varNum[pc] == 11 /* time */ && varNum...
→ この部分もTJ-03bと同じなので省略
} else if (varNum[pc] == 4 /* print */ && varNum...
→ この部分もTJ-03bと同じなので省略
} else
goto err;
while (varNum[pc] != 0 /* ; */)
pc++;
}
→ この部分もTJ-03bと同じなので省略
}
-do~whileを使った1億回ループのサンプルプログラムを以下に...
i = 0;
do {
i = i + 1;
} while (i < 100000000);
print i;
time;
** 次回に続く
-次回: [[text0017]]
*こめんと欄
#comment
終了行:
* 川合のプログラミング言語自作のためのテキスト第二版#0007
-(by [[K]], 2019.06.29)
** (14) TJ-03c
-TJ-03bではgccの速さに到達できなかったので、さらにもう一...
-TJ-03bとgccでは、機械語はこんな感じになっています(読み...
// TJ-03b.
MOV EBX,0
cont:
CMP EBX,100000000 // ループ処理.
JGE break; // ループ処理.
ADD EBX,1
JMP cont // ループ処理.
break:
(print i;の機械語)
(time;の機械語)
// gccの場合.
MOV EBX,0
cont:
ADD EBX,1
CMP EBX,100000000 // ループ処理.
JL cont // ループ処理.
break:
(print i;の機械語)
(time;の機械語)
-つまり、TJ-03bのレジスタ変数の導入によって i = i + 1; が...
-TJ-03aではループ処理は5命令でした。それがTJ-03bでは3命令...
-まずgccが内部で何をやっているのかを説明しましょう。gccは...
--[書き換え前] i = 0; while (i < 100000000) { i = i + 1; }
--[書き換え後] i = 0; do { i = i + 1; } while (i < 100000...
-まずこの書き換えによって処理内容に違いがないことを確認し...
-さてではなぜこの書き換えをするかですが、do~whileにする...
-ということでなぜgccがTJ-03bよりも高速になっているのかは...
-ではTJ-03cではどうしたらいいでしょうか。gccみたいに「書...
→ mainより前の部分はTJ-03bと同じなので省略
int main(int argc, const char **argv)
{
static String def[] = { ";", "=", "+", "-", "print",...
→ この部分もTJ-03bと同じなので省略
for (pc = 0; pc < pc1; pc++) {
if (varNum[pc + 1] == 1 /* = */) { // 2単語目が"...
→ この部分もTJ-03bと同じなので省略
} else if (varNum[pc] == 12 /* do */ && varNum[p...
wqc = qc;
pc++;
continue;
} else if (varNum[pc] == 10 /* } */ && varNum[pc...
if (varNum[pc + 3] == regvar && '0' <= varNa...
code[qc++] = 0x81;
code[qc++] = 0xc0 + 7 * 8 + EBX;
qc += put32(&code[qc], var[varNum[pc + 5...
} else {
if (varNum[pc + 3] == regvar || varNum[p...
code[qc++] = 0x8b; // MOV EAX,[...]
code[qc++] = EAX * 8 + 0x05;
qc += put32(&code[qc], (int) &var[varNum...
code[qc++] = 0x8b; // MOV ECX,[...]
code[qc++] = ECX * 8 + 0x05;
qc += put32(&code[qc], (int) &var[varNum...
code[qc++] = 0x39;
code[qc++] = 0xc8;
}
code[qc++] = 0x0f;
code[qc++] = 0x8c;
qc += put32(&code[qc], &code[wqc] - &code[qc...
} else if (varNum[pc] == 5 /* while */ && varNum...
→ この部分もTJ-03bと同じなので省略
} else if (varNum[pc] == 10 /* } */) {
→ この部分もTJ-03bと同じなので省略
} else if (varNum[pc] == 11 /* time */ && varNum...
→ この部分もTJ-03bと同じなので省略
} else if (varNum[pc] == 4 /* print */ && varNum...
→ この部分もTJ-03bと同じなので省略
} else
goto err;
while (varNum[pc] != 0 /* ; */)
pc++;
}
→ この部分もTJ-03bと同じなので省略
}
-do~whileを使った1億回ループのサンプルプログラムを以下に...
i = 0;
do {
i = i + 1;
} while (i < 100000000);
print i;
time;
** 次回に続く
-次回: [[text0017]]
*こめんと欄
#comment
ページ名: