pfiセミナー 2013/02/28 「プログラミング言語の今」

65
プログラミング言語の今 PFI セミナー 2013/02/28 田中英行<[email protected]>

Upload: preferred-infrastructure-preferred-networks

Post on 24-May-2015

14.917 views

Category:

Technology


0 download

DESCRIPTION

PFIセミナー 2013/02/28 田中英行「プログラミング言語の今」

TRANSCRIPT

Page 1: PFIセミナー 2013/02/28 「プログラミング言語の今」

プログラミング言語の今PFIセミナー 2013/02/28

田中英行<[email protected]>

Page 2: PFIセミナー 2013/02/28 「プログラミング言語の今」

自己紹介

田中英行 (@ tanakh, http://tanakh.jp/ )

(株)Preferred Infrastructure 研究開発部門

Haskell愛好家

拙訳「すごいHaskell楽しく学ぼう!」好評発売中!

Page 3: PFIセミナー 2013/02/28 「プログラミング言語の今」

本日の概要

プログラミング言語って?

みんな書いてるものだけど

研究ってどんなことするの?

プログラミング言語研究の最前線

どういうことやってるの?

面白さとか

Page 4: PFIセミナー 2013/02/28 「プログラミング言語の今」

プログラミング言語の学会

Page 5: PFIセミナー 2013/02/28 「プログラミング言語の今」

プログラミング言語学会四天王(Impact Factorに基づく)

POPL PLDI

OOPSLAICFP

Page 6: PFIセミナー 2013/02/28 「プログラミング言語の今」

プログラミング言語学会四天王

POPL PLDI

OOPSLA SPLASHICFP

Page 7: PFIセミナー 2013/02/28 「プログラミング言語の今」

:::::::: ┌─────────────── ┐:::::::: | OOPSLAがやられたようだな… │::::: ┌───└───────────v───┬┘::::: |フフフ…奴はSIGPLAN四天王の中でも最弱 … │┌──└────────v─┬────────┘| たった24回でリニューアルとは│| OOPの面汚しよ… │└────v────────┘

|ミ, / `ヽ /! ,.──、|彡/二Oニニ|ノ /三三三!, |!`,‘ \、、_,|/-ャ ト `=j r=レ /ミ !彡

T 爪| / / ̄|/´__,ャ |`三三‐/ |`=、|,=’| /人 ヽ ミ=‘/|`:::::::/イ__ ト`ー く__,-, 、 _!_ / / `ー─’“ |_,.イ、 | |/、 Y /| | | j / ミ`┴‘彡\

POPL PLDI ICFP

Page 8: PFIセミナー 2013/02/28 「プログラミング言語の今」

POPL

ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages

今年で40周年を迎える、プログラミング言語のトップカンファレンス

プログラミング言語全般に関する話題

Parallel, Concurrent

Semantics

Type Systems

Formal Verifications, Proof, etc…

近年はテーマが発散気味

Page 9: PFIセミナー 2013/02/28 「プログラミング言語の今」

豊富な併設イベント

Page 10: PFIセミナー 2013/02/28 「プログラミング言語の今」

どんなことやってるの?

プログラミング言語全般の研究

「Principles」 of Programming Languages…

特に人気のあるジャンルは、細分化されてワークショップに

Verification Model-Checking Abstract-Interpretation

Practical Aspects of Declarative Languages

Partial Evaluation and Program Manipulation

Data-Driven Functional Programming

etc…

Page 11: PFIセミナー 2013/02/28 「プログラミング言語の今」

DDFP

(Data-Driven Functional Programming)

乗るしかない、このBigDataに!

という感じの今年出来たワークショップ

とにかくナウい

Page 12: PFIセミナー 2013/02/28 「プログラミング言語の今」

tryF#

http://www.tryfsharp.org/

来るべきBigData時代を見据えて(?)プログラミング言語はどうあるべきなのか?

F# 3.0では Information Rich プログラミングというものを標榜していた

tryF# では、Webで Information Rich プログラミングを体験できる

Webの開発環境が恐ろしい完成度

Page 13: PFIセミナー 2013/02/28 「プログラミング言語の今」

プログラミング言語って何ですか?研究するものなんですか?

Page 14: PFIセミナー 2013/02/28 「プログラミング言語の今」

あなたにとってのプログラミング言語とは?

科学?

数学?

魔法?

宗教?

文学?

哲学?

Page 15: PFIセミナー 2013/02/28 「プログラミング言語の今」

科学的立場:研究と現場の乖離

(´・_・`)実際問題意識ある

