コンパイラ実装会(3)に参加してきた。

基本的にハッカソンのように個々人がもくもくと実装する会です。
運がよければ、すごい人の自作VMとか自作JITとか自作言語の発表が聞けちゃいます。
今回は、brainfuckのコード から Cのコード を生成して出力する node.jsのコードを作成しました。
brainfuckは、命令が8つしかないので、処理は簡単です。
以下は、コードと実行方法です。

brainfuck-ctrans.js

var fs = require('fs');

var out = "";
var code = fs.readFileSync('./data','utf-8');
out += '#include \n';
out += 'void main() {\n';
out += 'char m[30000];\n';
out += 'char* ptr = m;\n';

var arr = code.split('');
while(arr.length != 0){
    var c = arr.shift();
    switch (c) {
    case '>' : 
        out += '++ptr;\n';
        break;
    case '<' :
        out += '--ptr;\n';
        break;
    case '+' :
        out += '++(*ptr);\n';
        break;
    case '-' :
        out += '--(*ptr);\n';
        break;
    case '.' :
        out += 'putchar(*ptr);\n';
        break;
    case ',' :
        out += '*ptr = getchar();\n';
        break;
    case '[' :
        out += 'while(*ptr) {\n';
        break;
    case ']' :
        out += '}\n';
        break;
    default:
    }
}
out += '}\n';
fs.writeFileSync('./out.c',out,'utf-8');

data (brainfuckのHelloコード)

>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++
++>-]<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>
++++++++[<++++>-]<+.[-]++++++++++.

実行方法

  1. node brainfuck-ctrans.js
  2. gcc out.c 
  3. a.out

Hello World!
と、表示されます。(たぶん)

次は

次は、brainfuckのコード から アセンブラのコード を生成して出力する node.jsのコードを
作成します。