スリーシェイクに入社しました

自作プログラミング言語「リンちゃんなう!」

この投稿は私の現在所属しているスターフェスティバル株式会社の スターフェスティバル Advent Calendar 2022 の17日目記事になります。

昨日はytakeさんによる「 現状と向き合ってシステムを考える時の頭の中」でした!

プロダクトが大きくなるにつれ生まれてくるコンテキストを境界付け、どのように課題に対して解決していくかといった壮大な内容でした!気になる方は読んでみてください!

こんにちは! k1rnt です。

今回はタイトルの通り自作プログラミング言語を作成したので紹介したいと思います。

今回実装したリポジトリはこちら

https://github.com/k1rnt/rinchan_now_go

リンちゃんなう!とは?

ガルナ(オワタP) により作曲、 rlldi/sezu により作詞され製作された楽曲の名前です。

https://www.nicovideo.jp/watch/sm16539814

とても愉快な曲なのでまず聴いてみてください!

また2021年に リンちゃんなう!Seasons も鏡音生誕祭として製作されています!

どんな言語を作ったの?

はい。言語を作ったと書きましたががっつりbrainf*ckのオマージュです。

brainf*ckを知らないは下記リンクを参考にしてください

https://ja.wikipedia.org/wiki/Brainfuck

上記リンクにもありますがこの言語はとても単純で命令が 8つ しかありません。

8つ の命令で構築できるなら 8文字 で同様な言語が作れるはずです。

そこで今回は私が小さい頃に散々聴いていた「リンちゃんなう!」がちょうど8文字だったことに気づき、じゃあこれで実装してみるか!と実装することにしました。

リンちゃんなう!言語が見たい!

https://github.com/k1rnt/rinchan_now_go/tree/main/rn_files

上記に複数まとめましたが、こんな言語です!

これは rinchan now! と出力するコードです

インタープリターの実装方法

https://github.com/k1rnt/rinchan_now_go/tree/main/pkg/rinchannow

こちらにインタープリターの実装は全てまとまっていますが少しだけ解説したいと思います。

こちらに今回使う命令を8つ定義しています。

コメントに書いてありますが8つの命令でポインタやメモリを操作したり入出力やループを行います。

こちらが上記命令を全て実装したファイルになります。

命令一個一個全てメソッドにまとめてありますので気になる方はご覧ください!

もう終わり?

はい、最初はこれで終わろうと思っていたのですがbrainf*ckのインタープリターの実装って世の中に溢れかえっているんですよね。

そこで今回はおまけとして任意の文字列からリンちゃんなう!言語を出力するコードも書いてみました。

リンちゃんなう!言語 ジェネレーター

https://github.com/k1rnt/rinchan_now_go/tree/main/pkg/gen_rn

こちらにジェネレーターの実装は全てまとまっています。

こちらはbrainf*ckを理解しなければならないので苦労しました...

簡単に説明します。

こちらについてはインタープリターのtoken.goと同様のため割愛します。

かなり複雑なのでざっくりとした説明になりますが、

このコードは文字列から1文字ずつを取り出して、ASCIIコードの値を比較します。指定された文字を1文字出力して「ち」か「ゃ」を連続して出力します。

その後、「ん」を出力しこれを文字列の最後まで繰り返しています。

rn_calでは、最初の条件を除いた場合、min[0] に 4 * n の値が代入されます。次に、1 から n までの範囲内で、p を変化させます。p は、生成される文字列の中で、「ち」 を繰り返す回数を表します。p の値を使用して、q = n / p、r = n % p という変数を定義します。これらの変数は、生成される文字列の中で、「リ」、「ン」 を繰り返す回数と他にも繰り返す回数を計算しています。

最後に計算された回数分の命令を結合して文字列として返す関数になります。

かなりざっくりした説明になるので気になる方は是非見てください!

実行方法

それぞれの実行方法はリポジトリのREADME.mdに記載しましたので試したい方は是非手元にGoの環境を用意して試してみてください!

https://github.com/k1rnt/rinchan_now_go/blob/main/README.md

おわりに

今回初めてプログラミング言語(bf)のインタープリターやその言語自体を生成するコードの実装してみましたがアルゴリズム力が鍛えられたり、メモリやポインタでこんなことができるんだ!と少し感動できるので是非みなさんもオリジナルの言語を開発してみてください!

ここまで読んでいただきありがとうございました!

明日は @YAhiru さんの記事になります!お楽しみに!

このエントリーをはてなブックマークに追加

コメント