ここ最近 せっかくプログラミング言語の作り方を勉強している最中だし、どうにか二郎のコール(いわゆる二郎語の一部)をプログラミング言語で再現できないだろうかと頭を悩ませていたが、最近ようやく ある程度形になってきたのでシェアする。
(正直な所、タイトルは「プログラミング言語」になっているものの、「やってる事ただのコンパイルじゃねーか」という感じになっちゃってます。 極めつけに「yaccとlex使ってるだけじゃねーか」って声が聞こえてきそうですが、どうか許してください )
test.jiroファイルの用意
以下は「二郎語」で書かれたファイル「test.jiro」である。「ニンニク入れますか?」を契機に、怒涛のコールが始まる。
「ニンニク入れますか?」「ヤサイニンニクアブラ」「ヌキ」「ヤサイニンニクアブラ」「ニンニク」「ニンニクアブラ」「ヤサイカラメ」「ニンニクアブラ」「ニンニクアブラカラメ」「ヤサイニンニクアブラ」「アブラ」「ニンニクアブラ」「ニンニクアブラ」「ニンニク」「カラメ」「ニンニク」「ニンニク」「アブラ」「カラメ」「ニンニクアブラ」「ヤサイアブラ」「ニンニクアブラ」「アブラカラメ」「ニンニクアブラ」「アブラカラメ」「ニンニクアブラ」「全マシ」「ニンニク」「ヌキ」「ヤサイアブラ」「ヤサイニンニクアブラ」「ニンニクアブラ」「全マシ」「ヤサイニンニクアブラ」「ニンニク」「ニンニクアブラ」「アブラカラメ」「ニンニクアブラ」「アブラ」「ニンニク」「ニンニク」「ニンニク」「ヤサイカラメ」「ヤサイニンニク」「ヤサイニンニクカラメ」
ソースコード(コール)内容: 「ニンニク入れますか?」「ヤサイニンニクアブラ」「ヌキ」「ヤサイニンニクアブラ」「ニンニク」「ニンニクアブラ」「ヤサイカラメ」「ニンニクアブラ」「ニンニクアブラカラメ」「ヤサイニンニクアブラ」「アブラ」「ニンニクアブラ」「ニンニクアブラ」「ニンニク」「カラメ」「ニンニク」「ニンニク」「アブラ」「カラメ」「ニンニクアブラ」「ヤサイアブラ」「ニンニクアブラ」「アブラカラメ」「ニンニクアブラ」「アブラカラメ」「ニンニクアブラ」「全マシ」「ニンニク」「ヌキ」「ヤサイアブラ」「ヤサイニンニクアブラ」「ニンニクアブラ」「全マシ」「ヤサイニンニクアブラ」「ニンニク」「ニンニクアブラ」「アブラカラメ」「ニンニクアブラ」「アブラ」「ニンニク」「ニンニク」「ニンニク」「ヤサイカラメ」「ヤサイニンニク」「ヤサイニンニクカラメ」
コンパイル
前述の二郎語によって記述されたコールをコンパイルするために、linux上で以下のようにコマンドを実行する。
./jiroparse test.jiro
すると、以下のように二郎語で書かれたコード(コール)をベースに「jiro.c」というC言語のファイルが出力される。
この中身を見てみると、二郎語によるコールがC言語に正常にコンパイルされてHello world が出力されていることがわかる( int main(void){ …、 return 0; } あたりの処理は割愛しております)。
printf("Hello World");
どういうことなの?
結局の所、データというのは バイナリの集まりである。
例えば、hello という文字列は 16進数で言う所の「68656c6c6f」である。この16進数文字列を分解すると「68」「65」「6c」「6c」「6f」となる。つまり、16進表現のセットさえつくることができれば良いわけなので、それぞれの二郎語によるコールについて、
・「ヌキ」…0
・「ヤサイ」… 1
・「ニンニク」…2
・「アブラ」…4
・「カラメ」…8
として割り当て、これらを組み合わせることによって成立する16進表現の2セット(=二郎語でのコール2回分)を「1文字」としてコンパイルする。
二郎語における16進表現 0~16、255の例
0 … 「ヌキ」「ヌキ」
1 … 「ヌキ」「ヤサイ」
2 … 「ヌキ」「ニンニク」
3 … 「ヌキ」「ヤサイニンニク」
4 … 「ヌキ」「アブラ」
5 … 「ヌキ」「ヤサイアブラ」
6 … 「ヌキ」「ニンニクアブラ」
7 … 「ヌキ」「ヤサイニンニクアブラ」
8 … 「ヌキ」「カラメ」
9 … 「ヌキ」「ヤサイカラメ」
10 … 「ヌキ」「ニンニクカラメ」
11 … 「ヌキ」「ヤサイニンニクカラメ」
12 … 「ヌキ」「アブラカラメ」
13 … 「ヌキ」「ヤサイアブラカラメ」
14 … 「ヌキ」「ニンニクアブラカラメ」
15 … 「ヌキ」「ヤサイニンニクアブラカラメ」(または「ヌキ」「全マシ」)
16 … 「ヤサイ」「ヌキ」
255 … 「ヤサイニンニクアブラカラメ」「ヤサイニンニクアブラカラメ」(または「全マシ」「全マシ」)
つまり、上記のセットの形態を取ることにより、たった4種類の二郎語だけで unsigned char が表現可能な0 ~ 255 までの値を全て表現することが可能となる。
例えば 上記に示した二郎語によるコード(コール)のうち、最初に記載されている「ヤサイニンニクアブラ」「ヌキ」という二郎語のコールはそれぞれ16進数で「7」「0」つまり70となり、これはprintfの「p」にあたる。
※ なお、一部のジロリアン、ロティスト、ロットマイスター、ロットマエストロのために糖衣構文として「ヤサイニンニクアブラカラメ」全てが入る場合は「全マシ」コールをサポートしている。
※ 「小ブタ大ブタサポートしてないのは二郎語として失格」って言われそうなので「小ブタ」「大ブタ」「小ブタダブル」「大ブタダブル」「小ブタW」「大ブタW」という二郎語のコールも一応サポートしている( ただし入れても全く意味が無いのでバイトを食うだけ )。
どうしてこんなバカな真似を…
この世の中、バカな真似ほど…狂気の沙汰ほど面白い…
因みに、元々ちゃんとプログラミング言語っぽくしようと思ったものの、二郎のコールや用語はプログラミング言語の文法規則を表現する上で相当ハードルが高く、流石に通常のプログラミング言語の作り方では表現できないと悟ったため上記の形式になった。
因みに brainf**kとかの言語は上のような冗長なことをせずにポインタ操作をすることで実装されているみたい。
Github ( 2014.04.18追記 )
とりあえずGithub上にソースコードを上げてみた。ファイル整理できてない上に誰が見てもまるっきりC言語初心者が書いたようなコードなので恥ずかしいが知ったこっちゃない。
それにしても人生で初めて上げたGithubのプロジェクトが二郎というのも複雑な心境。
そのまた後日 ( 2014.04.21追記 )
新代田にある二郎が4月末で一度お店を占めるということなので行ってきた。
当然店に入るとコールが飛び交っているんだけど、脳内で勝手に二郎語がコンパイルされてしまい(「ヤサイニンニクアブラ」が「7」に変換されてしまう)、もはや普通に二郎を食える身体ではなくなってしまった。
以上レポっす。チラシの裏すいません。
Written by Nisei Kimura ( 木村 仁星 )