Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8691

ホットリロードができるBrainfuck環境

$
0
0

はじめに

この記事はアドベントカレンダーがマズくなったときのために書き溜めておいたものです。
これが公開されているということは、そういうことなのでしょう。

Brainfuckの開発を行うにあたって、ホットリロード機能が欲しいと思ったことはないですか?
むしろ、思い通りに動くほうが珍しい難解言語なので必須機能とも言えるでしょう。
そこで、自分でホットリロードができるBrainfuck環境を構築することにしました。

Brainfuck

Brainfuckとは

コンパイラがなるべく小さくなるように設計された簡潔な言語です1
以下に簡単なプログラムの例を示します。

src/hello.bf
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++
++>-]<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>
++++++++[<++++>-]<+.[-]++++++++++.
出力
Hello World!
src/abc.bf
++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++.+.+.>++++++++++.
出力
ABC

導入

今回はBrainfuckのコンパイル環境としてjsbrainfuck2を使います。

$ yarn add jsbrainfuck

jsbrainfuck.interpret()の引数にBrainfuckの文字列を渡すと、コードを実行することができます。
適当に実行用のスクリプトを作成しました。

run.js
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コードに変換された文字列が返ってきます。
適当にコンパイル用のスクリプトを作成しました。

compile.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を実行するようにします。

package.json
{"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環境が動くようになります。

package.json
{"scripts":{"start":"nodemon","build":"node compile.js"}}

これでBrainfuckのコーディングを快適に嗜むことができます。


Viewing all articles
Browse latest Browse all 8691

Trending Articles