ソフトウエアジャパンアワード受賞スピーチ

2015年2月3日

この度、Egisonについてソフトウエアジャパンアワードという大きな賞を頂けることになりました。 その受賞スピーチのために作成した15分のプレゼンテーションを公開します。 スピーチはソフトウエアジャパンにて2月3日の18:20-18:35に行われます。

#1

こんばんは。ご紹介に与りました江木です。 本日は「プログラミング言語Egison-表現の新たな抽象化の発見」というタイトルでスピーチさせて頂きます。

#2

私は現在楽天技術研究所に所属し研究を進めています。 研究の興味はプログラミング言語や自動推論の理論にあります。 私個人のWebサイトには、過去に書いた文章やソフトウェアをまとめておりますので是非訪れてみてください。

#3

本日の講演の流れを説明します。

まず最初にEgisonを作った理由をお話します。 その後、Egisonの概要をデモを交えながら説明します。 その後、これまでのEgisonの開発の歴史を振り返り、最後に、Egisonのこれからについてお話します。

#4

では、まずEgisonを作った理由についてお話します。

#5

そもそも「プログラミング言語とはなにか?」というところから始めます。

プログラミング言語とは、「単純な命令列しか理解できないコンピュータに対する要求を、人間が形式的に記述するための言語」です。 世の中には、C,(Java,)Ruby,Lisp,Haskellなど多くのプログラミング言語があります。 Egisonもその1つです。

#6

プログラミング言語の研究が難しい理由の1つに、人間の考えの直接的な(形式的)表現を見つけるのが難しいという理由があります。 既存の(プログラミング)言語では、未だに人間の考えをコンピュータ向けに翻訳して記述せねばならない場面があります。

#7

Egisonを作った理由は、私が人間の頭の中の認識のより直接的な(形式的)表現を発見したからです。 本日の講演では、このことについてお話します。

#8

では、Egison概要の説明とデモを始めます。

#9

Egisonは私が作ったオープンソースのプログラミング言語です。パターンマッチ指向という新しいパラダイムを掲げています。 継続的にリリースを重ねており、最初のリリースからは4年近く経っています。 「Egison」という名前は「俺が作った」という意味です。 拡張子も私の苗字である「egi」となっており、究極のオレオレ言語でもあります。

#10

Egisonの特徴は多重集合や集合を含む幅広いデータに対して柔軟なパターンマッチを表現できるところにあります。

この例では、コレクションxsの要素のうち2回以上現れる要素を列挙するプログラムを書いています。 このとき、コレクションの中の要素の並びの順番はプログラムの結果に関係ありません。 このような場合、要素の並びの順番を考慮しない集合概念である多重集合としてコレクションを扱いたいことがあります。

多重集合の例を挙げると、例えば、{a, a, b}と{b, a, a}は多重集合としてみなしたとき要素の順番が無視されるので同じものとみなされます。 しかし、{a, a, b}と{a,b}は要素の重複が考慮されるため違うものとみなされます。

既存の言語では多重集合としてコレクションを直接パターンマッチできないため、コレクションをリストとして扱い、2重にネストしたループを記述せねばなりません。 Egisonでは多重集合に対するパターンマッチが記述できるため、このようなシンプルなパターンマッチ式で同じことができます。

Egisonプログラム中の赤色の部分で多重集合としてパターンマッチすることを指定しています。

#11

これから、Egisonのより具体的なデモをお見せしていきます。

#12

最初のEgisonのデモとして、ポーカーの役判定プログラムをよくデモしています。 カードの並びの順番を考慮しない多重集合としてパターンマッチすることにより、すべての役についてそれぞれ1つのパターンで書くことができます。

#13

これはストレートフラッシュに対するパターンを切り出したものです。 すべてのカードのスートが同じで数が連番になっていることを表現しています。

#14

Egisonでは同じ名前の変数が、1つのパターン内に複数現れるようなパターンを書けます。 このようなパターンは非線形パターンと呼ばれています。 非線形パターンを使えることにより、パターンの表現力は大きく強力になっています。

#15

これはツーペアのパターン部を切り出したものです。

#16

アンダーバーははどんな値にもマッチするワイルドカードと呼ばれるパターンを表しています。 これを使ってスートはなんでも良いことを表現しています。 また、非線形パターンを使って、同じ数のカードが2組あることを表現しています。