Page 16: PFIセミナー 2013/02/28 「プログラミング言語の今」

研究と、実用までの隔たり

20

20

技術

・GC

・型推論・ラムダ式・etc…

Page 17: PFIセミナー 2013/02/28 「プログラミング言語の今」

魔術としてのプログラミング

Page 18: PFIセミナー 2013/02/28 「プログラミング言語の今」

文芸としてのプログラミング

Page 19: PFIセミナー 2013/02/28 「プログラミング言語の今」

宗教としてのプログラミング言語

http://www.bugbearr.jp/?プログラミング言語%2F宗教論争

Page 20: PFIセミナー 2013/02/28 「プログラミング言語の今」

謎の喩えの数々

刃物

ユーザ

Page 21: PFIセミナー 2013/02/28 「プログラミング言語の今」

プログラミング言語とは何なのか?

コンパイラはどこに入る?

アプリケーション

ミドルウェア

OS

ハードウェア

(´・_・`)どこに入るとも言い難い…

Page 22: PFIセミナー 2013/02/28 「プログラミング言語の今」

プログラミング言語が、ほかの計算機科学の分野と異なる点

プログラミング言語処理系、それ自身がプログラムである

プログラミング言語は、本質的に自己言及を伴う分野である

(かつ、本質的にすべてのプログラマに影響を与える)

油断すると、あらゆる矛盾、パラドクスがやってくる

(´・_・`)「そしてパラドクスは、哲学、オカルト、最終的には宗教まで介入させる」

(`・д・´)「宗教て!」

Page 23: PFIセミナー 2013/02/28 「プログラミング言語の今」

自己言及のパラドックス(嘘つきのパラドックス)

「この文は偽である」← は真か偽か?

(´・_・`)「真だとすると、「この文は偽である」というのが偽になって矛盾するし、偽だとすると、「この文は偽である」が真になってしまうし……」

(`・д・´)「どっちやねん!」

Page 24: PFIセミナー 2013/02/28 「プログラミング言語の今」

ラッセルのパラドックス(素朴集合論)

自分自身をそれに含まないものの集合をA、含むものの集合をBとする

「Aの要素全てからなる集合」は、A、Bどちらに含まれるのだろうか?

(´・_・`)「Aに含まれるとすると、その集合は自分自身を含まないことになるけど、そうすると、その集合がAに含まれるのはおかしいし、Bに含まれるとしても、逆の理由でおかしくなるし…」

(`・д・´)「どないやねん!」

Page 25: PFIセミナー 2013/02/28 「プログラミング言語の今」

ラッセルの型理論(階型理論)

素朴集合論の問題を解決するために、構築される

自己言及的な命題を記述できないようにすればいい

(詳細は略)要するに、式を型で分類するという発想

「プリンキピア・マテマティカ」にて定義

現代のプログラミング言語における、型理論、型システムの礎

Page 26: PFIセミナー 2013/02/28 「プログラミング言語の今」

ゲーデルの不完全性定理

「プリンキピア・マテマティカと関連体系における決定不能な命題についてI」

第1不完全性定理

自然数論を含む帰納的に記述できる公理系が、ω無矛盾であれば、証明も反証もできない命題が存在する。

第2不完全性定理

自然数論を含む帰納的に記述できる公理系が、無矛盾であれば、自身の無矛盾性を証明できない。

Page 27: PFIセミナー 2013/02/28 「プログラミング言語の今」

どういうこと?

ゲーデルの定理では、ゲーデル数というものを持ち出すことにより、巧妙に型の間をすり抜け、不完全性を導く……

(´・_・`)「なるほど、わからん!」

(`・д・´)「という人には、『数学ガール ゲーデルの不完全性定理』がお勧めだ」

Page 28: PFIセミナー 2013/02/28 「プログラミング言語の今」

時に数学は、数学の世界の外で語られる

フェルマーの最終定理が話題に

最近だとペレルマンによるポアンカレ予想の解決

ゲーデルの定理は、昔から根強く、最も人気のあるコンテンツの一つ

(´・_・`)「数学以外でも、シュレディンガーの猫やら、相対性理論やら、ヴィトゲンシュタインやらはよく出てくるね」

(`・д・´)「ライトなSFがお手軽にインテリ風になるらしいぞ!」

Page 29: PFIセミナー 2013/02/28 「プログラミング言語の今」

数学の世界の外で起こること

「なんかすごい定理が証明されたらしいぞ!」

「えー、それってどんなことなのー?」

「詳しいことはよくわからんけど、こういうことらしいぞ」(めいめいが、自分の言葉で自分の理解を語り始める)

(´・_・`)「まあ、僕も数学の世界の中のことはよく知らないんで」

