a21_txt01_6a
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* [[a21_txt01_6]]の補足説明#1
-(by [[K]], 2021.03.08)
** (0)
-これは[[「川合のプログラミング言語自作のためのテキスト第...
** (1) ループ命令の追加でどこまで速くなるか?
-HL-6は結構高速で、10億回ループの速度ではgcc比で''13.2倍'...
-x86の機械語にはLOOP命令というのがあります。LOOP命令は、E...
-では、HL-6に似たような命令を追加したとしたらどうでしょう...
-変更箇所を中心に書きます。
enum { OpCpy = 0, OpAdd, OpSub, OpPrint, OpGoto, OpJeq, ...
int compile(String s)
{
(中略)
for (pc = 0; pc < pc1; ) { // コンパイル開始.
if (phrCmp( 1, "!!*0 = !!*1;", pc)) { // 単純代入.
putIc(OpCpy, &var[tc[wpc[0]]], &var[tc[wpc[...
+ } else if (phrCmp(10, "!!*0 = !!*1 + 1; if (!!*2...
+ putIc(OpLop, &var[tc[wpc[4]]], &var[tc[wpc[0...
} else if (phrCmp( 9, "!!*0 = !!*1 + 1;", pc) &&...
putIc(OpAdd1, &var[tc[wpc[0]]], 0, 0, 0);
(中略)
for (icq = ic; icq < icq1; icq += 5) { // goto先の...
i = (int) icq[0];
! if (OpGoto <= i && i <= OpLop) { // OpJgtをOpLop...
icq[1] = (IntP) (*icq[1] + ic);
}
}
(中略)
}
void exec()
{
clock_t t0 = clock();
IntP *icp = ic;
+ int i;
for (;;) {
switch ((int) icp[0]) {
(中略)
+ case OpLop:
+ i = *icp[2];
+ i++;
+ *icp[2] = i;
+ if (i < *icp[3]) {
+ icp = (IntP *) icp[1];
+ continue;
+ }
+ icp += 5;
+ continue;
}
}
}
-プログラムでは、LOOP命令を使うための新しい構文は用意しな...
-このため、HL-3用のサンプルプログラムは無修正でも適用され...
-さてその速さは・・・gcc比で''5.5倍''まで高速化できました!
** (2) なぜこんなに効果があったのか?
-それはつまり、icpに加算してcontinueしてそしてswitchする...
-このことから教訓を得るとするなら、使用頻度が高いものにつ...
* こめんと欄
#comment
終了行:
* [[a21_txt01_6]]の補足説明#1
-(by [[K]], 2021.03.08)
** (0)
-これは[[「川合のプログラミング言語自作のためのテキスト第...
** (1) ループ命令の追加でどこまで速くなるか?
-HL-6は結構高速で、10億回ループの速度ではgcc比で''13.2倍'...
-x86の機械語にはLOOP命令というのがあります。LOOP命令は、E...
-では、HL-6に似たような命令を追加したとしたらどうでしょう...
-変更箇所を中心に書きます。
enum { OpCpy = 0, OpAdd, OpSub, OpPrint, OpGoto, OpJeq, ...
int compile(String s)
{
(中略)
for (pc = 0; pc < pc1; ) { // コンパイル開始.
if (phrCmp( 1, "!!*0 = !!*1;", pc)) { // 単純代入.
putIc(OpCpy, &var[tc[wpc[0]]], &var[tc[wpc[...
+ } else if (phrCmp(10, "!!*0 = !!*1 + 1; if (!!*2...
+ putIc(OpLop, &var[tc[wpc[4]]], &var[tc[wpc[0...
} else if (phrCmp( 9, "!!*0 = !!*1 + 1;", pc) &&...
putIc(OpAdd1, &var[tc[wpc[0]]], 0, 0, 0);
(中略)
for (icq = ic; icq < icq1; icq += 5) { // goto先の...
i = (int) icq[0];
! if (OpGoto <= i && i <= OpLop) { // OpJgtをOpLop...
icq[1] = (IntP) (*icq[1] + ic);
}
}
(中略)
}
void exec()
{
clock_t t0 = clock();
IntP *icp = ic;
+ int i;
for (;;) {
switch ((int) icp[0]) {
(中略)
+ case OpLop:
+ i = *icp[2];
+ i++;
+ *icp[2] = i;
+ if (i < *icp[3]) {
+ icp = (IntP *) icp[1];
+ continue;
+ }
+ icp += 5;
+ continue;
}
}
}
-プログラムでは、LOOP命令を使うための新しい構文は用意しな...
-このため、HL-3用のサンプルプログラムは無修正でも適用され...
-さてその速さは・・・gcc比で''5.5倍''まで高速化できました!
** (2) なぜこんなに効果があったのか?
-それはつまり、icpに加算してcontinueしてそしてswitchする...
-このことから教訓を得るとするなら、使用頻度が高いものにつ...
* こめんと欄
#comment
ページ名: