シカ部のためのプログラミング言語 "Shikairo" を作ってみた


# はじめに

> しかのこのこのここしたんたん
> しかのこのこのここしたんたん
> しかのこのこのここしたんたん
> しかのこのこのここしたんたん
> （ぬん！ぬん！）
>
> 『シカ色デイズ』より

この軽快なメロディを一度でも聞いたことがある方は頭にこびりついて離れなくなったことであろう。そして、気づいたら目の前にあるデバイスで「しかのこのこのここしたんたん」とググり、そのままアニメなり漫画なりを見始めたことであろう。それでも飽き足りずやがてはところ構わず「しかのこのこのここしたんたん」と連呼するようになり、終いにはすっかり頭シカ部とかしているに違いない。そして……

「次は何をしましょうかねぇ」
「パソコン叩いてるんだし、プログラミング言語でも作ったら？」
「あんこちゃん…　それ…　天才…………？」
「次の活動内容決まったわね」

というわけでふと思い立ったのでしかのこのこのここしたんたんにインスパイアされたプログラミング言語を作ってみようと思う。

（茶番終わり）

# 何をするのか

「シカ色デイズ」のイントロにあやかって「ぬん」「しか」「のこ」「こし」「たん」だけで構成されるプログラミング言語を作ってみたい。私の知る限りこういうときの手法としては Brainf\*ck 派生言語を作ることが多いようだ。有名どころだと Ook! や Whitespace、アニメネタでは Nyaruko や Kemono などがある（~~プログラミングもロクにできないのにこういうネタばっかり知ってる~~）。これらがどうやって作られたのかを調べていけばなんとか作れるだろう。プログラミング言語の仕組みなんもわからんけど。

ググってみたところ、 Brainf\*ck 派生言語を作るためのライブラリがいくつか見つかったので使用してみよう。見た感じ~~コピペでも~~なんとかなりそうだ。

では始めよう。言語の名前は……「シカ色デイズ」にあやかって "Shikairo" とでもしようか。

# まずは仕様を決めよう

Brainf\*ck は以下の 8 つの命令のみで形成されており、派生言語はそこに任意の言葉を割り当てることによって作成することができる。

-   `>` データポインタを 1 進める
-   `<` データポインタを 1 戻す
-   `+` データポインタの示す値を 1 増やす
-   `-` データポインタの示す値を 1 減らす
-   `.` データポインタの示す値を出力する
-   `,` 入力された値をデータポインタの示すバイトに代入する
-   `[` データポインタの示す値が 0 ならば，対応する次の`]`までジャンプする
-   `]` データポインタの示す値が 0 でなければ，対応する前の`[`までジャンプする

