【目的無しの泥臭調査⑦】世に溢れる難解言語と呼ばれる「舞い上がり言語」を試して、脳内活性化

- ふと気になったことを、淡々と赴くままに調査していく、この上ない自己満足記事第七弾。
- 生涯をささげても把握しきれない膨大な技術情報を、ひとまず表面だけ吸い取ってく生活。
- 今回は、日々増殖を続けるプログラミング言語の中でも、思わず舞い上がってしまう「難解言語」と呼ばれるものに、触れていくことにしよう。

## 難解言語
- 難解言語(Esolang)とは、「記述性・実用性・可読性」が難解になるように作られたプログラミング言語。
- ユニーク性とビジュアル性にこだわったものが多くあり、エンジニアの趣味等で、日々たくさんの難解言語が作成されている。
- 「記号のみ」「絵文字のみ」といったものもあるなど、種類は多岐にわたる。
- [難解言語リスト](https://esolangs.org/wiki/language_list)

## 調査言語
- 難解言語はありとあらゆる数があるが、今回は下記の言語を取り上げる。
    - **Brainf*ck**
    - **whitespace**
    - **Emojicode**

- ※概要や特徴、サンプルプログラムのみとして、環境や各詳細な文法等は扱わない。

## 実行環境
- 今回調査した難解言語は、下記のオンライン実行環境を利用。
    - [Try It Online](https://tio.run/#)
        - 様々な種類の言語を試すことができる。

## Brainf*ck
### 概要
- 命令文が8種類のみで構成されたプログラミング言語。
- コンパイル(変換)を最小限に抑えるように設計されている。
- 難解でありながら、機能性と汎用性が高いことから、様々な派生言語が生まれている。
- 下品な名称を隠すために、`Brainf*ck`と表記する場合が多い。

### 特徴
#### 単純な値操作のみの処理
- 最初に準備される初期化(0)されたセル(配列)に、追加や移動等といった操作をしていくことで、処理が可能。

### 命令文の少なさ
- 下記の8種類の命令文で構成されているため、覚えることが少ない。

|命令文|内容|
|:---:|:---:|
|+|セルの値を1増やす|
|-|セルの値を1減らす|
|.|セルの値を出力する|
|,|セルの値へ標準入力を代入する|
|>|セルを1つ左へ移動|
|<|セルを1つ右へ移動|
|[|セルの値が0のときに、`]`の命令へいく。|
|]|セルの値が0でないときに、`[`の命令へいく。|

#### Atcoderで利用可能
- 競技プログラミングサイトの[AtCoder](https://atcoder.jp/?lang=ja)で利用可能である。

### サンプルプログラム
- 下記のサンプルプログラムで、簡単な文字列出力が可能。

```brainfuck
/* 出力 : 「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)の対応文と出力内容で、コードではない。

```
   	  	   
	
     		  	 	
	
     		 		  
	
     		 		  
	
     		 				
	
     	     
	
     	     
	
     			 	  
	
     	 					
	
     		 				
	
     	 					
	
     		  	  
	
  
```

```whitespace
// 出力 : 「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で実行可能。
- [公式サイト](https://www.emojicode.org/)

### 特徴
#### 絵文字
- 「クラス定義・出力・条件処理」等の記述は、絵文字で記述。
- 下記、基礎的な処理の絵文字一覧。
- ※この他にもさまざまな処理を絵文字で記述できる。

|絵文字|処理内容|
|:---:|:---:|
|😀|出力|
|🍇処理🍉|処理のまとまり。開始と終了で囲む。|
|🏁|開始場所|
|💭|コメント|
|💭🔜 複数行コメント 🔚💭|複数行コメント|
|🔤文字列🔤|文字列型として扱う。|

#### オブジェクト指向
- 「クラス・インスタンス・メソッド・コンストラクタ」等、オブジェクト指向の仕組みで構成されている。

#### シンタックスハイライト不要
- 色での判別が、シンタックスハイライトなしでも、可能になる。

#### サンプルプログラム
- 下記のサンプルプログラムで、簡単な文字列出力が可能。

```emojic
🏁 🍇
    💭 結果 : 「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の参考にいたしました。大変お世話になりました。