ゆめかわいい言語？があるらしい

# 「ゆめかわふぁっきゅ」とは

HIRAGANA is KAWAII!

ひらがなの可愛さを伝えるために作られたネタプログラム。

かわいさのために、ひらがなしか出力できず、濁点も出力できないという業を背負った。

## いんとろ

ひらがなって可愛いですよね。
僕が個人でサービス作るときは絶対にサービス名をひらがなにします（嘘です）。

それで、最近 Brainf*ck なるものに触れる機会があったので「これひらがなでも作れるのでは？」と思い作ってみました。
言語は勉強も兼ねてRubyです。

試しにあいしてると表示させてみる。

``` i-love-you.yf
ゆめゆめゆゆゆ
ゆゆゆゆゆ
ゆゆめゆゆゆ
ゆゆゆゆめゆ
ゆゆゆゆゆ

ゆゆゆゆゆ
ゆゆゆゆゆ
ゆゆゆゆゆ
ゆゆゆめ
```

```
$ ruby yumekawa.rb run i-love-you.yf
> はしるのつらい。 // これはrunコマンドを打つと表示される。かわいいから表示させてる。
> あいしてる
```

かわいいですね。
ハローワールドもあります。

```hello-world.yf
ゆゆゆゆゆぁかゆゆゆゆゆふわっかゆめ
ふ
ゆゆゆゆぁかゆゆゆゆゆふわっかわめ
ふ
ゆゆゆゆゆぁかゆゆゆふわっかめ
ゆゆゆゆゆめ
ふ
ゆゆゆゆゆぁかわわわわふわっかゆめ
ふ
ゆゆゆぁかゆゆゆふわっかゆめ
ふ
ゆゆゆぁかわわわわふわっかわめ
ふ
ゆゆゆゆゆゆぁかわわわわふわっかゆめ
か
ゆゆゆゆゆぁかゆゆゆゆふわっかわめ
か
ゆゆゆゆゆゆゆゆゆゆぁかゆゆゆゆゆふわっかめ
ふふめ
かかめ
か
ゆゆゆぁふゆゆゆゆゆかわっふゆめ
```

```
$ ruby yumekawa.rb run hello-world.yf
> はしるのつらい。 // これはrunコマンドを打つと表示される。かわいいから表示させてる。
> はろぉ、わぁるとてんてん。
```

## そもそもbrinf*ckとは？

brainf*ck で Hello, World! 出力させるプログラム
難解言語といわれるやつです。

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

