nownab.log

nownabe's daily posts

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

Posted on Mar 25, 2017

はじめに

なぜか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を作ってみる。

{
  "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
マグロマグロマグロマグロマグロマグロ[アジウニマグロマグロマグロマグロウニ ウニマグロウニマグロウニアジイクライクライクライクライクラ]ウニ[イクラマグロマグロマグロマグロウニ ウニマグロマグロマグロウニマグロマグロマグロマグロウニ ウニマグロマグロマグロウニマグロ
マグロマグロマグロマグロウニマグロマグロマグロマグロマグロウニ ウニ ウニ ウニ ウニ ウニマグロマグロウニ ウニマグロマグロイクライクライクライクライクライクライクライクライクライクライクライクライクライクラアジ]イクラマグロマグロマグロマグロウニマグロマグロマグロ
ウニアジアジウニマグロマグロマグロウニアジウニ ウニアジアジアジウニマグロマグロウニ ウニ ウニマグロマグロマグロマグロマグロ[アジウニマグロマグロウニマグロマグロイクライクラ]イクライクライクライクライクライクライクライクライクライクラ[アジウニアジ
[ウニ ウニ ウニ ウニ ウニ ウニ ウニ]ウニ[イクラマグロマグロマグロウニトビウオウニトビウオウニ ウニ ウニ ウニトビウオトビウオウニ ウニ ウニマグロイクラ]イクライクライクライクライクラアジ[ウニ ウニ ウニ ウニ]ウニ[イクラマグロ
マグロマグロマグロマグロウニトビウオウニトビウオウニトビウオトビウオウニ ウニ ウニマグロイクラ]ウニ ウニ ウニ ウニマグロイクラアジ[イクライクライクラ]イクラ[[アジイクライクラマグロウニ ウニ]ウニ ウニ ウニマグロウニマグロイクライクライクライクライクラ
イクラ[アジウニ ウニマグロウニマグロウニアジイクライクライクライクラ]イクラ]ウニウニ[[アジ]イクラ]ウニ[ウニ ウニ ウニ[ウニトビウオイクライクラトビウオイクライクライクラ]イクラ[トビウオイクライクライクライクラ]ウニ]ウニトビウオイクライクライクライクラ
イクライクライクライクライクライクライクラ]

おわりに

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

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


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