ハヌマーンの歌詞を使ってプログラム言語を作った話

目次

  1. 背景
  2. ハヌマーン言語の紹介
  3. そもそもなぜ作ったのか
  4. ハヌマーン言語の実装
  5. 自作言語を作るメリット
    1. 言語の設計
    2. インタープリタが書けるようになる
    3. 低レベルの知識がつく
    4. 変な言語でプログラミングするのが楽しい
    5. ハヌマーンの歌詞を改めて噛み締めた
  6. まとめ:自作言語は楽しい
  7. PR
  8. 関連記事

背景

こんにちは。 かりんとうマニア(@karintozuki)です。

ロックバンド、ハヌマーンをご存知でしょうか。

もしハヌマーンを知らないなら、この記事を読むよりもハヌマーンの曲をいくつか聴いた方が有意義ですので聴いてください。

さて、ハヌマーン、格好いいですよね。サウンドもともかく彼らの魅力の一つが、なんとも言えない世界観の歌詞だと思います。

その歌詞を使ったプログラミング言語、ハヌマーン言語を作ってみました。

ハヌマーン言語の紹介

早速ですがサンプルコードです。

以下はfizzbuzzのコードです。

ちなみに#で始まる行はコメントです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

# 3の倍数判定
そういちいち怒鳴るなって誰だって3の倍数でfizzしたい
演奏ハヌマーンでアナーキー・イン・ザ・2K
およそ空っぽの頭の中やけに響く英語のアナウンス
たった&1秒でも長く眠りたい
何しろ僕らは3歳だった
どうして?の問いに
愛してるって
捨て看板の女がぼやく「fizz」
演奏ハヌマーンでアナーキー・イン・ザ・4K
たった1秒でも長く眠りたい
答えになってないぜ兄さん
言う?武闘派に遭遇して同じように言う?

# 3の倍数判定
そういちいち怒鳴るなって誰だって5の倍数でbuzzしたい
演奏ハヌマーンでアナーキー・イン・ザ・3K
およそ空っぽの頭の中やけに響く英語のアナウンス
たった&1秒でも長く眠りたい
何しろ僕らは5歳だった
どうして?の問いに
愛してるって
捨て看板の女がぼやく「buzz」
演奏ハヌマーンでアナーキー・イン・ザ・4K
たった1秒でも長く眠りたい
答えになってないぜ兄さん
言う?武闘派に遭遇して同じように言う?

# メイン処理
演奏ハヌマーンでアナーキー・イン・ザ・0K
たった30秒でも長く眠りたい
演奏ハヌマーンでアナーキー・イン・ザ・1K
たった1秒でも長く眠りたい
気に喰わんね輪廻の概念
演奏ハヌマーンでアナーキー・イン・ザ・1K
もういちいち言わんだけで俺だって3の倍数でfizzしたい
もういちいち言わんだけで俺だって5の倍数でbuzzしたい
演奏ハヌマーンでアナーキー・イン・ザ・4K
どうして?の問いに
# セル4が1だったら改行
CR人間模様気付けばそれの虜になってる
演奏ハヌマーンでアナーキー・イン・ザ・4K
およそ空っぽの頭の中やけに響く英語のアナウンス
愛してるって
# セル4が0だったら数字を表示
演奏ハヌマーンでアナーキー・イン・ザ・1K
換気口の下でギニアピッグが云う
CR人間模様気付けばそれの虜になってる
答えになってないぜ兄さん
演奏ハヌマーンでアナーキー・イン・ザ・1K
たった1秒でも長く眠りたい
演奏ハヌマーンでアナーキー・イン・ザ・0K
見張り番の俺の落ち度を糾弾1円奪って先輩消える
全くを以って気に入らないね

ジョーク言語ですし、いわゆる難解言語(brainfu〇kみたいなやつ)なので実用性はゼロですが、条件分岐、ループ、関数をサポートしているのでfizzbuzzくらいは書けてしまいます。

キーワードの一覧はこんな感じで全てがハヌマーンの歌詞からきています。

なんとなく雰囲気が伝わるかともいます。

歌詞 機能
たったN秒でも長く眠りたい 要素にNを足す(Nは整数)
見張り番の俺の落ち度を糾弾N円奪って先輩消える 要素からNを引く
ヘッドホンをしてN秒ごとに変わる表情 要素にNをかける
零コンマN秒で片付く命 要素をNで割る
何しろ僕らはN歳だった 要素に{(現在の要素の値) mod N}の値を代入する
およそ空っぽの頭の中やけに響く英語のアナウンス 要素に0を代入する
名前を聞かれ思わず出鱈目な偽名を名乗ってしまった 要素に乱数(-2^16~2^16)を入力
演奏ハヌマーンでアナーキー・イン・ザ・NK N番目の要素に移動
気に喰わんね輪廻の概念 ループ開始
全くを以って気に入らないね ループ終了
どうして?の問いに 条件分岐を開始
愛してるって 条件分岐else部の開始
答えになってないぜ兄さん 条件分岐終了
そういちいち怒鳴るなって誰だって{関数名}したい 関数定義開始
言う?武闘派に遭遇して同じように言う? 関数定義終了
もういちいち言わんだけで俺だって{関数名}したい 関数呼び出し
換気口の下でギニアピッグが云う 要素の値を数字として表示
こめかみを指して痩せた鴉が云う 要素の値をunicode pointとして解釈し文字を表示
捨て看板の女がぼやく「X」 Xを標準出力にプリント
CR人間模様気付けばそれの虜になってる 改行を標準出力にプリント

