誰でも分かるプログラミング講座…?

+++++++[>++++++++++++<-]>.<++++[>+++++++<-]>-.<+++[>----<-]>-.
<++[>+++<-]>+.+++.+++.<+++[>---<-]>+.

突然ですが、上の文章の意味が分かりますか?
恐らくほとんどの人が分からないと思います。
これは「Tobilog」と出力されるように、とあるプログラミング言語で書かれていました。
記事のタイトルからプログラミング言語で書かれているのかな?と察していた人もいるかもしれません。
今回はこちらの言語をご紹介します。
この暗号のような文の解読を目指しましょう!
(言語の名前は一旦置いておいておきます…。)

はじめに

さて、冒頭で示したコードを見て何を感じましたか?
プログラミングに慣れ親しんでる方は、特殊だな…と感じているかもしれません。
プログラミングに縁が無い方は、こんなので動くの?と感じているかもしれません。
色々と感じるところはあると思いますが、恐らく全員に共通しているのはこれです。

文字種少なくね????

その通りです。
実はこの言語、8種類の文字だけで全てのコーディングが可能です。
間違いなく少ないですね。

プログラミング言語は大きく分けて2つに分けられると考えています。
それは
①実用性のある言語
②難しすぎて実用性皆無な言語
の2つです。
①しか知らない人が多いと思いますが、②は難解プログラミング言語と呼ばれ一部マニアに楽しまれています。
そして、今回の言語は②にあたります。
しかし安心してください。この言語は比較的簡単なので、初心者の方でもすぐに楽しめます。
(本当の難解言語は地獄絵図ですが…)
つまり、誰でも楽しめるネタ言語ということですね。

実はチューリング完全の言語で凄いんですが、(チューリング完全の説明は割愛します。ただのネタじゃないくらいに思ってください。)今回はこの側面に触れません。
ちょっと笑える話だと思って、簡単な文法を学んでいきましょう。

簡単な文法

この言語は8種類の文字のみでコーディングできると述べました。
ここでは、8種類の文字の働きをご説明します。

ただその前に部屋の概念についてご紹介します。(一般にポインタと呼ばれます)
この言語は部屋の感覚が掴めれば簡単です。
部屋とは、以下の図のようなものを考えてください。
各部屋には最初0という数字が入っており、いくつも横に並んでいます。
そして、常に1つ注目している部屋(太線で囲まれた部屋)があります。

注目する部屋を右に1つズラす、とは次のようになることです。

では最低限の部屋の紹介が終わったところで各文字の働きを説明します。

>注目する部屋を右に1つズラす
<注目する部屋を左に1つズラす
+注目している部屋の数字を1つ大きくする
注目している部屋の数字を1つ小さくする
.注目している部屋の数字に対応する文字コードの文字を出力する
,入力された文字に文字コードで対応する数字を注目している部屋に入れる
[注目している部屋の数字が0でなければ]に飛ぶ
]注目している部屋の数字が0でなければ[に戻る

文字コードという言葉が出てきましたが、それはこちらの表を参照してください。
簡単に言うと、コンピューター内で全ての文字は数字として管理されています。
その対応関係を文字コードと呼んでいます。

また、以上の説明は簡単にするために若干嘘が混じっています。(言い方が悪いですが…)
それで大きな問題が起こることはありませんので許してください。
小学校の算数で負の数を存在しないものとするのと同じです。

具体例

働きの説明だけで書き方が分かった人もいると思いますが、具体例を見ていきましょう。
まずは素朴な例です。

+[+]

これは注目している部屋の数字を永遠に大きくし続けるコードです。
それ以上でもそれ以下でもありません。
ここで重要なのは、[]がループ操作のための文字だということです。
(本来は最初の+が無くても動きます。簡単にした弊害です。)

次にループを利用したシンプルなコードを見てみましょう。

++++++++[>++++++++<-]>+.

幾つかステップがありますが、順を追って解読しましょう。
①初めに注目している部屋の数を8にします。
②ループを始めます。
③右の部屋に注目します。
④③で注目した部屋の数を8にします。(8大きくします)
⑤左の部屋(初めに注目していた部屋)に注目します。
⑥⑤で注目した部屋の数を7にします。(1小さくします)
⑦③~⑥をあと7回繰り返します。③の部屋は64に、⑤の部屋が0に、注目している部屋が⑤の部屋になります。分からない場合は丁寧に繰り返してみてください。
⑧③の部屋に注目します。
⑨③の部屋の数字を65にします。(1大きくします)
⑩65が対応している”A”を出力します。
よって、このコードはAと出力するコードだと分かりました。

最後に最初に示した「Tobilog」と出力するコードを解読してみましょう。

+++++++[>++++++++++++<-]>.<++++[>+++++++<-]>-.<+++[>----<-]>-.
<++[>+++<-]>+.+++.+++.<+++[>---<-]>+.

基本的には1つ前に示した手順を繰り返すだけです。
Tの出力までを簡単に考えると、「注目している部屋の数字を12大きくする作業」を7回ループして84としています。
Tの文字コードは84なので、そのまま出力しています。
同じ要領で繰り返すと111,98,105,108,111,103となり、最終的に「Tobilog」と出力されます。
このコードを見ると分かりますが、簡単に「Tobilogと出力するコード」と言っても大量にあります。
極論を言えば、ループを使う必要はありません。84回+を書けばTは出力できます。
しかし、上手くループを使うことで記述する量を極力減らしています。
この言語をコーディングするコツは、いい倍数を見つけてループの形に落とし込むことだと思います。

さて、この記事を読み始めた時は暗号に見えた文章が、ついに解読できる文章となりました。

終わりに

如何でしたか?
仕組みを知ると、実はシンプルでただ足し算していただけだと言うことが分かったと思います。(言い方が悪い)
それにしても変なプログラミング言語ですよね。
今まで隠してきましたが、この言語の名前はもっと狂ってるんです…。
そう、その名前とは…

Brainfuck

汚い言葉が入ってしまいました…。(おい)
一々この名前で呼ぶのも微妙かな?と思ったので最後に紹介しました。
まあ、忘れてください。

なにはともあれ、皆さんはプログラミング言語を扱えるようになりました!
立派なプログラマーです!(実用性?忘れてください。お前別にプログラマーじゃないだろって?忘れてください。これで稼ぎたいって?バカ言ってんじゃねーよ。)
最後に練習問題を2問付けておくので、是非最後まで楽しんでください。
では、終わります。

練習問題

問1.次のコードが出力する文字列を答えなさい。

++++++++[>++++++++<-]>+++.<++++++[>+++++<-]>.+++++++++++.
---.---.<+++[>+++<-]>.+++.----.-----.--------.

問2.「Brainfuck」と出力するコードを書きなさい。
プログラミング言語は外国語と同じく読めるだけでは意味がありません。
コーディングにも挑戦しましょう!

答えは次のページで。

かりふぉるにあ
パッと見テキトーに見える記事ですが、本当にテキトーです。基本的に口語調です。割と何でも書きますが、趣味の範囲は数理科学とエンタメとアイドルあたりです。毎週月曜更新「かりふぉるにあからの挑戦状」毎週土曜更新「化学アレルギーへの処方箋」

コメント

タイトルとURLをコピーしました