和楽器バンドが好きすぎて、メンバー名のみでコーディングするプログラミング言語wagakki-band-langをつくってみた。


皆さん[和楽器バンド](http://wagakkiband.jp/)知ってますか？

2014年にボカロ系の楽曲カバーを皮切りにメジャーデビューした、詩吟・和楽器奏者とロックバンド奏者が融合したバンドで、最近はオリジナル曲を多数発表し、来る2016年1月6日には武道館での単独ライブまで決行してしまう、今ノリノリのバンドです。

僕は2年ちょい前にYouTubeで[天樂](https://www.youtube.com/watch?v=Q2meWkWqc-I)を発見して以来のファンなのですが、2015年の大晦日、紅白を見ながら、来年こそは[和楽器バンド](http://wagakkiband.jp/)が紅白出て欲しいなぁと考えながら見ていました。小林幸子も良かったですが、千本桜は[和楽器バンドのバージョン](https://www.youtube.com/watch?v=K_xTet06SUo)が一番です！

そんなこんなで2016年の初プログラミングは何がいいかなぁとぼーっと考えていたんですが、ふと思いついて、和楽器バンドのメンバー名のみでコーディングするプログラミング言語、[wagakki-band-lang](https://github.com/itohiro73/wagakki-band-lang)をつくってしまいました。

これでQiitaを閲覧する100万人のエンジニアの皆さんも和楽器バンドに興味を持ってくれるようになるはず（ステマ）。そうすればきっと2016年の紅白出場も間違いない！という想いでつくりました。

# wagakki-band-langって、どーいうプログラミング言語？
###GitHub: [wagakki-band-lang](https://github.com/itohiro73/wagakki-band-lang)

[Brainf*ck](https://ja.wikipedia.org/wiki/Brainfuck)と呼ばれる8個の命令のみでプログラミングが可能な難読プログラミング言語があるんですが、こちらの派生言語になります。和楽器バンドのメンバー名が命令に使用できる文字列になっています。こちらが命令表。

|Brainf*ckの命令|wagakki-band-langの命令|命令の説明|
|---------|-----------------|----------------|
|>|山葵|ポインタをインクリメントする命令。和楽器バンドのリズムを左サイドから支えるドラム、山葵さんを割り当て。|
|<|黒流|ポインタをデクリメントする命令。和楽器バンドのリズムを右サイドから支える和太鼓、黒流さんを割り当て。|
|+|いぶくろ聖志|ポインタが指す値をインクリメントする命令。和楽器バンドを左サイドから彩る箏、いぶくろ聖志さんを割り当て。|
|-|蜷川べに|ポインタが指す値をデクリメントする命令。和楽器バンドを右サイドから彩る津軽三味線、蜷川べにさんを割り当て。|
|.|鈴華ゆう子|ポインタが指す値を出力に書き出すする命令。和楽器バンドの出力であるボーカル、鈴華ゆう子さんを割り当て。|
|,|亜沙|入力から1バイト読み込んで、ポインタが指す先に代入する命令。和楽器バンドの入力（？）を支えるベース、亜沙さんを割り当て。かなりむりやりの割り当てですみません（汗）。|
|[|神永大輔|ポインタが指す値が0なら対応する]にジャンプする命令。和楽器バンドの飛び道具、左サイドからぴょんぴょん跳ねる尺八、神永大輔さんを割り当て。|
|]|町屋|対応する[にジャンプする命令。和楽器バンドの飛び道具、右サイドからぴょんぴょん跳ねるギター、町屋さんを割り当て。|

# どうやって実行するのか
バイナリはまだ配布していないので、[こちら](https://github.com/itohiro73/wagakki-band-lang)のソースコードを自分でビルドする必要があります。

```bash:Unix系OSでビルド（Macはこちら）
./gradlew build
```

```dos:Windowsでビルド
gradlew.bat build
```

git cloneしたプロジェクト内で上記コマンドを実行すると、実行ファイルを含んだ圧縮ファイルがbuild/distributions配下に作られます。

```
$PROJECT_DIR/build/distribution
wagakki-band-lang-0.0.1-SNAPSHOT.tar
wagakki-band-lang-0.0.1-SNAPSHOT.zip
```

tar、zipどちらでもよいので解凍すると下記のような構成のファイル群が展開されます。

```
wagakki-band-lang-0.0.1-SNAPSHOT
├── bin
│   ├── wagakki-band-lang
│   └── wagakki-band-lang.bat
└── lib
    ├── eclipse-collections-7.0.0.jar
    ├── eclipse-collections-api-7.0.0.jar
    └── wagakki-band-lang-0.0.1-SNAPSHOT.jar
```

あとは環境に合わせてbin配下の実行コマンドを実行するだけです。ここで上記の命令表に対応した和楽器バンドメンバーの名前のみで書かれたソースコードのファイルパスを引数に与えてやれば任意のプログラムが実行できます！！

```bash:Unix系OSでプログラム実行（Macはこちら）
bin/wagakki-band-lang source-file-path
```

```dos:Windowsでプログラム実行
bin/wagakki-band-lang.bat source-file-path
```

# プログラム例
下記の例のプログラム内の空白や改行はあってもなくても動きます。

### Hello Worldを出力するプログラム
定番のHello World出力です。ひたすら値をインクリメントするためにいぶくろ聖志さんの出番が多いですね。このプログラムでは入力の必要がないので亜沙さんの出番が全くない。。。

```hello_world.wgb
山葵 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志
 いぶくろ聖志 神永大輔 黒流 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志
 いぶくろ聖志 いぶくろ聖志 山葵 蜷川べに 町屋 黒流 鈴華ゆう子 山葵 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志
 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 神永大輔 黒流 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志
 いぶくろ聖志 山葵 蜷川べに 町屋 黒流 いぶくろ聖志 鈴華ゆう子 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志
 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 鈴華ゆう子 鈴華ゆう子 いぶくろ聖志 いぶくろ聖志
 いぶくろ聖志 鈴華ゆう子 神永大輔 蜷川べに 町屋 山葵 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志
 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 神永大輔 黒流 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志
 いぶくろ聖志 山葵 蜷川べに 町屋 黒流 鈴華ゆう子 山葵 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志
 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 神永大輔 黒流
 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 山葵 蜷川べに 町屋 黒流 鈴華ゆう子 山葵
 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志
 神永大輔 黒流 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 山葵 蜷川べに 町屋 黒流 鈴華ゆう子 いぶくろ聖志
 いぶくろ聖志 いぶくろ聖志 鈴華ゆう子 蜷川べに 蜷川べに 蜷川べに 蜷川べに 蜷川べに 蜷川べに 鈴華ゆう子
 蜷川べに 蜷川べに 蜷川べに 蜷川べに 蜷川べに 蜷川べに 蜷川べに 蜷川べに 鈴華ゆう子 神永大輔 蜷川べに
 町屋 山葵 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志
 いぶくろ聖志 神永大輔 黒流 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 山葵 蜷川べに 町屋 黒流
 いぶくろ聖志 鈴華ゆう子 神永大輔 蜷川べに 町屋 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志
 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 鈴華ゆう子 
```

上記プログラムを"hello_world.wgb"というファイルに保存して（拡張子は別になんでも良いのですが、なんとなくwgb）、上記で解凍したコマンドを実行すると。。。

```Macでの実行例
$ bin/wagakki-band-lang hello_world.wgb 
Hello World!
```

見事出力されました！！！

### 入力された２つの一桁の数字を足し合わせる
Hello Worldの例だけだと亜沙さんの出番がなくて非常に心苦しいので、入力があるプログラム例をひとつ。下記のプログラムは連続で入力された２つの一桁の数字を足した結果を出力します。ただし、繰り上がりの計算はできないので、結果が9以下である必要があります（汗）。


```add.wgb
亜沙 山葵 亜沙 山葵 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志 いぶくろ聖志
 神永大輔 黒流 蜷川べに 蜷川べに 蜷川べに 蜷川べに 蜷川べに 蜷川べに 蜷川べに 蜷川べに 山葵 蜷川べに
 町屋 黒流 黒流 神永大輔 山葵 いぶくろ聖志 黒流 蜷川べに 町屋 山葵 鈴華ゆう子 
```

上記プログラムを"add.wgb"というファイルに保存してプログラムを実行すると。。。

```Macでの実行例
$ bin/wagakki-band-lang add.wgb        
12 (入力)
3 (出力)                                                                                                                      
$ bin/wagakki-band-lang add.wgb
34 (入力)
7 (出力)                                                                                                                     
$ bin/wagakki-band-lang add.wgb
45 (入力)
9 (出力)       
```
足し算成功です！自分がBrainf*ckのプログラムに慣れていないので、[こちらのスライド](http://www.slideshare.net/KMC_JP/brainfck)から例をお借りしました。

wagakki-band-langの元となる言語であるBrainf*ckはチューリング完全なので、様々なプログラムを表現可能です。皆さんも和楽器バンドメンバーの名前だけで書くプログラミング、初めてみてはいかがでしょうか。

# なぜつくったのか
しばらく忙しくて和楽器バンドの動向にキャッチアップできていなかったので、年を越しながら[八重流](http://global-fc.net/wgb/)という和楽器バンドのファンクラブのblogをずーっと眺めていました。このファンクラブ名の八重流という言葉には、バンドのメンバー8人がそれぞれ主役という想いが込められているそうです。僕自身もファンとしてメンバー8人それぞれの個性が大好きで、和楽器バンドの楽曲をiPodやライブで聴いている時も8人それぞれの奏でる音を満遍なく楽しんでいます。そんな中、あるツイートをきっかけにふと8つの命令を持つBrainf*ckのことを思い出し、8個の命令にメンバー名を割り当てることを思い立ってしまったのです。思い立ったのが大晦日だったので正月三が日にわりと時間がある、じゃあ思い立ったが吉日でつくってしまおうという感じです。

# wagakki-band-langはBrainf*ckの処理系を派生させるエンジンを積んでいます
Brainf*ckは、プログラムを読み書きするのはかなり難しいのですが、言語処理系自体を実装するのは意外と簡単という特徴があります。なので、8つの命令に使用される文字（><+-.,[]）を、違う文字や文字列に置き換えた派生言語はよく作られています。なんせ、いったんBrainf*ckの処理系を作ってしまえばあとは命令表の文字列を置き換えてしまえばいいだけなので、簡単なんですね。

wagakki-band-langも、最初にBrainf*ckの実装を書いてから、命令表をプロパティファイルで入れ替えられるように拡張してみました。なので、命令表のマッピングを上書きして同様な派生言語を簡単に作ることができます。お正月のテレビを見ながら作ったので、とりあえずプロパティファイルを使った雑な拡張エンジンとして実装しましたが、どんなマッピングでも動くはず。試してないけど、。[ジョジョ言語](http://d.hatena.ne.jp/toyoshi/20100208/1265587511)とかなんでもつくれるはずなので、誰か試してみてください。


```wagakki-band-langの命令マッピング例
> = 山葵
< = 黒流
+ = いぶくろ聖志
- = 蜷川べに
. = 鈴華ゆう子
, = 亜沙
[ = 神永大輔
] = 町屋
```


```mappingを指定して実行するコマンド例(Unix系OS)
bin/wagakki-band-lang [mapping-file-path] source-file-path
```

```mappingを指定して実行するコマンド例(Windows)
bin/wagakki-band-lang.bat [mapping-file-path] source-file-path
```

# 和楽器バンドに興味がわいた、お勧めの曲は？
お初な方には[天樂](https://www.youtube.com/watch?v=Q2meWkWqc-I)やみんな知ってる[千本桜](https://www.youtube.com/watch?v=K_xTet06SUo)らへんから聴いてみるのをお勧めします。さらに興味を持ったら[華火](https://www.youtube.com/watch?v=ItTCHtcXdgw)や[反撃の刃](https://www.youtube.com/watch?v=BUs8oHfnAuU)などのオリジナル曲にもはまってみてください。あとは[ライブ映像](https://www.youtube.com/watch?v=GzzaCr8Bv4E)を観てみたり、実際にライブに行くのが最高ですね！！

# 参考にしたサイト
[wagakki-band-lang](https://github.com/itohiro73/wagakki-band-lang)
[和楽器バンド 公式サイト](http://wagakkiband.jp/)
[和楽器バンド ファンクラブ 八重流](http://global-fc.net/wgb/)
[Wikipedia Brainf*ck page](https://ja.wikipedia.org/wiki/Brainfuck)
[JavaでBrainf*ckを実装してみた！](http://d.hatena.ne.jp/j7400157/20080602/1212419732)
[Brainf*ck](http://www.kmonos.net/alang/etc/brainfuck.php)
[実用Brainf*ckプログラミング](http://www.slideshare.net/KMC_JP/brainfck)