習得しなくてもいいGoogle Dart。コンパイラではない。
// Runner.dart interface Runner { String code, stdin, stdout; void execute(); }
// Barinfuck.dart #library('brainfuck'); #source('Runner.dart'); class Brainfuck implements Runner { final List<int> memory; String code, stdin = '', stdout = ''; int instructionPtr = 0, dataPtr = 0; Brainfuck() : memory = new List<int>(30000) { for (int i = 0; i < memory.length; ++i) memory[i] = 0; } void jumpToLoopEnd() { int count = 1; while (count > 0) { ++instructionPtr; switch (code[instructionPtr]) { case '[': ++count; break; case ']': --count; break; } } ++instructionPtr; } void jumpToLoopStart() { int count = 1; while (count > 0) { --instructionPtr; switch (code[instructionPtr]) { case '[': --count; break; case ']': ++count; break; } } } void step() { switch (code[instructionPtr]) { case '>': ++dataPtr; ++instructionPtr; break; case '<': --dataPtr; ++instructionPtr; break; case '+': ++memory[dataPtr]; ++instructionPtr; break; case '-': --memory[dataPtr]; ++instructionPtr; break; case '.': stdout = stdout.concat(new String.fromCharCodes([memory[dataPtr]])); ++instructionPtr; break; case ',': memory[dataPtr] = stdin.charCodeAt(0); stdin = stdin.substring(1); ++instructionPtr; break; case '[': if (memory[dataPtr] == 0) jumpToLoopEnd(); else ++instructionPtr; break; case ']': if (memory[dataPtr] != 0) jumpToLoopStart(); else ++instructionPtr; break; default: ++instructionPtr; break; } } void execute() { while (0 <= instructionPtr && instructionPtr < code.length) step(); } }
main()は、実装予定の他の言語が見えてしまうので省略。
[Brainfuck -サンプルコードを使って処理の流れを見てみよう。 http://hakugetu.so.land.to/program/brainfuck/1-4.php ]に有るの位いは支障なく動く。
Hello, world!+++++++++[->++++++++>+++++++++++>+++++<<<]>.>++.+++++++..+++.>-.--------- ---.<++++++++.--------.+++.------.--------.>+.++++++[->++++>>+>+>-<<<<<]>[<++++>>+++>++++>>+++>+++++>+++++>>>>>>++>>++< <<<<<<<<<<<<<-]<++++>+++>-->+++>->>--->++>>>+++++[->++>++<<]<<<<<<<<<<[-> -[>>>>>>>]>[<+++>.>.>>>>..>>>+<]<<<<<-[>>>>]>[<+++++>.>.>..>>>+<]>>>>+<-[ <<<]<[[-<<+>>]>>>+>+<<<<<<[->>+>+>-<<<<]<]>>[[-]<]>[>>>[>.<<.<<<]<[.<<<<] >]>.<<<<<<<<<<<]素数
>++++[<++++++++>-]>++++++++[<++++++>-]<++.<.>+.<.>++.<.>++.<.>>++[<--->-] <..<.>.++.<.>--.>++[<+++>-]<.<.>>++[<--->-]<.>++[<++++>-]<.<.>>++[<--->-] <-.+.<.>-.>+++[<++>-]<+.<.>>++[<--->-]<.--.<.>++.++++.<.>---.---.<.>++.- .<.>+.+++.<.>--.--.<.>++.++++.<.>---.-----.<.>+++++.+.<.>.>++[<--->-]<.<. >>++[<+++>-]<.----.<.>++++.++.<.>-.-----.<.>+++++.+.<.>.--.