#17

ポーカーのデモを見せると大抵麻雀はどうなのかと聞かれるので麻雀のデモも用意しています。 このプログラムは麻雀の上がり判定をするプログラムです。

#18

このように2つの同じ牌からなる雀頭、3つの連番の牌からなる順子、3つの同じ牌からなる刻子にマッチするパターンをモジュール化できます。 それにより上がり判定を1枚のスライドに収まるプログラムで記述できます。 Egison以外の言語で同じことを書くと、読むだけでも大変なプログラムになります。

#19

このデモはEgisonのパターンマッチにより双子素数を列挙するプログラムです。 双子素数とは差が2の素数のペアのことを言います。 例えば、(3,5)や(5,7)、(11,13)などがそうです。

この例は、素数の無限列に対し、この緑の部分のパターンをパターンマッチさせることにより、双子素数を列挙します。 このパターンは連続する要素の差が2である箇所にマッチするパターンとなっています。

#20

Egisonは、複数の結果を持つパターンマッチにも対応しています。 それにより、このパターンマッチ式により任意の個数の双子素数を列挙することができます。 この例では先頭5つの双子素数を列挙しています。

#21

最後により実用的な例として、グラフのパターンマッチの例をあげます。

これは巡回セールスマン問題を解くプログラムです。 東京駅から出発し、ここにあげた東京の5つの駅すべてを訪ね、東京駅に戻ってくる経路のうち運賃が最安値の経路を見つけるプログラムになっています。

この緑の部分のパターンにより、全ての駅を巡回する経路を列挙しています。 この部分を編集するだけで、色々な種類の経路を列挙することができます。

#22

この赤色の部分で、graphに対するパターンマッチの方法を定義しています。

Egisonでは、マッチャーというものを定義することにより、データ型ごとのパターンマッチの方法をプログラマが定義できます。 graphだけでなくリストや多重集合に対するマッチャーもプログラマが定義できるようになっています。

#23

これは、Egisonにより可能になったパターンマッチの機能をまとめたリストです。 まとめるとここに上げた4つの機能になります。

#24

この図は現在のプログラミング言語の理論地図を書いたものになっています。 今までは表現の抽象化については、主に関数のモジュール化の理論と型システムの理論が深く研究されてきました。

その中でEgisonは、今まで他の理論に比べて貧弱であったパターンマッチの理論を大きく発展させることにより、既存の理論の大きな穴を埋めた研究であると私は考えています。 そして、今まで深く研究されてきた2つの分野と同じくらいパターンマッチの理論は深く、大きな意味があることを示したと私は主張しています。 このような研究は歴史的にも希少で、本当に革新的であると私は主張しています。

#25

ここから、Egisonのこれまでの開発の歴史を振り返ります。

#26

Egisonのアイデアが生まれた発端は、卒業研究のために数学の定理を自動で予想するプログラムを書いている時でした。

私は、数学的推論の自動化や、プログラムの自動生成に興味を持って研究を始めました。 しかし、卒業研究を進めているうちに、人間の考えをコンピュータ向けに翻訳する必要のある既存の表現の上では数学的推論の形式化は難しいと認識し、そのときEgisonのアイデアを得ました。

#27

修士過程に進んだ後、1年をEgisonの構想だけに費やし、修士2年の5月にEgisonを初めてリリースしました。 初めてEgisonのパターンマッチの実行に成功した時、とても感動しました。 人生一仕事したと感じたほどです。

#28

リリースした直後、研究室の先輩、後輩4人がEgisonを理解して使い始めてくれました。 新しい理論の普及と研究の継続のためには、周囲に信じ、理解してくれる優しさがあることは、非常に重要だと感じています。 一番最初に理解して使い始めてくれた後輩には今も一番感謝しています。

#29

修士の2年はあっという間で、Egisonが世に広く認められることなく、大学を卒業することになりました。 ただ、有り難いことにEgisonの開発が未踏のプロジェクトの1つとして採択されたおかげで卒業後も半年間は研究を延長できました。

#30

しかし、半年の延長の甲斐なく、有名な企業の内定はEgisonではとれず、結局先輩が昔アルバイトをしていたという社員数が15人ほどの会社に入社しました。

