slsl開発記録(1)目標
なぜプログラミング言語を作るのか
プログラミングは楽しいです。 まずソフトウェアを使う側から作る側になってこそ、真にコンピュータを使えていると感じられます。 しかし理論を学べば、プログラミング言語処理系も単なるソフトウェアであると分かります。 プログラミング言語を使う側から作る側になってみると、より自信を持ってコンピュータを使えていると言えるでしょう。
自作○○はロマンです。 その題材の中でもプログラミング言語は、元から手続き型や関数型など多様性があるため、表現の場として適しています。 個人の作品としてのプログラミング言語からは、芸術作品から感じるのと似たような刺激を受けられます。 そういったものを自分でも持っておきたいと思いました。 そこで、新しい言語仕様と、この言語仕様を実装する最初の言語処理系を、じっくり作っていこうと思います。
どのようなプログラミング言語を作るのか
個人のプログラミング言語に実用性を求めるべきではないかもしれませんが、まず作者にとって実用であれば十分すぎるはずです。 既存のプログラミング言語に対して感じていた個人的な不満として、物理量や測定単位を扱えない点があります。 人気のプログラミング言語ならサードパーティーのライブラリを公開してくださっている方がいますから、この問題は解決できます。 また、既存の数式処理機能を持つ言語に対して感じる不満として、歴史的経緯からか静的型付けや名前空間などの恩恵を受けられない点があります。 この問題も解決できたからといって特に新規性があるわけではありません。 それでも、いわゆる数学や理科のような科目の学習を支援してもらえるような、自分にとって使い勝手の良い道具があれば良いと思います。 ただし製品や研究で使えるほどの厳密性は追い求めません。
実装の点で興味があるのは、様々な実行形式への対応です。 CPUの命令セットアーキテクチャもX86系やARM系など複数ありますが、VMでもJavaや.NETだけでなくWebAssemblyなど様々あります。 低レイヤーの学習にもなるので、一般的なOS上だけでなくブラウザ上でも実行できる処理系を目指します。 まずは実装のしやすさを考えて、命令セットアーキテクチャを独自に定義したVMによるバイトコード実行から始めます。 実行速度は追い求めませんが、複数の実行形式で速度を比較するのは面白そうです。 コンパイラのセルフホストよりは、言語サーバやパッケージマネージャなどエコシステムに注力した方が良いと思います。 コンパイル型実行が主要な他言語へのトランスパイラはよくありますが、インタプリタ型実行が主要な他言語からのトランスパイラも面白そうです。