プログラミングと絵と音楽

コンピューター科学を専攻し、絵と音楽を趣味とするエンジニアのブログです。

プログラミング言語を作る。第1回:構想

新しいプログラミング言語コンパイラを作りたいと思ってなかなか行動に移していなかったのですが、社会人になることですし、そろそろ開発をしていきたいと思います。
最初から道筋が決まっていてそれを解説するのではなく、作りながら試行錯誤を繰り返していく過程をブログに残しておくつもりです。一本道で進んでいくわけではありませんのでご了承を。最初で構想したことを後で変更する可能性もあります。

言語設計

今まで自分の触ったプログラミング言語の特徴などを考慮し、長所などを取り入れながら、体系的にまとまるように構成を考えます。
加えて、コンパイラ型にします。スクリプト型にはしません。

手続き型なのか関数型なのか、それ以外か

C++ のように、基本は手続き型で、オブジェクト指向が取り入れられた設計にします。
しかし、関数を定義する際には、参照透明性のある関数に関しては関数型言語の書き方などを取り入れても良さそうです。そういう意味では、色々な種類のプログラミング言語に影響された言語になりそうです。

どのようなデータを作るか

結論から先に言えば、イミュータブルな数値型と、ミュータブルなオブジェクト型に分類したいと思います。
イミュータブルは変更不可、ミュータブルは変更可という意味です。
イミュータブルな数値型はスマートな表現を可能にし、込み入ったデータを表したい場合はミュータブルなオブジェクト型にすることでそれぞれの利点を効率よく引き出してやろうという狙いです。
データ型について少し議論します。
手続き型プログラミング言語で、低級でアセンブリに近いC言語は、単純に int, char, float などの低級で CPU とのアクセスが用意に想像できる抽象度の低いデータと、それらの配列に加え構造体からなっています。構造体もデータが並んでいるだけのものなのでわかりやすいですね。
オブジェクト指向プログラミング言語Java は、 int や boolean のプリミティブ型と String やその他のオブジェクトにわけられます。ただ、Java のデータ型の分類は聊か不便であると思えます。なぜならば、例えばプリミティブなデータ型の int は参照渡しなどをすることができず、さらにオブジェクト型を扱う必要のある場面ではオブジェクト型 Integer に変換しないといけないのです。同じデータ型である以上、似たような扱いをしたいものです。この問題について、Scala はそれを解決しているように思えます。
新しくデータ型を作りたい場合は、JavaScala などでは、クラスを宣言します。ですが、これがちょっと冗長な場合もあります。例えば色のデータを保持する Color クラスを作りたい場合を考えてみましょう。フィールドには、赤と緑と青の値を表す変更不可な浮動小数点数を保持していて、二つの色 c1, c2 を加算+によって足し算する場合、赤緑青それぞれの値を加えたクラスを新たに作って返すというようなものです。加算によりクラスが生成されるので、何度も加算を行うとクラスが生成されたり、かと言ってフィールドを変更可のようなものにすると、使い回しが面倒になったり、困難になったりします。単純でイミュータブルなクラスというものを作りたい場合、OCamlHaskell などの関数型言語にあるレコード型が適任だと思います。レコード型にメソッドなどを簡単につけられる事ができれば、プログラムが綺麗になるのではと推測しています。これを新しい言語での数値型とします。
オブジェクト型は、中に含まれる変数や関数(メソッド)など、大体の言語で似たような構造をしていると思うので、とくに最初は漠然と考えながらすすめることにします。
純粋オブジェクト指向にするかどうかは考える必要があります。純粋オブジェクト指向RubyScala のように、全てのデータがオブジェクトになっているものを指します。ポイントは、これまで議論した数値型にもメソッドをもたせるかどうかです。これについては、現段階で純粋オブジェクト指向を考えています。

文法は

細かいことは決めていませんが、融通が利かないような文法、つまり柔軟な書き方がないような文法にすることによって、記述する人による表現の揺らぎが少なくなるようなものが良いと考えています。

どの言語で開発するか

少々高級な言語を使いたいと思っています。思い立った当初から、何となくですがD言語を使おうと思っていますが、Scala も良いかもしれません。Haskell で開発するのも挑戦的で楽しそうですが、難易度がかなり上がると思います。

使う外部ツール

LLVM に対応した言語にするのもありだと思います。まずはC言語のサブセットのようなプログラミング言語を作って、中間コード以降の処理も自作してみたいと思います。
Lex と YACC の利用も考えないといけません。自作していた YACC がありますが、表現能力が低いので使うかどうかはまた考えます。

言語名は

私は T.Furukawa なので、現段階では TFP という名前にします。P はプログラムの P です。

大まかな構想は以上で、まずはC言語のような低級な言語のコンパイラを試作してみて、どんどん変更や拡張を加えていくという手順でやっていきたいと思います。頑張ります。