javascript/C言語/アセンブラを用い、 字句解析、構文解析、インタプリタ、コンパイラのプログラムをスクラッチから作りながら、 「プログラミング言語の作り方」を解説する。
「自作プログラミング言語を作る」にあたり、 どうアプローチしていくか整理しておこう。
プログラマなら、一度は、既存のプログラミング言語について、 何かしらの不満を抱いたことがあるだろう。
既存のプログラミング言語に満足せず、「こんなプログラミング言語があったらいいのに」という想いさえあれば、 「プログラミング言語の作り方」を勉強しようとする動機として十分だ。
「こうしたい」という想いがないと失敗する。
そうでないと、学術的にどうだ、セキュリティ的にどうだ、宗教論的にどうだ、 あの言語がこうやっているから同じにしよう、流行りだから、 という、 わざわざ新しい言語を作るのに、よくわからない言語仕様になってしまうだろう。
これは避けよう。
「こうしたい」という想いが強いほど、 どんな自分オリジナルのプログラミング言語を作ろうか、想像するのはとても楽しい。一番楽しい時間だ。
しかし、あれもやりたい、これもやりたいと、機能てんこ盛りの言語仕様を考えても、作るのに骨が折れるだけで疲れてしまう。
逆に、電卓のような数値計算するだけの機能限定の言語を作ってもつまらない。
自分オリジナルといっても、何も奇抜な表記方法を使う、特殊な言語を作る必要はない。
既存言語±αで、要らない制約を落として、かゆいところに手が届くような便利な機能を追加しよう。 「そうそう。これでいいんだよ」くらいがちょうどいい。
既存言語±αとはいっても、最初から既存言語と同等のプログラミング言語を作ろうとすると、途中で挫折してしまうだろう。
そこで、第一目標としては、機能は小さく限定的でも、実際に動く「プログラミング言語を作る」ことが重要だ。
第二目標としては、満足せずに、繰り返し、育てていく。 言うのは簡単だが、継続が一番難しい。
これからプログラミング言語を作っていく開発環境として、OSにLinuxを用いる。
Linux環境を物理的に用意しても良いが、 便利な世の中になったもので、Windows上に、Linuxをインストールできる。
「WSL2 インストール」などで検索して欲しい。
自作プログラミング言語を開発するための、プログラミング言語として、javascript(Node.js)、C言語、アセンブラを使う。
まず最初に、機能を絞った言語仕様の自作プログラミング言語を作り、全体の概要をつかむ。
いきなりC言語で実装できなくはないが、 開発初期のタイミングでは、javascript(Node.js)のような簡易な言語で実装する方が、言語開発に集中できて良いだろう。 Node.jsのインストール方法は、検索して欲しい。
ある程度、「プログラミング言語の作り方」の概要が理解できたら、C言語を使った本格実装に移ることにする。
当然、コンパイラを作る場合には、アウトプットとして、アセンブラ言語を用いる必要があり、 簡単なアセンブラの知識が必要だ。
なぜ、わざわざC言語で作り直すのだろうか?
初期はjavascriptを用いることで、言語開発に集中できるメリットがある。 しかし、javascriptが便利すぎるため、 いざ、(コンパイラで出力する)アセンブラで実装しようとしたときに、 あれ?どうすればいいんだっけ?となってしまうことが常だ。
アセンブラを直接手で書くと大変なので、アセンブラをイメージできるC言語を使うことで、 あーそういうことね、と距離感を縮めて考えることができるからだ。
「プログラミング言語の作り方」を学び始めた理由が、既存言語への不満だったのに、 開発言語が他言語のままだと、いつまでも開発言語に対する不満から離れられない、というジレンマに陥る。
そこで、自作プログラミング言語で、自作プログラミング言語自体をコンパイル、つまり、セルフホスティングしてしまえば、 既存言語にまったく縛られない楽しい世界が開けるだろう。 (直接機械語を出力しない限り、アセンブラは必要だが…)