(´-_-`) …「そんな時代もありました」

Page 30: PFIセミナー 2013/02/28 「プログラミング言語の今」

ゲーデルの不完全性定理?

(´・_・`)「公理系が無矛盾であれば、それは自身の無矛盾性を証明できない」

( ˘⊖˘) 。O(待てよ……!?)

|\ __ /_ (m) _ピコーン

|ミ|/ .`´ \

∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄(´・_・`∩< 数学の証明なんて全部間違いやったんや!!(つ 丿 \_________⊂_ ノ

(_)

Page 31: PFIセミナー 2013/02/28 「プログラミング言語の今」

ゲーデルの定理の濫用例

「ゲーデルの不完全性定理は、客観的現実の存在は証明できないことを示している」

「ゲーデルの不完全定理によって、全ての情報は本質的に不完全で、自己言及的である」

「存在と意識を同等に考えることによって、私たちはゲーデルの不完全性定理を進化論に応用できる」

「ゲーデルの定理こそ汲めども尽きぬ知識濫用の泉である」(アラン・ソーカル、ジャンブリクモン)

トルケル・フランセーン「ゲーデルの定理利用と誤用の不完全性ガイド」より

Page 32: PFIセミナー 2013/02/28 「プログラミング言語の今」

そして一人歩きし始める

「ゲーデルの不完全性定理は、数学的なアプローチや証明なしにも直感的に理解しうるものである。実際、禅仏教思想の中にも明瞭にそれとわかる形で不完全性定理の概念が出現しているからだ。」

トルケル・フランセーン「ゲーデルの定理利用と誤用の不完全性ガイド」より

Page 33: PFIセミナー 2013/02/28 「プログラミング言語の今」

濫用の背景

定理に出てくる専門用語が、日常で使われている言葉

「矛盾」「無矛盾」

「完全」「不完全」

「体系(システム)」

インフォーマルな意味で解釈すると

とても破天荒なことを言っている

面白いし、いろいろなアイデアと結び付けられてしまう(けど大抵は意味を成さない)

ゲーデルの定理の応用は、多くの人が期待するようなものではなく、正しく数学的な定義に従ったものに限られる

Page 34: PFIセミナー 2013/02/28 「プログラミング言語の今」

(チューリングマシンの)停止性問題

プログラム(チューリングマシン)が(有限時間で)停止するかどうかを判定する問題

停止性問題を解くプログラム(チューリングマシン)は存在しない(チューリングマシンの停止性問題は決定不能)

対角線論法による証明が有名で、よく例として出てくる

Page 35: PFIセミナー 2013/02/28 「プログラミング言語の今」

停止性問題の濫用

http://d.hatena.ne.jp/sumii/20090310/p2

http://d.hatena.ne.jp/noopable/20090528/1243503981

Page 36: PFIセミナー 2013/02/28 「プログラミング言語の今」

語りえぬものについては、沈黙しなければならない

ルートヴィヒ・ウィトゲンシュタイン「論理哲学論考」命題 7

※誤用です

Page 37: PFIセミナー 2013/02/28 「プログラミング言語の今」

さて、プログラミング言語を語るにあたって

プログラミング言語、及びそれにまつわる研究を語るにあたっての“ここでの”前提

プログラミング言語研究は科学である

プログラミング言語に関する定理、証明、その他全てのものについて、

好む好まざる

哲学的

宗教的

魔術的

あるいはその他

の立場に基づく、あらゆる誤用、自由連想を控えなければならない

(´・_・`)「プログラミング言語?ただのテクノロジーですよ」

Page 38: PFIセミナー 2013/02/28 「プログラミング言語の今」

POPLに見る、プログラミング言語研究の今

Page 39: PFIセミナー 2013/02/28 「プログラミング言語の今」

プログラミング言語研究の潮流

Verification

Concurrency, Memory Model

Formal Semantics

Types

etc…

Page 40: PFIセミナー 2013/02/28 「プログラミング言語の今」

Verificationが大人気

今、プログラムの静的形式的検証がアツい!!

どのぐらいアツいかというと、Verificationと書くだけで、採択率大幅アップ!

さらに、ワークショップも充実

Page 41: PFIセミナー 2013/02/28 「プログラミング言語の今」

併設ワークショップ

Page 42: PFIセミナー 2013/02/28 「プログラミング言語の今」

併設ワークショップ

verification

Page 43: PFIセミナー 2013/02/28 「プログラミング言語の今」

Verification関連の研究

“Cache and I/O efficient functional algorithms.”

メモリヒエラルキを考慮した、アルゴリズムのI/Oコストの静的解析

“On the linear ranking problem for integer linear-constraint loops. ”

ある種のプログラムに対する、停止性判定

“The power of parameterization in coinductive proof.”

Coqにおける、coinductionを用いた証明の改善

Microsoft Research Verified Software Milestone Award

CompCert(証明付きコンパイラ)プロジェクトが受賞

Page 44: PFIセミナー 2013/02/28 「プログラミング言語の今」

なんでそんなにVerification?

バグを取るのは難しい、という大前提

簡単だ、と主張する人も、いるようですが…

検証は、テストより強し

バグの不在の証明なので

(なにより、形式的検証は、プログラムの性質を知ろうとすることなので、難しい)

(難しいことは研究になる)

Page 45: PFIセミナー 2013/02/28 「プログラミング言語の今」

バグのない世界を想像してみる

( ˘⊖˘)。o(待てよ、プログラムにバグがないのなら…)

デバッグする必要がない

テスト書く必要がない

テストする必要がない

デグレードの心配がないので、プログラムのリファクタリングが自由自在

バグ修正のためのメンテが必要ない

プログラミングのコスト大幅減!

|POPL|┗(☋` )┓

三 ( ◠‿◠ )☛そんなうまい話があるか

▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわああああああああ

Page 46: PFIセミナー 2013/02/28 「プログラミング言語の今」

現実:バグのないプログラムを書くのは、それなりに大変

型ベースの証明を書く

Coq, Agda, etc …

ソフトウェアの基礎

プログラミング Coq 〜絶対にバグのないプログラムの書き方〜

Symbolic Execution + SAT/SMT Solver

sbv(Haskell), vcc(C言語), …

モデル検査

いろいろ

(´・_・`)「コスト的に見合わんかもだぽよ……」

Page 47: PFIセミナー 2013/02/28 「プログラミング言語の今」

デバッグしづらいものに向いてる

ハードウェア

昔からモデル検査がよく行われてきた

(ハードウェアに対するモデル検査は決定不能じゃないケースもある)

並行・並列プログラム

大体のバグが、忘れた頃にやってくる

再現が難しい

静的に安全だと判明した部分の、同期処理を省いてパフォーマンス向上目指すなども

Page 48: PFIセミナー 2013/02/28 「プログラミング言語の今」

でも、証明じゃなくてプログラムを書きたいんです!

(´・_・`)「僕証明とか嫌いなんで……」

証明お好きですか(脳内調べ)?

嫌い どちらかというと嫌い わからない 考えたこともない

Page 49: PFIセミナー 2013/02/28 「プログラミング言語の今」

Curry-Howard isomorphism

「プログラム=証明」「型=命題」との間の同型対応

(`・д・´)「この事実が示すことは……」

(´・_・`)「つまり…どういうことだってばよ?」

(`・д・´)「プログラムを書く事は、証明を書く事と同じってことだよ」

(´・_・`)「な、なんだってーー(棒」

Page 50: PFIセミナー 2013/02/28 「プログラミング言語の今」

穴駆動開発(youtube: hole driven haskell)

Page 51: PFIセミナー 2013/02/28 「プログラミング言語の今」

2012 Verified Software Milestone

Award: ConpCert project

検証されたコンパイラを作ろうというプロジェクト

Coqにより(大部分を)証明されたコード

現在、ISO-C-90と ANSI-C といくつかのGCC拡張をサポート

2005年スタート、2012年に浮動小数点演算の完全な形式化と検証が完了

Page 52: PFIセミナー 2013/02/28 「プログラミング言語の今」

なぜ、コンパイラの正しさが重要なのか?

コンパイラは、もっとも複雑なソフトウェアの一つである

コンパイラの正しさは、すべてのソフトウェアに影響を与える

正しいコンパイラを作るのは難しい

最適化が行うコードの変更によって、コードの意味が変わらないか

メモリモデルに違反する最適化を行わないかなど

最適化フェーズの組み合わせによって、コードの意味が変わらないか

Page 53: PFIセミナー 2013/02/28 「プログラミング言語の今」

Coq自身の正しさは?

(´・_・`)「あれ、Coq自身の正しさは…」

(`・д・´)「証明されてないな」

(´・_・`)「CoqでCoqを書けば…?」

(`・д・´)「”証明されてないCoq”で証明されたCoqは、正しいと言えるのか?」

(´・_・`)「あ、これゲーデルの定理でやったところだ!!(濫用)」

Page 54: PFIセミナー 2013/02/28 「プログラミング言語の今」

停止性問題再び

Formal Verificationには、プログラムの停止性が必要なことも多い

(´・_・`)「停止性問題から、プログラムの停止性はわからないんじゃないの?」

(`・д・´)「そんなことはないよ!」

完全性を考えなければ何とでもなる

停止する・停止しない・わからん!の3択を返す関数ならいくらでも書ける

チューリング完全じゃないプログラミング言語を使う

停止性問題は、チューリングマシンに対する定理なので、チューリング完全じゃなければ当然当てはまるとは限らない

Page 55: PFIセミナー 2013/02/28 「プログラミング言語の今」

不完全な停止性判定アルゴリズム

特定の性質を満たすプログラムに対するもの

integer linear-constraint loops など

Abstract Interpretation + SMTソルバ

∀input. ∃time. cycles(f, input) < time なる充足可能性問題

もちろん決定不能(だけど、解けるときは解ける)

Idrisとかの部分的停止性判定

再帰の引数が短調減少になってるかだけ調べる

Page 56: PFIセミナー 2013/02/28 「プログラミング言語の今」

チューリング完全を捨てる

(´・_・`)「そんな言語でまともなコード書けるんですか?Brain F*ckですらチューリング完全なのに…」

(`・д・´)「かけるぞ」

Coq:チューリング完全にならないように、慎重に設計した、非常に記述力の高い言語(語弊有り)

Page 57: PFIセミナー 2013/02/28 「プログラミング言語の今」

検証にまつわる現在の状況

証明方面

今現在のCoqでは、証明書くのが大変すぎるので、どげんかせんといかん

たくさんの手法が提案されてきている

将来的には息をするように証明が書ける世界を目指している(のかな?)

モデル検査方面

バックエンドのSAT/SMTソルバがここ10年ほどで驚きの爆速に

やれることが増えてきているもよう

Page 58: PFIセミナー 2013/02/28 「プログラミング言語の今」

メモリモデルの話

ここ10年ですっかりCPUがマルチコアになってしまった

今時スレッドを使わないプログラムを書いてる男の人って…

しかし、並行・並列プログラムはとっても難しい!

難しいので当然研究されている

POPLでもよく扱われている

Page 59: PFIセミナー 2013/02/28 「プログラミング言語の今」

double-checked lockingとSingletonパターン

比較的最近破綻した、有名なデザインパターン

Singletonオブジェクトを作るときに、2回チェックすると、ロックの回数が減らせる(はずだった)

Page 60: PFIセミナー 2013/02/28 「プログラミング言語の今」

Javaのメモリモデルの問題

コンパイラの最適化、あるいはCPU内のアウトオブオーダで、メモリアクセスの順序が入れ替わってしまう

メモリモデルとして、形式的に定義せねばならない

JVMのメモリモデルをSequential Consistencyとして定義(POPL2005)

その後Counter-exampleが二度にわたりPOPLで指摘される

今年、Buffered Memory Model による形式化(POPL2013)

Page 61: PFIセミナー 2013/02/28 「プログラミング言語の今」

C11/C++11のメモリモデル問題(POPL2013)

もともとC/C++はメモリモデルの規定がなかった

みんな、volatile asm mfence!

C11/C+11で Relaxed Memory Consistency が導入される

これはこれで、いろいろ厄介な問題!

このメモリモデル上での、ライブラリの安全な抽象化方法を考える研究

Page 62: PFIセミナー 2013/02/28 「プログラミング言語の今」

ちなみにCompCertでは

x86とPPCのメモリモデルに準拠したTSOを形式的に定義

CompCert TSO

最適化などが、これを違反しないことを証明済み

Page 63: PFIセミナー 2013/02/28 「プログラミング言語の今」

JavaScriptのFormal Definition

JavaScript and Web Tools

executable semantics for JavaScript

executable model of event dispatch in Web browsers

(Coqで証明済み)

Rhino, SpiderMonkey, V8などの違いが浮き彫りに

そもそもどれが正しいのか

Rhinoをリファレンス動作として採用した

Page 64: PFIセミナー 2013/02/28 「プログラミング言語の今」

まとめ

Page 65: PFIセミナー 2013/02/28 「プログラミング言語の今」

まとめ

プログラミング言語研究の最前線の紹介

プログラミング言語研究は、本質的にHigher-orderで自己言及的

だからこそ、変な方向に話がそれがち

でも、だからこそ、面白い!

m(´・_・`)m「ご清聴、ありがとうございました!」