難解プログラミング言語とは
端的に言うと簡単に読解できないプログラミング言語のことである.
いろいろあるが今回はBrainf*ckについて書いていく.
wikiペディアとかで調べても割と出てくるため, n番煎じのネタではあるが見守ってほしい.
また, 独自の解釈などが出てくるため詳しく知りたい人や, 正確に理解したい人はwikiペディアに逃げてほしい.
BrainF*ckとは
文字通り脳が破壊される言語である.
なんとたったの8種類の記号だけで書けるため美しい.(あくまで個人の感想です)
チューリング完全なため非常に美しい.(あくまで個人の(以下略))
そのため簡潔に書けることから多くの派生言語が生まれた.
では実際にコードを見ながらどのようなものなのか見ていく.
これはBrainf*ckでHello, world!するプログラムである.
+++++++[>++++++++++<-]>++.<++[>++++++++++<-]>+++++++++.+++++++..+++.<++++++[>----------<-]>-------.<+[>----------<-]>--.<++++++++[>++++++++++<-]>+++++++.--------.+++.------.--------.<++++++[>----------<-]>-------.
本当に動くのか疑問に思った人もいるかもしれないが, これで本当にHello, world!ができてしまう.
動かしてみたい人には以下のサイトとかがおすすめだ.
https://kachikachi.net/brainfuck/
実際に上記のコードはどのようなロジックで書かれたか解説していく.
まず前提として, Brainf*ckはメモリに値を増やしたり減らしたりする言語である.
一つの列に大量の数字が入るそろばんをイメージするといいだろう.
それを下記の8つのシンボルで制御していくだけの簡単なお仕事だ.
シンボル | 意味 |
---|---|
> | メモリの番地を一つ増やす |
< | メモリの番地を一つ減らす |
+ | メモリの中身をインクリメントする |
- | メモリの中身をデクリメントする |
[ | メモリの中身が0なら対応する]の直後まで飛ぶ |
] | メモリの中身が0でないなら[の直後まで飛ぶ |
, | キー入力をasciiコードに則って解釈しメモリの中に代入する |
. | メモリの中身をasciiコードに則って解釈し出力する |
ここまで理解してしまえば, asciiコード表とお友達になればどこでも読めてしまう.
ここで最初のHello, world!のコードに戻り読み方を解説していく
読み方
どうせ標準出力であるとあたりを付けて"."が出てくるまでを一区切りと解釈して読んでいく.
そうすると最初の部分は
+++++++[>++++++++++<-]>++.
こうなっていることがわかる.
[の直前までの"+"は7個あるので, 現在のメモリの中身を7回インクリメンタルする.
カレント | メモリ2 | メモリ3 |
---|---|---|
007 | 000 | 000 |
次に, 現在のメモリは0ではないので">"で次のメモリを見る
メモリ1 | カレント | メモリ3 |
---|---|---|
007 | 000 | 000 |
次は"+"が10個あるので10回インクリメントする.
メモリ1 | カレント | メモリ3 |
---|---|---|
007 | 010 | 000 |
"<-"とあるのでメモリを一つ左にずらしてデクリメントする.
カレント | メモリ2 | メモリ3 |
---|---|---|
006 | 010 | 000 |
これがループするため,
カレント | メモリ2 | メモリ3 |
---|---|---|
005 | 020 | 000 |
という具合で進み, 最終的に
カレント | メモリ2 | メモリ3 |
---|---|---|
000 | 070 | 000 |
となる.
この時点で"]"にいて現在のメモリの値は0のためループを抜ける.
ループを抜けた後は">++"なので一つメモリを右に動かして2回インクリメントする.
メモリ1 | カレント | メモリ3 |
---|---|---|
000 | 072 | 000 |
最後に"."なので72をasciiで解釈し出力する.
asciiコード表で72を見るとちゃんと"H"である.
そして出力してもメモリの中身はリセットされず値を保持する.
想定以上に長くなったため"H"の出力までで割愛する.
この後の処理は似たようなことの繰り返しのため気合で読めるはずだ.
最後に
最初の方にも触れたがBrainf*ckはその特性上とても派生言語が生まれやすい.
様々なものがあり見ていて楽しい.
次回はそんな特性を使ってさらに難読化をしようと考えた末に生まれたものを解説していく.
ここまでのご高覧ありがとうございました.