* 川合のプログラミング言語自作のためのテキスト#0005 -(by [[K]], 2019.02.25) ** (10) TJ-02 -JITコンパイラの説明をすると言っておきながら、TJ-01は結局は普通のインタプリタでした。 -実はここで示すTJ-02もまだ普通のインタプリタです。期待させてごめんなさい。 -ここではwhileとtimeを追加しています。ただしwhileの書き方はカッコを省略して書くようにしています。これは高速化のためです。 #include <stdio.h> #include <stdlib.h> #include <time.h> void loadText(int argc, const char **argv, unsigned char *t, int siz) → TL-1と同じなので省略 int var[256]; // 変数. unsigned char txt[10000]; // ソースコード. int pc = 0; // プログラムカウンタ. int getNumber() → TJ-01と同じなので省略 int main(int argc, const char **argv) { int i, j, pc0, wpc = 0; loadText(argc, argv, txt, 10000); for (;;) { pc0 = pc; if (txt[pc] == 0) // ファイル終端. exit(0); if (txt[pc] == '\n' || txt[pc] == ' ' || txt[pc] == '\t' || txt[pc] == ';') { // 空行など. pc++; } else if (txt[pc + 1] == '=') { → TJ-01と同じなので省略 } else if (txt[pc] == 'p' && txt[pc + 1] == 'r' && txt[pc + 5] == ' ') { // 最初の2文字しか調べてない(手抜き). pc += 6; printf("%d\n", getNumber()); } else if (txt[pc] == 'w' && txt[pc + 1] == 'h' && txt[pc + 5] == ' ' && txt[pc + 7] == '<') { // 最初の2文字しか調べてない(手抜き). wpc = pc; i = var[txt[pc + 6]]; // 変数の値. pc += 8; j = getNumber(); if (txt[pc] != '{') goto err; pc++; if (i >= j) { // 条件不成立なので } までを読み飛ばす. while (txt[pc] != 0 && txt[pc] != '}') pc++; if (txt[pc] == '}') pc++; } } else if (txt[pc] == '}') { pc = wpc; } else if (txt[pc] == 't' && txt[pc + 1] == 'i') { // 最初の2文字しか調べてない(手抜き). pc += 4; printf("time=%.3f[sec]\n", clock() / (double) CLOCKS_PER_SEC); } else goto err; } err: printf("syntax error : %.10s\n", &txt[pc0]); exit(1); } -このTJ-02は以下のプログラムを実行できます。1億回ループです。 i=0; while i<100000000{ i=i+1; } print i; time; -TL-3とくらべてどちらが速いでしょうか?当方の環境では何倍もTJ-02のほうが高速でした。変数名は1文字に限定されているし、構文がシンプルなので、より速いのだと思われます。美しくはないですけどね。 ** 次回に続く -次回: -次回: [[text0006]] *こめんと欄 #comment