しかし、驚いたことに社内でEgisonの将来性を認められ、入社して2ヶ月して会社の仕事でEgison開発させてもらえることになりました。 東京大学・筑波大学の優秀な学生を集め、新しく設計しなおしたEgisonを今までにない開発速度で開発しました。

しかし、残念なことにそのような開発は長くは続かずリリースの3ヶ月後には会社を退職してしまいました。

#31

このときは、既に結婚して子供ができていたため、本気で就活をしました。 当時面識のなかったRubyの作者で楽天技術研究所のフェローをしているまつもとさんに、「私を楽天技術研究所に入れてほしい」とメールを送るという無茶な行為もしました。 有り難いことにまつもとさんはメールに返信してくれ、私のことを研究所の所長の森さんに話してくださいました。 楽天技術研究所の方々にも面接で認められ、地に足がついた生活が送れるようになりました。

#32

楽天技術研究所に入ってからは、Egisonを多くのひとに知ってもらい理解してもらうことに注力しました。 そのためにEgisonのWebサイトを大きくリニューアルしました。

入所直後このようにシンプルで無骨だったWebサイトは、(次のスライドに移動)

#33

現在ではこのようにリニューアルしています。

#34

日本語のサイトも用意しています。

#35

このリニューアルのおかげで、Egisonの知名度は一気に世界に広がりました。 現在では、Egisonのメーリスに参加している海外のPh.Dの方もいます。

#36

また、萩谷先生に東京大学の授業でEgisonを取り上げて頂く約束を得ることもできました。 Egisonにはもっと有名になってもらい、このような流れが大きくなることを期待しています。

#37

最後に、Egisonが今後について私の考えをお話しします。

#38

まず、自動推論やプログラムの自動生成をはじめとするコンピュータサイエンスの各分野でEgisonの理論がきっかけでブレークスルーが起こることを期待しています。 (最初にお見せしたコレクションの要素のうち2回以上現れる要素を列挙するプログラムを思い出してください。 Egisonによるプログラムのほうが自動生成しやすいのは明らかだと思います。 Egisonのある世界とない世界は全く別の世界です。)

また、こういったブレークスルーが起こると同時にEgisonのパターンマッチの重要性が広く認識され、多くのプログラミング言語に当たり前に組み込まれることを期待しています。

そして、将来は学校で全ての子供がEgisonを学ぶようになると期待しています。

以降少しだけその根拠を補足します。

#39

現在は「習得が容易なプログラミング言語」が「直感をより直接的に表現できるプログラミング言語」よりも広く使われています。 それは、「直感のより直接的な表現」を理解するには、我々の頭のなかで行われている我々が意識できていない抽象化を理解する必要があるため、最初理解するのが難しいからです。

しかし、将来、コンピュータサイエンスの素養が当たり前になり、「形式化」の重要性を万人が理解するような世界になったら、後者の理解が当たり前になります。

そのような将来を見越して、Egisonのような言語を教育に真っ先に取り入れれば、国の将来にとって大きなアドバンテージになると私は主張します。

#40

Egisonの普及については、私はただの時間の問題だと考えています。 なぜなら、理論も実装も既にできているからです。

ただ、いつ普及するのかはわかりません。 普及のためには多くの方々にEgisonを勉強して理解していただくことが必要だからです。 そのための、わかりやすい説明や応用の作成、プレゼンテーションの努力ををこれからも続けていくつもりです。

Egisonをもっと多くの方々に理解して頂き、Egisonの先にあるもっととんでもない研究に本気で没頭したいというのが私の希望です。 応援して頂けると幸いです。

#41

今日のスピーチをまとめます。

「直感を直接的に表現できるプログラミング言語」こそが究極のプログラミング言語だという考えのもとに私はEgisonを作りました。 そのようにして作られたEgisonは最先端の「直感を直接的に表現できるプログラミング言語」です。 そして、Egisonのような本質的なプログラミング言語の進歩は、歴史を紐解いても数少ないすごい革新なのです。

#42

Egisonについて是非勉強してみてください。またはご存知の一番頭の良い方に薦めてみてください。 Egisonについてのお話や私の講演をもっとお聞きになりたいときは、いつでもお呼びください。

#43

ありがとうございました!


comments powered by Disqus
This website in other langauge: English, 日本語