江木聡志(Satoshi Egi)
email: egisatoshi 'at' gmail.com
site: http://hagi.is.s.u-tokyo.ac.jp/~egi/ (編集: 最新はhttp://www.egison.org/~egi/)
github: https://github.com/egisatoshi

志望動機

私はEgisonという強力なパターンマッチの表現力を持つプログラミング言語を開発しています。 その際、御社のH・Tさん(編集: 公開にあたり匿名化)に、言語の処理系を公開し始めた当初から興味を持って頂き、 Twitterで期待のツイートをしていただいていたことから、御社のことをよく知るようになり、強い興味を持つようになりました。

私が御社を志望する一番の理由は、御社でならプログラミングをするのが楽しそうだと感じたからです。 御社の社員の方々のブログやTwitterを読むと、御社でなら楽しくプログラミング技術を磨いていけそうだと感じました。

また御社なら、私の持っている能力も理解し、仕事にも役立てさせてもらえそうだと感じました。 私のその能力は、ある程度のコンピュータ科学の素養とセンスがなければ理解できないものであると思います。 世の中の多くの会社では、その部分の能力は無駄になり、悲しい思いをすることになりそうに思いましたが、 御社でなら役立てさせてもらえそうだと感じました。

アカデミックな技術を世の中に広めていきたいという御社の理念にも共感しました。 可能でしたらリサーチャーとして、御社で新しい知識を吸収すると共に、現在持っているアイデア以外にも新しいアイデア、技術を生み出して広めていきたいと考えています。

自己アピール

私の興味あることは、人間の直感を分析し、コンピュータにでも理解できる形で定式化することです。 プログラミングEgisonの設計は、アルゴリズムの表現の定式化という形で、その興味を具現化したものです。

私は、人間の思考の仕組みを完全に理解することを究極の目標としてコンピュータ科学の研究をしています。 人間は新しいアルゴリズムや証明を考えだすことができますが、それらを思いついたプロセスには全て理由があるはずです。 もし、その理由を全て分析し尽くすことができたならば、これから先に生まれる全ての理論を教えてくれるプログラムが書けるはずです。

その第一歩としてアルゴリズムの直感的な表現を与えようとする試みを行いました。 その成果物がプログラミング言語Egisonです。

ガベージコレクタを持ち、関数が第一級オブジェクトである関数型言語は、 それらの機能を持っていない他のプログラミング言語に比べて、 かなり人間の直感に近い形でアルゴリズムを表現する事ができます。

しかし、まだプログラミング言語の記述力では、人間の直感を直接記述しているとはとても言えない部分があります。 そのもっとも顕著な部分が正規形を持たないデータ(例えば、集合や多重集合のようなデータ)の分解の処理であると私は考えました。 例えば、既存のプログラミング言語では集合のパターンマッチを行う際、これをリストとして捉え直してパターンマッチを行います。 多くのプログラマは、この煩雑な作業を当たり前のことだと認識していますが、これは実はかなりのプログラミングの際の潜在的な精神的なストレスになっています。

Egisonでは、正規形を持たないデータ型に対してのパターンマッチの一般的な方法をモジュール化する方法を用意することによってこの問題を解決し、 これらのデータに対しても直接的なパターンマッチが行えるようになっています。

Egisonを見ていただくと、私には潜在的な問題を発見する思考力と、問題を解決するための設計力、実装力もあることがわかっていただけると思います。

プログラミング歴

私が今まで書いたソフトを紹介します。 ほとんどがGitHubで公開されています。

Egsh

大学2年生で情報科学科に進学したての頃に書いたUNIXのシェルプログラムです。 初めてC言語でmallocを書いた2ヶ月後に根性で完成させました。 プログラミングを始めたばかりだったので、本当に必死に毎日勉強してこのシェルを完成させました。

Schemeコンパイラ

大学3年生の冬学期のCPU実験の授業の際に実装したコンパイラです。 多くのコンパイラは、住井先生の書いたmin-camlを改造して作成されるのですが、私はフルスクラッチでコンパイラを実装しました。 Andrew W. Appelの"Compiling with Continuations"を参考に実装しています。

私が初めて関数型言語に触れたのは、情報科学科に入って半年たった2年の冬学期の後半のScheme演習の補習でした。 初めて触れたその日に関数型言語の便利さ(他のプログラミング言語に比べて直感的にシンプルにアルゴリズムが表現できること)に気づきのめり込みました。 次の日には、寝食を忘れてSchemeプログラミングに没頭した結果、Schemeインタプリタを初めて完成させました。 それから10日後には寝食はしていましたが、相変わらずSchemeプログラミングに没頭し、メタ循環インタプリタを完成させました。

コンパイラはその1年後の冬学期に半年かけて実装しました。 最終版を実装するまでに4回もフルスクラッチで書き直しています。 min-camlとは違って静的型チェックなどを行うことはできないのですが、call/ccなども実装されている非常にシンプルでわかりやすいコンパイラになっています。

プログラミング言語Egison

Egisonのアイデアを思いついたのは、大学を卒業する直前の3月でした。 与えられた入力に対する記述論理の論理式を自動生成するプログラムを書いている際に、このアイデアを思いつきました。

このプログラムを書く際にmap-with-both-sideという関数を記述しました。 この関数は3引数の関数とリストを引数に取り、2引数目のリストの要素それぞれについて、その要素と両側のリストを1引数目の関数に適用し、その結果をまとめたリストを返す関数です。

ふつうの関数型言語で書くのは、もちろん簡単ですが、少々面倒です。 それにストレスを感じてEgisonを思いつきました。 Egisonでは以下のように簡単にこの処理を表現する事ができます。

(match-all xs (List Integer) [<join $hs <cons $x $ts>> (f hs x ts)])

xsが処理の対象となるコレクションであり、fが対象のコレクションのそれぞれの要素について、その要素と両側のリストを受け取って値を計算する関数になっています。

最初のきっかけはこれでしたが、その後今までのパターンマッチではできなかったパターンマッチを実現するために、多くの新たな構文や仕組みを考えました。 以下はEgisonのパターンマッチの説明の際によく上げるプログラムのリストです。

最初の実装し始めるまでのEgisonの設計には1年を要しました。 最初の実装を始めたのは修士1年の3月頃です。 Haskellでコツコツ実装し、修士2年の5月末に最初のEgisonのインタプリタが完成し、Hackageを使って公開しました。 実はこれが私の初めてのHaskellプログラムです。 その後、修士論文を書くために言語の拡張、実装を続けていたのですが、修士2年の9月頃に未踏の公募に応募した結果採択され、 修士2年の2月から卒業後の8月まで未踏のクリエータとしてEgison開発に従事していました。

未踏期間中にはワークショップを開いたりなどさせていただきました。 そのおかげで、Egisonは徐々に日本のプログラミング界隈で名を知られつつあります。 また、Egisonに惚れ込み、開発を手伝ってくれる方々も現れました。

Gohantabeyo.com, Tomotomotter

Webアプリケーションを書くこともできます。 Gohantabeyo.comは私が実装したサイトではありませんが、研究室の先輩に管理を委託されたサイトで6万人ほどのユーザがいるWebサービスです。 Tomotomotterは僕が修士1年のときに作ったTwitter APIを使ったWebサービスです。 残念ながらほとんど流行りませんでした。 Twitterでフォローしあっている同士を友達とみなして、友達の友達とボトルメールできるアプリです。


[Top]