最新C#動向と関数型言語haskell...

88
最最 C# 最最最最最最最最 Haskell 最最最 / 最最最最最最最最最最最 最最最最最最最最最最最最最最最十十十十十 十十 () 十十 十十 十十十 FITEA 十十十十十十十十十十

description

2009-10-23 FITEA最新技術ミニセミナー http://fitea.org/?p=112

Transcript of 最新C#動向と関数型言語haskell...

Page 1: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

最新 C# 動向と関数型言語Haskell

~命令型 / 静的プログラミングから関数型プログラミングへのシフト~ 十月二三日

日直

小島

富治雄

FITEA 最新技術ミニセミナー

Page 2: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

自己紹介

2

Page 3: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

小島 富治雄 (Fujiwo)

・ FITEA・ Microsoft MVP for Development Tools - Visual C#

3

Page 4: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

FITEA福井情報技術者協会 [FITEA]

http://fitea.org

4

Page 5: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

マイブーム

自転車通勤“bicycle commute”

ジャグリング“juggling”

英語の勉強“learning English”

Page 6: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

アジェンダ

マルチパラダイム !

関数型プログラミング !

C# vs. Haskell!

Page 7: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

マルチパラダイム !

Page 8: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

プログラミング言語のトレンド

マルチパラダイム

Page 9: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

マルチパラダイム関数型

⇔ 手続き型⇔ オブジェクト指向型

宣言型 ⇔ 命令型

動的型無し⇔ 静的型付き

Generic

並列プログラミング9

Page 10: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

( 噂によると、マルチパラダイムな言語として、

“ Scala ”というのが

いけてるらしい。 )

Page 11: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

背景マルチパラダイム

プログラミングが現実的に。• C# など言語の進化• Visual Studio などツールの進化

Page 12: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

C# は、最新のものほど、マルチパラダイム

プログラミング言語化

Page 13: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

C# の進化

C#1.0C#2.0

C#3.0C#4.0

オブジェクト指向 !

ジェネリック !

宣言型 !関数型 !

動的 !並列処理 !

Page 14: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

並列プログラミング

14

Page 15: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

ムーアの法則の破れ

15

「今から 10 年後、 15 年後に、

われわれは極めて根本的な問題に直面する」

2007/09/18

「半導体に集積される

トランジスタの数は18 ~ 24 カ月ごとに

倍増する」ムーアの法則 1965

ゴードン・ムーア( インテルの共同創業者 )

Page 16: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

マルチコア CPU

16

Page 17: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

プログラマはどうすればいいか

17

James Hughes 氏( サン マイクロシステムズ副社長 )

マルチ スレッディングを有効に活用するための並列プログラミング

技術が必要2008/12/03

Page 18: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

宣言型プログラミング

“What” を記述⇔ 命令型プログラミング

