(12月20日)プログラミング言語研究の楽しみ
楽天技術研究所でオリジナルのプログラミング言語Egisonを開発している江木です。今日は、プログラミング言語を設計しているときに考えていることと、その結果として作ったプログラミング言語のオリジナルの構文について書いてみたいと思います。既存のプログラミング言語では,我々の頭の中のイメージをそのまま表現できないことがあります. このようなとき,我々は,頭の中のイメージを言語で表現するために,それを一度紐解いてプログラムとして記述せねばならず,結果できあがったプログラムは頭の中にあったイメージより煩雑になります.このような不都合は,我々が頭の中で行っている抽象化を,プログラミング言語による表現では抽象化できないときに生じます.我々が頭の中で行っているにも関わらず,プログラミング言語による表現ではできなかった抽象化が,新しい構文をプログラミングに導入することによってできるようになることがあります.プログラミング言語を研究していると,このような新たな構文を発見できることがあります.そのような発見は,プログラミング言語を研究する上での大きな楽しみのひとつです.私は上記のような発見を目指してプログラミング言語の研究を楽天技術研究所で行っています.同時に,今までに自身で発見した新しい構文を実装したオリジナルのプログラミング言語であるEgisonの開発も行っております.本記事では,私が新しくプログラミング言語に導入した2つの構文を簡単に説明したいと思います.1つ目はパターンマッチについての構文です.パターンマッチはプログラミングにおいて重要な機能です。パターンマッチにより、データの分解やデータの中身による分岐処理は、簡潔なマッチ式を1つで表現できます。しかし、従来のパターンマッチには、特定のデータ型のデータしか直接的な記述で操作できないという問題がありました。例えば、既存の言語のパターンマッチは、リストに対するパターンマッチはある程度得意ですが、要素の順序構造を無視する集合や多重集合に対するパターンマッチは難しいです。そのため、簡潔に記述することができない冗長なデータ操作がまだあります。Egisonは、この問題を解決するために作られたプログラミング言語です。Egisonは、パターンの表現力を強力にしてかつ、プログラマが集合や多重集合を含む一般的なデータ型それぞれに対しパターンマッチの方法を記述できるようにすることにより、アルゴリズムのより直接的な表現を実現しました。以下の例は、与えられたコレクションの要素のうち、2回以上現れる要素を列挙するプログラムを記述したものです。パターンマッチを用いなければ、2重ループを記述する必要があるところを、簡潔なパターンマッチ1つにより記述できます。2つ目は,テンソル解析を簡潔に記述するための構文です.例えば,テンソル解析には,以下のような有名な数式があります.これを,現在最も広く使われている数式処理システムであるWolfram言語(Mathematica)で記述すると以下のようになります.これを,Egisonで記述すると以下のようになります.この2つプログラムの間の本質的な違いは,Wolfram言語はTable式によるループ構造を数式の記述に用いるのに対し,Egisonは添字記法を用いることにより,数式を直接記述できているところにあります.Wolfram言語による記述では,Table式とSum式による二重ループがプログラム中に現れてしまっているところを,アインシュタインの縮約記法という数学記法もサポートするEgisonによる記述では,数式と同様にフラットにこの式を記述できています.テンソル解析は,応用の範囲がとても広い理論であり,それゆえに,テンソルの計算を簡潔に記述できると,多くの分野の専門的なプログラミングが簡潔になります.例えば,ここ数年,流行しているディープラーニングについて,いくつもの独立したフレームワークがオープンソースとしてもリリースされていますが,それらのフレームワークの中には行列やテンソルをプログラマが簡単に操作するための機構を提供しているものもあります.上記のような,我々の頭の中のイメージをより直接表現する新しい構文が,世の中に浸透させて,一般的なプログラミング言語にも導入されるようにすれば,現在のプログラミングの難しさ,プログラミングにかかる手間をもっと小さくできると期待して,研究を続けています.Egisonについては,多くの情報をウェブサイトのほうにもまとめておりますので,ぜひ試してみてください.Egisonの公式ウェブサイト