1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

難解プログラミング言語

Posted at

難解プログラミング言語とは

端的に言うと簡単に読解できないプログラミング言語のことである.
いろいろあるが今回は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はその特性上とても派生言語が生まれやすい.
様々なものがあり見ていて楽しい.
次回はそんな特性を使ってさらに難読化をしようと考えた末に生まれたものを解説していく.
ここまでのご高覧ありがとうございました.

1
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?