•“How” を記述 (C# 2 .0 以前など )

Page 19: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

各のパラダイムの限界手続き型の限界オブジェクト指向の限界

→ 適材適所のパラダイム

→ マルチパラダイム 19

Page 20: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

Q. パラダイムによってソースコードは大きく変わる ?

Page 21: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

デモ命令型・オブジェクト指向型•例 . “OOP アンケート”

宣言型・関数型•例 . “FP アンケート”

Page 22: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

まったく同じ実行結果だが…

Page 23: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

美しさが異なる

保守性が異なる•変更容易性•テスト容易性

Page 24: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

別の例

Page 25: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

アセンブリ言語mov dx, msg

mov ah, 0x09

int 0x21

xor al, al

mov ah, 0x4C

int 0x21

msg db "Hello World!$"

Page 26: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

を、なんで

Page 27: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

C#class Program

{

static void Main()

{

System.Console.WriteLine("Hello World!");

}

}

printfn "Hello world!"

F#

Page 28: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

のように書くようになってきたの

か ?

Page 29: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

「動けばいい」のなら、どっちでも良いはず。

Page 30: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

何の違いがソースコードの違いを

生むのか ?

Page 31: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

ソースコードが異なる

↑プログラマーが意図したモデル

が異なる。

Page 32: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

モデル( =関心のある / コミュニケーショ

ンしたい部分を抽出したもの )

の記述により近いものが使われる。

Page 33: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

私の認識

Page 34: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

プログラミングというのは、実装のみを行う

のではない。

Page 35: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

プログラミングは、

「設計+実装+テスト」。

Page 36: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

プログラミングというのは、「検証可能な

設計 / 実装モデル」を作ること。

Page 37: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

プログラミングという行為は

モデリング。

Page 38: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

モデリングなので、

モデリングのための言語・ツールが重要。

Page 39: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

プログラミング言語が重要

モデルを書くのに適した言語•進化した C# など

Page 40: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

「プログラミングで作られるモデル」

=ソースコード( が理想 )

Page 41: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

モデルとはそのコンテキストでの関心事を抽出したもの。

モデルの目的 :

•関心事に限定した

コミュニケーション。

Page 42: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

誰とのコミュニケーション ?

Page 43: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

ソースコードで誰とコミュニケーションするのか ?

古くは :

• コンピュータとコミュニケーション

時代が進んで :

• コンパイラとコミュニケーション

今は :

• 人とコミュニケーション

• 人 = ステークホルダー

Page 44: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

プログラミングでは :Q. 何をモデリングするのか ?

=何を関心事として抽出するか ?

A. 意図をモデリング。

意図がソースコード ( =モデル )で表現されるべき。

Page 45: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

Page 46: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

例えば…C# では、

「従業員名簿内の 全ての各従業員を画面に出力する」

のソースコードは、

従業員名簿.ForAll(各従業員 => 各従業員.出力(画面));

と書かれたりする。宣言型プログラミング

Page 47: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

なんで従業員名簿.ForAll(各従業員 => 各従業員.出力(画面));

このソースコードが、

for (int i = 0; i < 従業員名簿.Count; i++)

出力(従業員名簿[i]);

より良いか?

命令型プログラミング

Page 48: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

「この場合は」、「整数 i を 0 にし、 i が 従業員名簿の Count までの間、 i をインクリメントしながら、従業員名簿の i 番目を出力」

という意図のモデルじゃなく、

「従業員名簿内の全ての各従業員を

画面に出力する」

のモデルだから。

Page 49: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

つまり、「従業員名簿内の全ての各従業員を

画面に出力する」

のモデルとしては、

従業員名簿 .ForAll( 各従業員 => 各従業員 . 出力 (画面 ));

の方が (ベストではないが ) ベター。

Page 50: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

もし仮に、 「整数 i を 0 にし、 i が 従業員名簿の Count までの間、

i をインクリメントしながら、従業員名簿の i 番目を出力」

という意図のモデルだったら、

for (int i = 0; i < 従業員名簿 .Count; i++)

出力 (従業員名簿 [i]);

の方が、ベター。

Page 51: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

よりピュアなモデルが書けている方がベター。

Page 52: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

モデルがピュアであることが重要か ?

そう。モデルはピュアであることが重要。

Page 53: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

なぜならば、

Page 54: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

モデルとは

「関心事を抽出したもの」

だから。

Page 55: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

例えば…「従業員名簿内の 全ての各従業員を画面に出力する」

が意図なら、 for (int i = 0; i < 従業員リスト .Count; i++)

出力 (従業員リスト [i]);

の場合、

「 int 」、「 i 」、「 = 」、「 < 」、「 Count 」、「 i++ 」、「 [i] 」

は「意図以外」のもの。

( =モデルにとっては「ノイズ」 )

Page 56: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

「この場合は」、 for (int i = 0; i < 従業員リスト.Count; i++)

出力(従業員リスト[i]);

よりは、

従業員リスト.ForAll(各従業員 => 各従業員.出力(画面));

の方がノイズが少ない。(=SN比が高い)

宣言型プログラミング

命令型プログラミング

Page 57: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

どんな風にプログラミング

したいか

57

Page 58: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

どんな風にプログラミングしたいか

シンプルに書きたいことだけを書く•モデル記述( モデル = 関心事が分離されたもの )

58

Page 59: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

どんな風にプログラミングしたいか

CPU に指示するようでなく

コンパイラに指示するようでなく

人が人に話すように59

Page 60: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

そのためには

Page 61: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

状況に適したパラダイムの採用手続き型プログラミング

⇔ オブジェクト指向型プログラミング⇔ 関数型プログラミング

命令型プログラミング⇔ 宣言型プログラミング

テキスト型プログラミング⇔ 図解型プログラミング

ジェネリック・プログラミング並列プログラミングなどの組み合わせ

Page 62: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

関数型プログラミング !

Page 63: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

関数型言語純粋 ハイブリッド

静的型付け Haskell Scala

動的型付け Scheme

C#

OCamlF#

ErlangLISP

Page 64: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

関数型プログラミング宣言的数学的

Page 65: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

関数型プログラミングプログラムは関数の集まり⇔ 手続きの集まり

⇔ オブジェクトの集まり

Page 66: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

関数型プログラミング関数脳が必要 ?

⇔ 手続き脳

⇔ オブジェクト脳

Page 67: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

見える化してみた

Page 68: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

Haskell の脳内

関数関数

関数関数

関数

関数

関数

関数

関数

関数

関数関数

関数

関数

関数

Page 69: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

C# の脳内

関数 関数

物 手続

物物物

物物物物

物物物

手続手続手続

物物

関数

物物物

Page 70: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

より分かりやすく見える化

Page 71: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

Haskellたん

Page 72: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

C# たん

Page 73: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

関数型プログラミング代入文がない•副作用がない•状態を持たない

Page 74: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

関数型プログラミング参照透明•実行順序を気にしなくてよい•副作用がないので、いつどの式を評価しても同じ•制御フローがない

Page 75: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

C# vs. Haskell!

Page 76: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

C# vs. Haskell

C# は Haskell に近づけたのか ?

Page 77: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

C#

マイクロソフト社によって同社の .NET戦略の一環として開発されたオブジェクト指向プログラミング言語

Page 78: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

Haskell

純粋関数型言語。名前は、米国の数学者 Haskell B. Curry に由来。

Page 79: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

Haskell遅延評価強い静的型付け

型推論

静的多相型付け

高階関数

参照透過性

再帰的関数

副作用がない

パターンマッチング

カリー化

Page 80: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

Haskell『ふつうの Haskellプログラミングふつうのプログラマのための関数型言語入門』392ページ

ソフトバンククリエイティブ

2006/06/01

Page 81: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

Haskell『 Real World Haskell― 実戦で学ぶ関数型言語プログラミング』720ページ

オライリージャパン

2009/10/26

Page 82: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

第一試合 .

再帰的関数

お題「階乗」•サンプル“ Factorial”

Page 83: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

第二 試合 .

パターンマッチング

そのままサンプル“ Factorial”

Page 84: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

第三 試合 .

遅延評価

お題「無限長のリストを扱う」•サンプル“ YieldSample”

Page 85: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

第三 試合 .

遅延評価

お題「一から十まで 足す」•サンプル“ Sum”

Page 86: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

第四試合 .

宣言的プログラミング

お題「クイックソート」•サンプル“ QuickSort”

Page 87: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

5 3 8 2 9 1 6 4 7

53 2 1 4

8 9 6 7

32 1 4

1 2

86 7

9

6 7

参考 : クイックソート

Page 88: 最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~

ご清聴ありがとうございました