詳しくは解説しませんが、こんな感じで「Hello, World!」が出力されます。
変態ですね。
以下がわかりやすかったです。
[Brainfuck 超入門](https://qiita.com/TomoShiozawa/items/25dcce1540085df71053)

## おもなきのう

文字出力だけです。
メモリが１のときには「あ」を出力、２のときは「い」を出力みたいにしてます。
内部の配列でこんな感じで持っています。

```
@char_dict = [
'',
# 1
'あ', 'い', 'う', 'え', 'お', 'か', 'き', 'く', 'け', 'こ', 
'さ', 'し', 'す', 'せ', 'そ', 'た', 'ち', 'つ', 'て', 'と',
'な', 'に', 'ぬ', 'ね', 'の', 'は', 'ひ', 'ふ', 'へ', 'ほ',
'ま', 'み', 'む', 'め', 'も', 'や', '', 'ゆ', '','よ',
'ら', 'り', 'る', 'れ', 'ろ', 'わ', '', 'を', '', 'ん',
# 51
'ぱ', 'ぴ', 'ぷ', 'ぺ', 'ぽ', #55
#56
'ぁ', 'ぃ', 'ぅ', 'ぇ', 'ぉ', 'ゃ', 'ゅ', 'ょ', 'っ', #64
#65
'、', '。', '　', "\n", #67
]
```

なので、メモリが６８以上の時に出力（ゆめかわふぁっきゅでは「め」）をしても何も表示されません。

また、かわいさのためにひらがなと記号しか出力できません。
濁点は可愛くないので捨てました。


あいうえおかきくけこ、、、、、、と表示したい時はこんな感じで記述します。

```
ゆめゆめゆめゆめゆめ　// あ行
ゆめゆめゆめゆめゆめ　// か行
・
・
・
```



## こうそう

まず、ひらがなをBrainf*ckと対応させます
このとき、「ゆ」と「め」だけでゆめゆめしたソース（冒頭のi-love-youみたく）を書きたいので、ポインタのインクリメントを「ゆ」、アウトプットを「め」にしました。

| + | - | > | < | [ | ] | . |
|---|---|---|---|---|---|---|
| ゆ | わ | か | ふ | ぁ | っ | め |

input は作りませんでした。

## ぜんたいのしょりのながれ

初期化
↓
ソース読み込み
↓
各文字毎に処理を実行

の流れです。

### しょきかのしょり

まず、ポインタとかメモリを初期化します。

```yumekawa.rb
class Yumekawa
    attr :memory
    attr :pointer
    attr :loop_memory
    attr :loop_pointer
    attr :skip_count
    attr :char_dict
    attr :output
    def initialize
        @memory = Array.new(256, 0)
        @pointer = 0
        @loop_memory = Array.new(20)
        @loop_pointer = 0
        @skip_count = 0
        @output = ''
        initializeCharDict
    end
    def initializeCharDict
        @char_dict = [
            '　',
            # 1
            'あ', 'い', 'う', 'え', 'お', 'か', 'き', 'く', 'け', 'こ', 'さ', 'し', 'す', 'せ', 'そ', 'た', 'ち', 'つ', 'て', 'と',
            'な', 'に', 'ぬ', 'ね', 'の', 'は', 'ひ', 'ふ', 'へ', 'ほ', 'ま', 'み', 'む', 'め', 'も', 'や', '', 'ゆ', '','よ',
            'ら', 'り', 'る', 'れ', 'ろ', 'わ', '', 'を', '', 'ん',
            # 'が', 'ぎ', 'ぐ', 'げ', 'ご', 'ざ', 'じ', 'ず', 'ぜ', 'ぞ', 'だ', 'ぢ', 'づ', 'で', 'ど', 'ば', 'び', 'ぶ', 'べ', 'ぼ',

            # 51
            'ぱ', 'ぴ', 'ぷ', 'ぺ', 'ぽ', #55

            #56
            'ぁ', 'ぃ', 'ぅ', 'ぇ', 'ぉ', 'ゃ', 'ゅ', 'ょ', 'っ', #64

            #65
            '、', '。', '\n', #67
        ]
    end
end
```

次に、ソースを読みこむ処理と、各文字で分岐させる処理。

```yumekawa.rb
    def exec(source)
        # puts 'ゆめかわじっこう'
        # puts 'そーす：' + source
        source.split('').each do |char|
            step(char)
        end
        incrementMemory
        # puts @memory
    end
    def step(char)
        case char
        when 'ゆ'
            incrementMemory
        when 'め'
            output
        when 'か'
            incrementPointer
        when 'わ'
            decrementMemory
        when 'ふ'
            decrementPointer
        when 'ぁ'
            startLoop
        when 'っ'
            endLoop
        when 'き'
        when 'ゅ'
            incrementMemory
        end
    end
```

あとはそれぞれの処理を追加するだけですね。

その辺は[Brainfuckのインタープリタを作ろう](https://yryr.me/programming/csharp/beginner/object-model/sample-program/how-to-create-brainfuck-interpreter.html)という記事を大幅に参考にさせていただきましたので、詳解は譲ります。


## おわりに

ループで詰まってた時のツイートです。
おもしろいしかわいい。

https://twitter.com/kyamad9/status/1463010748771098627

実装は以下に置いています。

https://github.com/yamakoud/yumekawa-fackyu


参考：
https://qiita.com/TomoShiozawa/items/25dcce1540085df71053
https://yryr.me/programming/csharp/beginner/object-model/sample-program/how-to-create-brainfuck-interpreter.html