- ふと気になったことを、淡々と赴くままに調査していく、この上ない自己満足記事第七弾。
- 生涯をささげても把握しきれない膨大な技術情報を、ひとまず表面だけ吸い取ってく生活。
- 今回は、日々増殖を続けるプログラミング言語の中でも、思わず舞い上がってしまう「難解言語」と呼ばれるものに、触れていくことにしよう。
難解言語
- 難解言語(Esolang)とは、「記述性・実用性・可読性」が難解になるように作られたプログラミング言語。
- ユニーク性とビジュアル性にこだわったものが多くあり、エンジニアの趣味等で、日々たくさんの難解言語が作成されている。
- 「記号のみ」「絵文字のみ」といったものもあるなど、種類は多岐にわたる。
- 難解言語リスト
調査言語
-
難解言語はありとあらゆる数があるが、今回は下記の言語を取り上げる。
- Brainf*ck
- whitespace
- Emojicode
-
※概要や特徴、サンプルプログラムのみとして、環境や各詳細な文法等は扱わない。
実行環境
- 今回調査した難解言語は、下記のオンライン実行環境を利用。
-
Try It Online
- 様々な種類の言語を試すことができる。
-
Try It Online
Brainf*ck
概要
- 命令文が8種類のみで構成されたプログラミング言語。
- コンパイル(変換)を最小限に抑えるように設計されている。
- 難解でありながら、機能性と汎用性が高いことから、様々な派生言語が生まれている。
- 下品な名称を隠すために、
Brainf*ck
と表記する場合が多い。
特徴
単純な値操作のみの処理
- 最初に準備される初期化(0)されたセル(配列)に、追加や移動等といった操作をしていくことで、処理が可能。
命令文の少なさ
- 下記の8種類の命令文で構成されているため、覚えることが少ない。
命令文 | 内容 |
---|---|
+ | セルの値を1増やす |
- | セルの値を1減らす |
. | セルの値を出力する |
, | セルの値へ標準入力を代入する |
> | セルを1つ左へ移動 |
< | セルを1つ右へ移動 |
[ | セルの値が0のときに、] の命令へいく。 |
] | セルの値が0でないときに、[ の命令へいく。 |
Atcoderで利用可能
- 競技プログラミングサイトのAtCoderで利用可能である。
サンプルプログラム
- 下記のサンプルプログラムで、簡単な文字列出力が可能。
/* 出力 : 「H」 */
+++++++++[>++++++++<-]>.
/* 出力 : 「e」 */
<+++++++++[>+++<-]>++.
/* 出力 : 「l」 */
+++++++.
/* 出力 : 「l」 */
.
/* 出力 : 「o」 */
+++.
/* 出力 : 「スペース」 */
<+++++++++[>--------<-]>-------.
/* 出力 : 「t」 */
<+++++++++[>+++++++++<-]>+++.
/* 出力 : 「_」 */
<+++++++++[>--<-]>---.
/* 出力 : 「o」 */
<+++++++++[>+<-]>+++++++.
/* 出力 : 「_」 */
<+++++++++[>-<-]>-------.
/* 出力 : 「d」 */
+++++.
/* 結果 : 「Hello t_o_d」 */
whitespace
概要
- 「スペース・タブ・改行」のみで構成されたプログラミング言語。
- エイプリルフールのネタとして、開発される。
- コードを見るだけでは、真っ白で内容が理解できないため、隠蔽等に使われる場合もある。
特徴
真っ白
- 「スペース・タブ・改行」のみのコードのため、可読性の前に、何も見えないため、内容がわからない。
他の文字はコメント扱い
- 「スペース・タブ・改行」以外の文字は、無視されて全てコメント扱いになる。
- そのため、好きな場所に、記号や日本語等でのコメントが可能。
二進数での文字表現
- 表現したい文字を、ASCIIコード(2進数)のみの扱いとなる。
スタック形式の命令
- スタック(データの後入先出法)と呼ばれる形式に基づいて、下記の基礎的な命令文によって、処理が可能。
- また、ヒープ(動的な領域管理方式)と呼ばれる「自由な住所指定が可能な領域」という仕組みも存在。
命令文 | 内容 |
---|---|
[space] | スタック操作 |
[tab][space] | 演算 |
[tab][tab] | ヒープアクセス |
[LF(改行)] | フロー制御 |
[tab][LF(改行)] | 入出力 |
サンプルプログラム
- 下記のサンプルプログラムで、簡単な文字列出力が可能。空白であるが、それがwhitespace
- 結果は、「Hello t_o_d」となる。
- その下のテキストは、スペースとタブを表した記号(SとT)の対応文と出力内容で、コードではない。
// 出力 : 「H」
SSSTSSTSSS
T
// 出力 : 「e」
SSSSSTTSSTST
T
// 出力 : 「l」
SSSSSTTSTTSS
T
// 出力 : 「l」
SSSSSTTSTTSS
T
// 出力 : 「o」
SSSSSTTSTTTT
T
// 出力 : 「スペース」
SSSSSTSSSSS
T
// 出力 : 「t」
SSSSSTTTSTSS
T
// 出力 : 「_」
SSSSSTSTTTTT
T
// 出力 : 「o」
SSSSSTTSTTTT
T
// 出力 : 「_」
SSSSSTSTTTTT
T
// 出力 : 「d」
SSSSSTTSSTSS
T
// 終了
SS
Emojicode
概要
- オープンソースのオブジェクト指向型プログラミング言語。
- 値や変数名以外は、すべて絵文字(Unicode)で記述。
- カラフルな絵文字を扱うため、視覚的にも楽しい。
- MacOS,Linuxで実行可能。
- 公式サイト
特徴
絵文字
- 「クラス定義・出力・条件処理」等の記述は、絵文字で記述。
- 下記、基礎的な処理の絵文字一覧。
- ※この他にもさまざまな処理を絵文字で記述できる。
絵文字 | 処理内容 |
---|---|
😀 | 出力 |
🍇処理🍉 | 処理のまとまり。開始と終了で囲む。 |
🏁 | 開始場所 |
💭 | コメント |
💭🔜 複数行コメント 🔚💭 | 複数行コメント |
🔤文字列🔤 | 文字列型として扱う。 |
オブジェクト指向
- 「クラス・インスタンス・メソッド・コンストラクタ」等、オブジェクト指向の仕組みで構成されている。
シンタックスハイライト不要
- 色での判別が、シンタックスハイライトなしでも、可能になる。
サンプルプログラム
- 下記のサンプルプログラムで、簡単な文字列出力が可能。
🏁 🍇
💭 結果 : 「Hello t_o_d」
😀 🔤Hello t_o_d!🔤❗️
🍉
まとめ
- 今回は、難解言語で遊びということで、世の賢人開発者達の高度な趣味に、振り回されながら記事を書く。
- 「一つの舞い上がり言語をとことん極めるのはいいかも」という、類まれなる移り変わり精神を持つ私の、安易思考。
- 次なる泥臭調査による未開開拓に、膨大な希望と他人依存心を持つことにしよう。
参考
-
https://www.narupi.net/2018/12/05/brainfuck/
→brainf*ckの参考にいたしました。大変お世話になりました。 -
https://magazine.rubyist.net/articles/0022/0022-Legwork.html
→whitespaceの参考にいたしました。大変お世話になりました。 -
https://trap.jp/post/605/
→Emojicodeの参考にいたしました。大変お世話になりました。