もっと詳しく知りたい人は言語の詳細をREADMEに書いてあるので、そちらも見てみてください。

https://github.com/karintomania/hanuman

この記事では自作の言語を作った感想・学んだことを書いていきます。

そもそもなぜ作ったのか

考えすぎて馬鹿になって発狂しすぎて普通になって

brainfu〇k(以下BF言語と表記)のことはご存知でしょうか?

おそらく難解言語界隈(?)のなかで一番有名なものだと思います。

BF言語について聞いたことはあったものの詳細は知らなかったため、調べ始めたのが始まりでした。

そこでEsolang wikiという難解言語、ジョーク言語をたくさん解説しているサイトに出会いました。

https://esolangs.org/wiki/Main_Page

よくできた賢い言語もある一方で、ふざけた言語もあります。というかふざけた言語の方が多いですね。

余談ですが、中でもA e s t h e t i c sとArnoldCという言語がとくに気に入ってます。

https://esolangs.org/wiki/%EF%BC%A1%EF%BD%85%EF%BD%93%EF%BD%94%EF%BD%88%EF%BD%85%EF%BD%94%EF%BD%89%EF%BD%83%EF%BD%93

https://esolangs.org/wiki/ArnoldC

これらがなければ多分、ハヌマーン言語は存在しませんでした。

自作プログラミング言語を作るというと、ちゃんとしたものを作らないといけないと思っていましたが、気軽にふざけた言語を作っていいのだと気づいた瞬間です。

いろいろ考えた結果、好きなバンド、ハヌマーンにちなんだ言語を作ることにしました。

ハヌマーン言語の実装

一応、技術ブログなので、技術的なところも触れておきます。

実装にはzigを使っています。

構成はシンプルで、パーサーとインタープリターがあるだけです。

BF言語のようにインタープリターだけで事足りるかとも思ったのですが、ループや条件分岐、関数があることと、歌詞がシンプルに長くパースがごちゃごちゃするのでパース処理を分けてASTを処理したほうが楽だということになりました。

また、1行につき1つの歌詞(命令)としたことでパースがとても楽になっています。こうやって言語仕様を実装の都合で変えても誰にも文句を言われないのが自作言語の良いところですね笑。

自作言語を作るメリット

自作言語を作ってみて良かったことを書いていきます。

言語の設計

自分の好きなように設計できます。ぼくのかんがえたさいきょうの言語が作れるわけです。

今回はハヌマーンにまつわる言語なのでキーワードの選定にこだわったわけですが、こだわりたいポイントで好きなだけこだわれるのは良いですね。

あとは普通に言語を設計するのが勉強になります。ASTみたいな概念はプログラミングするうえで知っておくといい気がしているので、そのような普段使う言語の根底にある原理がわかるようになるのはいいことですね。

インタープリタが書けるようになる

当たり前ですが、言語を作るときはインタープリター(もしくはコンパイラ)を作る必要があります。

その知識があっても特に実務で役にはたちませんが笑、確実にプログラミングに詳しくなれます。

まあ、でもいつか自作のDSLや既存の言語やフォーマットのパーサーを作ることはあるかもしれないので、絶対に役に立たないということはないと思います。

低レベルの知識がつく

もちろん、どの言語で実装するかによりますが、どうせなら低レベル言語で書くことをお勧めします。

ハヌマーン言語はzigで書いたので、普段PHPを書いている私にとってはかなり勉強になりました。Goとかでもよかったのですが、zigのタグ付きユニオンが便利すぎたのでzigにしました。

たくさんの文字列を効率よく処理する必要があるプログラミング言語は低レベルの知識を身につけるいい題材だと思います。

変な言語でプログラミングするのが楽しい

ハヌマーン言語のように普通のいわゆるCライクな文法からかけ離れた自作言語を作ると、その言語でプログラムを書くときに普段使わない脳みその部分を使うことになります。

まあ、それが良いことなのかと言われると微妙ですがとにかく新鮮でパズルを解く感じがあって楽しかったです。

ハヌマーンの歌詞を改めて噛み締めた

これは完全にハヌマーン言語特有のメリットですが、歌詞を読みまくったので新たな発見があって普通に良かったです。

まとめ:自作言語は楽しい

さて敷居が高いと思われがちな自作言語ですが、結構気楽に作ってしまえるということが伝わったでしょうか?

ハヌマーン言語ではコードの量も少なくメインロジックのパーサーとインタープリターを合わせても600行くらいしかありません(テストを入れても900行くらい)。

今は特にAIもあるのでAIと学びながらやっていくのもいいと思います。

楽しいので皆さんもぜひトライしてみてください。

それじゃ今日はこの辺で。

PR

エンジニアならドメインのひとつやふたつ、持っておきたいですよね。
ドメイン取得にはお名前ドットコムがおすすめです。

関連記事

こちらの記事もおすすめです。

自作エンコーディングのエンコーダーでエンコーダー自身をエンコードしてみた