はじめに
この記事はアドベントカレンダーがマズくなったときのために書き溜めておいたものです。
これが公開されているということは、そういうことなのでしょう。
Brainfuckの開発を行うにあたって、ホットリロード機能が欲しいと思ったことはないですか?
むしろ、思い通りに動くほうが珍しい難解言語なので必須機能とも言えるでしょう。
そこで、自分でホットリロードができるBrainfuck環境を構築することにしました。
Brainfuck
Brainfuckとは
コンパイラがなるべく小さくなるように設計された簡潔な言語です1。
以下に簡単なプログラムの例を示します。
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++
++>-]<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>
++++++++[<++++>-]<+.[-]++++++++++.
Hello World!
++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++.+.+.>++++++++++.
ABC
導入
今回はBrainfuckのコンパイル環境としてjsbrainfuck2を使います。
$ yarn add jsbrainfuck
jsbrainfuck.interpret()
の引数にBrainfuckの文字列を渡すと、コードを実行することができます。
適当に実行用のスクリプトを作成しました。
const{readFileSync}=require("fs");const{interpret}=require("jsbrainfuck");// 引数から対象ファイル名を取得して各ファイルを実行するprocess.argv.slice(2).forEach((name)=>{constsource=readFileSync(name,"utf-8");console.log(`Executing ${name} =>`);const{print}=interpret(source);// Brainfuckコードを実行print();// 実行結果を表示});
以下のように複数のファイルを実行することもできます。
$ node run.js src/hello.bf src/abc.bf
Executing src/hello.bf =>
Hello World!
Executing src/abc.bf =>
ABC
jsbrainfuck.compile()
の引数にBrainfuckの文字列を渡すとJSコードに変換された文字列が返ってきます。
適当にコンパイル用のスクリプトを作成しました。
const{readFileSync,writeFileSync}=require("fs");const{compile}=require("jsbrainfuck");constname=process.argv[2];// 入力ファイル名を引数から取得constsource=readFileSync(name,"utf-8");const{code}=compile(source);// BrainfuckからJSコード生成constout=process.argv[3];// 出力ファイル名を引数から取得writeFileSync(out,code);
$ node compile.js src/hello.bf hello.js
$ node hello.js
Hello World!
ホットリロード
ホットリロードとは
ファイルを変更したとき自動でコンパイルや実行を行うことを言います。
変更するたびに手動でコンパイルして実行する手間を省けます。
導入
Nodemon3というソース監視ツールを導入します。
$ yarn add nodemon
package.json
に以下のような設定を追加して、./src
の中の.bf
ファイルを監視して、変更があったらnode ./run.js ./src/*.bf
を実行するようにします。
{"nodemonConfig":{"watch":["./src"],"ext":"bf","exec":"node ./run.js ./src/*.bf"}}
Nodemonを起動すると監視が始まって、変更があるとリロードされていることがわかります。
$ yarn run nodemon
[nodemon] 2.0.1
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): src/**/*
[nodemon] watching extensions: bf
[nodemon] starting `node ./run.js ./src/*.bf`
Executing ./src/abc.bf =>
ABC
Executing ./src/hello.bf =>
Hello World!
[nodemon] clean exit - waiting for changes before restart
[nodemon] restarting due to changes...
[nodemon] starting `node ./run.js ./src/*.bf`
Executing ./src/abc.bf =>
DEF
Executing ./src/hello.bf =>
Hello World!
[nodemon] clean exit - waiting for changes before restart
最後に
仕上げにpackage.json
に以下のようなスクリプトを追加すると、yarn start
でホットリロードができるBrainfuck環境が動くようになります。
{"scripts":{"start":"nodemon","build":"node compile.js"}}
これでBrainfuckのコーディングを快適に嗜むことができます。