LoginSignup
9
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2019-12-08

はじめに

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) => {
  const source = 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");

const name = process.argv[2]; // 入力ファイル名を引数から取得
const source = readFileSync(name, "utf-8");
const { code } = compile(source); // BrainfuckからJSコード生成
const out = 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のコーディングを快適に嗜むことができます。

9
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
0