text0008
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* 川合のプログラミング言語自作のためのテキスト#0008
-(by [[K]], 2019.05.07)
** (15) TJ-21
-TJ-20ではC言語の速さに到達できなかったので、さらにもう一...
-TJ-20とC言語では、機械語はこんな感じになっています(読み...
// TJ-20.
MOV EDX,0
cont:
MOV EAX,EDX
MOV ECX,100000000
CMP EAX,ECX
JGE break;
ADD EDX,1
JMP cont
break:
(print i;の機械語)
(time;の機械語)
// C言語の場合.
MOV EDX,0
cont:
ADD EDX,1
CMP EDX,100000000
JL cont
break:
(print i;の機械語)
(time;の機械語)
-つまり、TJ-20のレジスタ変数の導入によってi=i+1;が4命令か...
-TJ-03ではループ処理は9命令でした。それがTJ-20では6命令に...
-まずC言語が内部で何をやっているのかを説明しましょう。C言...
--[書き換え前] i=0; while(i<100000000){ i=i+1; }
--[書き換え後] i=0; do{ i=i+1; }while(i<100000000);
-まずこの書き換えによって処理内容に違いがないことを確認し...
-さてではなぜこの書き換えをするかですが、do~whileにする...
-ということでなぜC言語がTJ-20よりも高速になっているのかは...
-ではTJ-21ではどうしたらいいでしょうか。C言語みたいに「書...
→この部分はTJ-20と同じなので省略
int main(int argc, const char **argv)
{
→この部分はTJ-20と同じなので省略
for (;;) {
pc0 = pc;
if (txt[pc] == 0) // ファイル終端.
break;
if (txt[pc] == REGVAR && txt[pc + 1] == '=') { /...
→この部分はTJ-20と同じなので省略
}
if (txt[pc] == '\n' || txt[pc] == ' ' || txt[pc]...
pc++;
} else if (txt[pc + 1] == '=') { // 2文字目が"=".
→この部分はTJ-20と同じなので省略
} else if (txt[pc] == 'p' && txt[pc + 1] == 'r' &...
→この部分はTJ-20と同じなので省略
} else if (txt[pc] == 'd' && txt[pc + 1] == 'o' &...
wqc = qc;
pc += 3;
} else if (txt[pc] == '}' && txt[pc + 1] == 'w') ...
pc += 7;
if (txt[pc] == REGVAR && isNumber(txt[pc + 2...
pc += 2;
code[qc++] = 0x81; // CMP EDX,const.
code[qc++] = 0xf8 + EDX;
getNumberSub();
} else {
getNumber(EAX); // 1文字の変数名.
pc++;
getNumber(ECX);
code[qc++] = 0x39; // CMP EAX,ECX.
code[qc++] = 0xc8;
}
code[qc++] = 0x0f; // JGE ????
code[qc++] = 0x8c;
put32(wqc - (qc + 4));
} else if (txt[pc] == 'w' && txt[pc + 1] == 'h' ...
→この部分はTJ-20と同じなので省略
} else if (txt[pc] == '}') {
→この部分はTJ-20と同じなので省略
} else if (txt[pc] == 't' && txt[pc + 1] == 'i')...
→この部分はTJ-20と同じなので省略
} else
goto err;
}
→この部分はTJ-20と同じなので省略
}
-書き足したのは、 do{ と }w だけです。ここで一つだけ注意...
-実行するプログラムの方はこんな感じになります。
i=0;
do{
i=i+1;
}while i<100000000;
print i;
time;
** (16) 速度比較
-この単純1億回ループについて、当方の環境での速度を記録し...
|TL-3|38.44秒||
|TJ-02|9.824秒||
|TJ-03|0.169秒||
|TJ-20|0.061秒||
|TJ-21|0.032秒|do{~}whileを使用|
|gcc|0.029秒|参考用, 最適化レベルは最強|
-TJ-21はまだgccには追い付いていませんが、それはループの処...
-これは遅いと思うかもしれませんが、gccはwhileを使った1億...
-ということでループ回数を増やしたりしてより重い処理内容に...
-TJ-21はもうコンパイルなしでコンパイラ並みの速度が出るわ...
-ここまでいろいろと妥協はしてきましたが、しかしそれでもTJ...
** 次回に続く
-次回: (この先にJCKライブラリを利用した話を予定していま...
*こめんと欄
#comment
終了行:
* 川合のプログラミング言語自作のためのテキスト#0008
-(by [[K]], 2019.05.07)
** (15) TJ-21
-TJ-20ではC言語の速さに到達できなかったので、さらにもう一...
-TJ-20とC言語では、機械語はこんな感じになっています(読み...
// TJ-20.
MOV EDX,0
cont:
MOV EAX,EDX
MOV ECX,100000000
CMP EAX,ECX
JGE break;
ADD EDX,1
JMP cont
break:
(print i;の機械語)
(time;の機械語)
// C言語の場合.
MOV EDX,0
cont:
ADD EDX,1
CMP EDX,100000000
JL cont
break:
(print i;の機械語)
(time;の機械語)
-つまり、TJ-20のレジスタ変数の導入によってi=i+1;が4命令か...
-TJ-03ではループ処理は9命令でした。それがTJ-20では6命令に...
-まずC言語が内部で何をやっているのかを説明しましょう。C言...
--[書き換え前] i=0; while(i<100000000){ i=i+1; }
--[書き換え後] i=0; do{ i=i+1; }while(i<100000000);
-まずこの書き換えによって処理内容に違いがないことを確認し...
-さてではなぜこの書き換えをするかですが、do~whileにする...
-ということでなぜC言語がTJ-20よりも高速になっているのかは...
-ではTJ-21ではどうしたらいいでしょうか。C言語みたいに「書...
→この部分はTJ-20と同じなので省略
int main(int argc, const char **argv)
{
→この部分はTJ-20と同じなので省略
for (;;) {
pc0 = pc;
if (txt[pc] == 0) // ファイル終端.
break;
if (txt[pc] == REGVAR && txt[pc + 1] == '=') { /...
→この部分はTJ-20と同じなので省略
}
if (txt[pc] == '\n' || txt[pc] == ' ' || txt[pc]...
pc++;
} else if (txt[pc + 1] == '=') { // 2文字目が"=".
→この部分はTJ-20と同じなので省略
} else if (txt[pc] == 'p' && txt[pc + 1] == 'r' &...
→この部分はTJ-20と同じなので省略
} else if (txt[pc] == 'd' && txt[pc + 1] == 'o' &...
wqc = qc;
pc += 3;
} else if (txt[pc] == '}' && txt[pc + 1] == 'w') ...
pc += 7;
if (txt[pc] == REGVAR && isNumber(txt[pc + 2...
pc += 2;
code[qc++] = 0x81; // CMP EDX,const.
code[qc++] = 0xf8 + EDX;
getNumberSub();
} else {
getNumber(EAX); // 1文字の変数名.
pc++;
getNumber(ECX);
code[qc++] = 0x39; // CMP EAX,ECX.
code[qc++] = 0xc8;
}
code[qc++] = 0x0f; // JGE ????
code[qc++] = 0x8c;
put32(wqc - (qc + 4));
} else if (txt[pc] == 'w' && txt[pc + 1] == 'h' ...
→この部分はTJ-20と同じなので省略
} else if (txt[pc] == '}') {
→この部分はTJ-20と同じなので省略
} else if (txt[pc] == 't' && txt[pc + 1] == 'i')...
→この部分はTJ-20と同じなので省略
} else
goto err;
}
→この部分はTJ-20と同じなので省略
}
-書き足したのは、 do{ と }w だけです。ここで一つだけ注意...
-実行するプログラムの方はこんな感じになります。
i=0;
do{
i=i+1;
}while i<100000000;
print i;
time;
** (16) 速度比較
-この単純1億回ループについて、当方の環境での速度を記録し...
|TL-3|38.44秒||
|TJ-02|9.824秒||
|TJ-03|0.169秒||
|TJ-20|0.061秒||
|TJ-21|0.032秒|do{~}whileを使用|
|gcc|0.029秒|参考用, 最適化レベルは最強|
-TJ-21はまだgccには追い付いていませんが、それはループの処...
-これは遅いと思うかもしれませんが、gccはwhileを使った1億...
-ということでループ回数を増やしたりしてより重い処理内容に...
-TJ-21はもうコンパイルなしでコンパイラ並みの速度が出るわ...
-ここまでいろいろと妥協はしてきましたが、しかしそれでもTJ...
** 次回に続く
-次回: (この先にJCKライブラリを利用した話を予定していま...
*こめんと欄
#comment
ページ名: