誰でもBrainf*ckっぽい言語が作れる?ツール作った

Contents
  1. はじめに
  2. 使い方
  3. Brainf*ck風言語を作ってみる
  4. ソースコード変換
  5. おわりに

はじめに

なぜか brainfckを実装した。 ついでに誰でもオリジナルなbrainfck っぽいプログラムを実行できるようにしてみた 💡

https://github.com/nownabe/brainfuck-go

使い方

まずはインストール。

go get -u github.com/nownabe/brainfuck-go

例えば fizzbuzz を実行してみる。ソースコードはこんな感じ。

$ cat fizzbuzz.bf
++++++[->++++> >+>+>-<<<<<]>[<++++> >+++>++++> >+++>+
++++>+++++> > > > > >++> >++<<<<<<<<<<<<<<-]<++++>+++
>-->+++>-> >--->++> > >+++++[->++>++<<]<<<<<<<<<<[->-
[> > > > > > >]>[<+++>.>.> > > >..> > >+<]<<<<<-[> > > >]>[<+
++++>.>.>..> > >+<]> > > >+<-[<<<]<[[-<<+> >]> > >+>+<<<<<
<[-> >+>+>-<<<<]<]>>[[-]<]>[> > >[>.<<.<<<]<[.<<<<]>]>.<<<<
<<<<<<<]

実行する。

$ brainfuck-go fizzbuzz.bf
Input: ++++++[->++++> >+>+>-<<<<<]>[<++++> >+++>++++> >+++>+
++++>+++++> > > > > >++> >++<<<<<<<<<<<<<<-]<++++>+++
>-->+++>-> >--->++> > >+++++[->++>++<<]<<<<<<<<<<[->-
[> > > > > > >]>[<+++>.>.> > > >..> > >+<]<<<<<-[> > > >]>[<+
++++>.>.>..> > >+<]> > > >+<-[<<<]<[[-<<+> >]> > >+>+<<<<<
<[-> >+>+>-<<<<]<]>>[[-]<]>[> > >[>.<<.<<<]<[.<<<<]>]>.<<<<
<<<<<<<]


1
2
Fizz
4
# 省略
97
98
Fizz
Buzz


(END)

Brainf*ck風言語を作ってみる

この brainfuck-go という brainf*ck 処理系は JSON で命令をカスタマイズできるようになっている。

例えば、こんな感じの JSON を作ってみる。

sushi.json
{
  "next": "ウニ",
  "prev": "イクラ",
  "inc": "マグロ",
  "dec": "アジ",
  "read": "タコ",
  "write": "トビウオ",
  "open": "[",
  "close": "]",
  "whitespaces": " \t\r\n"
}

この JSON だと、例えば ウニ はポインタをインクリメントする命令、アジ はポインタが指す値をデクリメントする命令となる。1

この JSON でできるプログラミング言語 SUSHI で書かれたプログラムを実行するためには -conf オプションを使用する。

こんな感じで、SUSHI で書かれた fizzbuzz を実行できる。

$ brainfuck-go -conf sushi.json fizzbuzz.sushi
Input: マグロマグロマグロマグロマグロマグロ[アジウニマグロマグロマグロマグロウニ ウニマグロウニマグロウニアジイクライクライクライクライクラ]ウニ[イクラマグロマグロマグロマグロウニ ウニマグロマグロマグロウニマグロマグロマグロマグロウニ ウニマグロマグロマグロウニマグロ
マグロマグロマグロマグロウニマグロマグロマグロマグロマグロウニ ウニ ウニ ウニ ウニ ウニマグロマグロウニ ウニマグロマグロイクライクライクライクライクライクライクライクライクライクライクライクライクライクラアジ]イクラマグロマグロマグロマグロウニマグロマグロマグロ
ウニアジアジウニマグロマグロマグロウニアジウニ ウニアジアジアジウニマグロマグロウニ ウニ ウニマグロマグロマグロマグロマグロ[アジウニマグロマグロウニマグロマグロイクライクラ]イクライクライクライクライクライクライクライクライクライクラ[アジウニアジ
[ウニ ウニ ウニ ウニ ウニ ウニ ウニ]ウニ[イクラマグロマグロマグロウニトビウオウニトビウオウニ ウニ ウニ ウニトビウオトビウオウニ ウニ ウニマグロイクラ]イクライクライクライクライクラアジ[ウニ ウニ ウニ ウニ]ウニ[イクラマグロ
マグロマグロマグロマグロウニトビウオウニトビウオウニトビウオトビウオウニ ウニ ウニマグロイクラ]ウニ ウニ ウニ ウニマグロイクラアジ[イクライクライクラ]イクラ[[アジイクライクラマグロウニ ウニ]ウニ ウニ ウニマグロウニマグロイクライクライクライクライクラ
イクラ[アジウニ ウニマグロウニマグロウニアジイクライクライクライクラ]イクラ]ウニウニ[[アジ]イクラ]ウニ[ウニ ウニ ウニ[ウニトビウオイクライクラトビウオイクライクライクラ]イクラ[トビウオイクライクライクライクラ]ウニ]ウニトビウオイクライクライクライクラ
イクライクライクライクライクライクライクラ]



1
2
Fizz
4
# 省略
97
98
Fizz
Buzz


(END)

ソースコード変換

brainf*ck のソースコードを新しいオリジナル言語のソースコードに変換できるような変換器も作った。

インストール

go get -u github.com/nownabe/brainfuck-go/converter

変換

$ converter -conf sushi.json fizzbuzz.bf
マグロマグロマグロマグロマグロマグロ[アジウニマグロマグロマグロマグロウニ ウニマグロウニマグロウニアジイクライクライクライクライクラ]ウニ[イクラマグロマグロマグロマグロウニ ウニマグロマグロマグロウニマグロマグロマグロマグロウニ ウニマグロマグロマグロウニマグロ
マグロマグロマグロマグロウニマグロマグロマグロマグロマグロウニ ウニ ウニ ウニ ウニ ウニマグロマグロウニ ウニマグロマグロイクライクライクライクライクライクライクライクライクライクライクライクライクライクラアジ]イクラマグロマグロマグロマグロウニマグロマグロマグロ
ウニアジアジウニマグロマグロマグロウニアジウニ ウニアジアジアジウニマグロマグロウニ ウニ ウニマグロマグロマグロマグロマグロ[アジウニマグロマグロウニマグロマグロイクライクラ]イクライクライクライクライクライクライクライクライクライクラ[アジウニアジ
[ウニ ウニ ウニ ウニ ウニ ウニ ウニ]ウニ[イクラマグロマグロマグロウニトビウオウニトビウオウニ ウニ ウニ ウニトビウオトビウオウニ ウニ ウニマグロイクラ]イクライクライクライクライクラアジ[ウニ ウニ ウニ ウニ]ウニ[イクラマグロ
マグロマグロマグロマグロウニトビウオウニトビウオウニトビウオトビウオウニ ウニ ウニマグロイクラ]ウニ ウニ ウニ ウニマグロイクラアジ[イクライクライクラ]イクラ[[アジイクライクラマグロウニ ウニ]ウニ ウニ ウニマグロウニマグロイクライクライクライクライクラ
イクラ[アジウニ ウニマグロウニマグロウニアジイクライクライクライクラ]イクラ]ウニウニ[[アジ]イクラ]ウニ[ウニ ウニ ウニ[ウニトビウオイクライクラトビウオイクライクライクラ]イクラ[トビウオイクライクライクライクラ]ウニ]ウニトビウオイクライクライクライクラ
イクライクライクライクライクライクライクラ]

おわりに

ぜひ遊んでみてください 🌟

次はもっと高級な言語を作ってみたい。

Footnotes

  1. それぞれの命令の詳細はこちら: https://ja.wikipedia.org/wiki/Brainfuck ↩