KEMURIコンパイラ
プログラミング言語 KEMURI の世界で最初の最適化コンパイラを作りました。
コンパイラのソースと実行
最適化の理屈は、まあ読めばわかるでしょう。
エラー処理はほとんど施していません。クラッシュさせようと思えば、簡単に出来てしまいます。
/* k2c.c */ #include <stdio.h> #include <string.h> #include <ctype.h> int main(int argc, char *argv[]) { printf("#include <stdio.h>\n"); printf("int main(int argc, char* argv[]) {\n"); char strage[1024] = {'\0'}; char c, *t; t = strage; while (c = getchar(), c != EOF) { char *h; h = t - 1; switch (c) { case '`': strcpy(t, "!dlrow ,olleH"); t += 13; break; case '~': *h = ~(*h); break; case '^': *(h - 1) ^= *h; *h = '\0'; t--; break; case '\"': *t = *h; t++; break; case '\'': *t = *(t - 1); *(t - 1) = *(t - 2); *(t - 2) = *(t - 3); *(t - 3) = *t; *t = '\0'; break; case '|': printf("printf(\""); while (t != strage && *(--t)) { putchar(isprint(*t)? *t: '.'); }; printf("\");\n"); break; default: break; } }; printf("putchar('\\n');\n"); printf("return 0;"); printf("}\n"); return 0; }
#!/bin/sh # kc - KEMURI Compiler script cat $1 | k2c > $1.tmp.c cc $1.tmp.c rm -f $1.tmp.c
% cc -o k2c k2c.c % cat hoge.kmr `|``| % kc hoge.kmr % ./a.out Hello, world!Hello, world!Hello, world! %