今回作成する言語もこのようにして単語を決める必要があるのだが、「ぬん」「しか」「のこ」「こし」「たん」では単語が 5 つしかないので工夫が必要である。
とりあえず「しかのこのこのここしたんたん」っぽさのあるコードを書きたいので、"Hello World" の出力されるコードを探してきて、そこに実際に各単語を当てはめて試行錯誤してみた（サンプルコードは[こちら](https://qiita.com/saba383810/items/39e20b11c71b3dfd2589)からお借りしました）。

```hello.bf
++++++++++[>+++>+++++++>++++++++++>+++++++++>+++++++++++>++++++++++<<<<<<-]
>>++.>+.+++++++..+++.<<++.>>>---.<.>>++++.<<---.>>>.
```

最終的にこうなった

-   `しか` データポインタを 1 進める
-   `こし` データポインタを 1 戻す
-   `のこ` データポインタの示す値を 1 増やす
-   `たん` データポインタの示す値を 1 減らす
-   `ぬーん` データポインタの示す値を出力する
-   `ぬぅん` 入力された値をデータポインタの示すバイトに代入する
-   `ぬん。` データポインタの示す値が 0 ならば，対応する次の`ぬん！`までジャンプする
-   `ぬん！` データポインタの示す値が 0 でなければ，対応する前の`ぬん。`までジャンプする

これを先程のコードに当てはめてみるとこうなる（見やすいように [Brainf\*ck のフォーマッタ](https://github.com/GeniusPenguin9/Brainfuck_All_In_One)で整形してある）。記念すべき Shikairo 最初のコードだ。

```hello.deer
のこのこのこのこのこのこのこのこのこのこ
ぬん。
    しかのこのこのこ
    しかのこのこのこのこのこのこのこ
    しかのこのこのこのこのこのこのこのこのこのこ
    しかのこのこのこのこのこのこのこのこのこ
    しかのこのこのこのこのこのこのこのこのこのこのこ
    しかのこのこのこのこのこのこのこのこのこのこ
    こしこしこしこしこしこしたん
ぬん！
しかしかのこのこぬーん
しかのこぬーん
のこのこのこのこのこのこのこぬーんぬーん
のこのこのこぬーん
こしこしのこのこぬーん
しかしかしかたんたんたんぬーん
こしぬーん
しかしかのこのこのこのこぬーん
こしこしたんたんたんぬーん
しかしかしかぬーん
```

:::
後でわかった話だが、`[` と `]` を`ぬん`と`ぬん！`にすると`ぬん！`が`ぬん`と認識されてしまうためエラーが発生する。そのため`ぬん`の最後に句点をつけた（実はこれに気づかずこのあと結構な時間を浪費しているがここで書いたのでそのへんは省略）。
:::

……よし、なんとかそれっぽくなったな。うん、なってる。そういうことにしよう。

# 実装しよう

Brainf\*ck 派生言語を作るライブラリはいくつかあるが、今回は Nyaruko の作者様が作った [masarakki/r-fxxk](https://github.com/masarakki/r-fxxk) を使用する。Nyaruko も Kemono もこれで作られている（というか Kemono はリポジトリ自体が Nyaruko のフォークである）。手順は以下の通り。このライブラリは Ruby のものだが私は Ruby に触れたことがなかったので少々細かく手順をメモしておく。

## 下準備

-   Ruby をインストールしておく。
-   GitHub にリポジトリを作っておく（以下、Git、GitHub の操作は省略する）。
-   なお、以下の操作はすべてワーキングディレクトリ直下で行うものとする。

## 作業手順

1. Gemfile を作成する

    - Ruby のライブラリ管理の方法はいくつかあるようだがここでは Gemfile を作成し、そこにライブラリを記載する方法を取る。
    - Gemfile の中身は以下の通り。

    ```ruby:Gemfile
    source 'https://rubygems.org'

    gem 'r-fxxk'
    ```

2. パッケージをインストールする

    - 以下のコマンドを実行する。
    - 実行後は `Gemfile.lock` が生成される。

    ```sh:sh
    bundle install
    ```

3. 実行ファイルを作成する

    - ここでは `shikairo` とする。
    - 実行ファイルには先程決めた仕様に沿ったプログラムを書く。

    ```ruby:shikairo
    #!/usr/bin/env ruby
    # -*- coding: utf-8 -*-

    require 'r-fxxk'

    class Shikairo < Brainfuck
      nxt "しか"
      inc "のこ"
      prv "こし"
      dec "たん"
      opn "ぬん。"
      cls "ぬん！"
      put "ぬーん"
      get "ぬぅん"
    end

    puts Shikairo.new.fuck(ARGF.read)
    ```

4. 先程作成した `hello.deer` を追加する
5. `shikairo` に実行権限を与える
    - 私の環境（Linux）ではこれが必要でした。人によってはいらないかもしれません。
    ```sh:sh
    chmod +x shikairo
    ```
6. 実行する
    ```shell-session:sh
    ./shikairo hello.deer
    Hello World
    ```

これにて完了である。

# 作ってみて

突然の思いつきで作成を始めた割にはすんなりと行ったなと思う。ハマったのも前述の`ぬん` `ぬん！`問題ぐらいのものだった。
正直なんのニーズもないような取り組みではあるが、少なくとも自分の勉強にはなったから良しとしよう。あと純粋にぬんぬん言ってるうちに Hello World が出せるのは面白かった。
今回作成した shikairo 言語は GitHub に公開しておくので奇特な人がいれば動かしてみてほしい。

<https://github.com/skyblue-jpn/shikairo_lang.git>

# 参考文献

1.  シカ部. シカ色デイズ. 2024. <https://lnk.to/LACM-24573d>, (参照 2024-12-11).
2.  ウィキメディアプロジェクトへの貢献者. “非常に小さい難解プログラミング言語”. Wikibooks.org. <https://ja.wikibooks.org/wiki/Brainfuck>, (参照 2024-12-11).
3.  “masarakki/nyaruko_lang: いつもニコニコあなたの隣に這いよる混沌ニャルラトホテプ言語ですっ”. GitHub. <https://github.com/masarakki/nyaruko_lang>, (参照 2024-12-11).
4.  consomme. “consomme/kemono_friends_lang: あなたはプログラミング言語フレンズなんだね！”. GitHub. <https://github.com/consomme/kemono_friends_lang>, (参照 2024-12-11).
5.  masarakki. “masarakki/r-fxxk: Generate your own BrainFuck-like language.” GitHub. <https://github.com/masarakki/r-fxxk>, (参照 2024-12-11).
6.  tbpgr. “Ruby で Brainf\*ck の派生言語を作成するための gem 『orenono』を作成してみた”. Qiita. <https://qiita.com/tbpgr/items/9d68fdb0d0e7bbccdd2c>, (参照 2024-12-11).
7.  benisho_ga. “10 分で作れる Brainf\*ck 派生言語:シロ組さん専用のプログラミング言語「siro」を作ってみた”. Qiita. <https://qiita.com/benisho_ga/items/50e674fded183a9e12f1>, (参照 2024-12-11).
8.  tellusium. “brainfxck で輝夜月風の言語を作ってみた”. Qiita. <https://qiita.com/tellusium/items/ffbe0ee5887b6d4151c4>, (参照 2024-12-11).
9.  saba383810. “はじめての「Brainfuck」入門”. Qiita. <https://qiita.com/saba383810/items/39e20b11c71b3dfd2589>, (参照 2024-12-11).
10. GeniusPenguin9. “GeniusPenguin9/Brainfuck_All_In_One: 🐧Brainfuck tools: analyzer, language server, vsc plugin, debugger server, interpreter.🐧”. GitHub. <https://github.com/GeniusPenguin9/Brainfuck_All_In_One>, (参照 2024-12-11).
11. SPC. “Brainf\*ck ライクなオリジナルネタ言語を作って遊んでみよう | ホームページ制作・Web マーケティング｜株式会社 SPC”. ホームページ制作・Web マーケティング｜株式会社 SPC |. <https://spc-jpn.co.jp/blog/6657/>, (参照 2024-12-11).
    ‌