これからの「言語」の話をしよう ―― 未来を生きるためのツール

44
これからの 「言語」の話をしよう 小泉 将久 F# User Group - Japan ― 未来を生きるためのツール ―

description

オープンソースカンファレンス2011 Hokkaidoで使用した発表資料です。F#の紹介です。

Transcript of これからの「言語」の話をしよう ―― 未来を生きるためのツール

Page 1: これからの「言語」の話をしよう ―― 未来を生きるためのツール

これからの「言語」の話をしよう

小泉将久F# User Group - Japan

―未来を生きるためのツール―

Page 2: これからの「言語」の話をしよう ―― 未来を生きるためのツール

自己紹介

• 小泉将久 (Nobuhisa Koizumi)

• F# User Group - Japan 代表

• @nobuhisa_k

• id:Nobuhisa (はてな)

• セキュリティキャンプ2005

#osc11do #fsharp

Page 3: これからの「言語」の話をしよう ―― 未来を生きるためのツール

関数型言語に興味のある人!

Page 4: これからの「言語」の話をしよう ―― 未来を生きるためのツール

パラダイムパラダイムパラダイムパラダイム

Page 5: これからの「言語」の話をしよう ―― 未来を生きるためのツール

パラダイムって何だろう

手続き型プログラミング

関数型プログラミング

問題点・・・?

Page 6: これからの「言語」の話をしよう ―― 未来を生きるためのツール

手続き型の悪いところ?

• 抽象度が低い?

• バグが発生しやすい?

• 並列計算に不向き?

• \美しくない!/

Page 7: これからの「言語」の話をしよう ―― 未来を生きるためのツール

抽象度が低い?

手続き型

関数型人間のためのパラダイム

コンピュータ寄りのパラダイム

Page 8: これからの「言語」の話をしよう ―― 未来を生きるためのツール

関数型プログラミングとは

• 機能(関数)を中心に考える

• 関数は値関数は値関数は値関数は値である(第一級)

• 副作用はちょっとだけ♥

func

10

“hello”

Page 9: これからの「言語」の話をしよう ―― 未来を生きるためのツール

関数型プログラミングとは

C

E

D

A

B

関数合成関数合成関数合成関数合成 高階関数高階関数高階関数高階関数

Page 10: これからの「言語」の話をしよう ―― 未来を生きるためのツール

関数型プログラミングとは

• 変数束縛

束縛したら変更できない変更できない変更できない変更できない

let a = 1024

慣れると、こっちのほうがプログラミングしやすい!

バグバグ

並列並列

Page 11: これからの「言語」の話をしよう ―― 未来を生きるためのツール

F#F#F#F#

Page 12: これからの「言語」の話をしよう ―― 未来を生きるためのツール

Open Source !!Open Source !!

Page 13: これからの「言語」の話をしよう ―― 未来を生きるためのツール

あらゆる言語を研究した最先端の関数型言語

Page 14: これからの「言語」の話をしよう ―― 未来を生きるためのツール

F#

• Microsoft Research(2005~)

• マルチパラダイム�関数型(非純粋)

�手続き型

�オブジェクト指向

�言語指向

Page 15: これからの「言語」の話をしよう ―― 未来を生きるためのツール

OCaml

Page 16: これからの「言語」の話をしよう ―― 未来を生きるためのツール

Haskell

Page 17: これからの「言語」の話をしよう ―― 未来を生きるためのツール

PythonPython

Page 18: これからの「言語」の話をしよう ―― 未来を生きるためのツール

F#の守備範囲

Page 19: これからの「言語」の話をしよう ―― 未来を生きるためのツール

F#の守備範囲

• Webアプリケーションも書ける例)http://fssnip.net/

Page 20: これからの「言語」の話をしよう ―― 未来を生きるためのツール

F#の守備範囲

• 3Dだって扱える(DirectX, WPF)例)F# 3DVisualization

Page 21: これからの「言語」の話をしよう ―― 未来を生きるためのツール

F#の守備範囲

• Xboxのゲームも作れる例)The Path of Go

Page 22: これからの「言語」の話をしよう ―― 未来を生きるためのツール

F#の守備範囲

• もちろん業務アプリも!

Page 23: これからの「言語」の話をしよう ―― 未来を生きるためのツール

F#の守備範囲

• その他–スマートフォンのアプリケーション–バッチ処理、スクリプティング

• スクリプト言語としてのF# - .fsx は強力だった!

–並列計算が得意

• Demonstration !

– Windows Form

– FSharpChart

Page 24: これからの「言語」の話をしよう ―― 未来を生きるためのツール

F#の美しさ

Page 25: これからの「言語」の話をしよう ―― 未来を生きるためのツール

type Animal = Dog | Cat | Rabbit | Bird

let speak = function| Dog -> "わんわん!"| Cat -> "にゃーにゃー"| Rabbit -> "..."| Bird -> "ぴーちくぱーちく"

判別共用体& パターソマッチ

Page 26: これからの「言語」の話をしよう ―― 未来を生きるためのツール

public abstract class Animal{

public abstract string Speak();}public class Dog : Animal{

public override string Speak() { return "わんわん!"; }}public class Cat : Animal{

public override string Speak() { return "にゃーにゃー"; }}public class Rabbit : Animal{

public override string Speak() { return "..."; }}public class Bird : Animal{

public override string Speak() { return "ぴーちくぱーちく"; }}

Page 27: これからの「言語」の話をしよう ―― 未来を生きるためのツール

let compute = (+) 1 >> (*) 10

部分適用& 関数合成

(&型推論)

Page 28: これからの「言語」の話をしよう ―― 未来を生きるためのツール

private Func<T, U> Compose<T, U>(Func<U, U> f, Func<T, U> g){

return (x => f(g(x)));}private int F(int x, int y){

return x * y;}private int G(int x, int y){

return x + y;}public int Compute(int arg){

return this.Compose((int x) => F(10, x), (int x) => G(1, x))(arg);

}

Page 29: これからの「言語」の話をしよう ―― 未来を生きるためのツール

[<Measure>] type km[<Measure>] type h

let time = 8<h>let speed = 156<km/h>

測定単位

Page 30: これからの「言語」の話をしよう ―― 未来を生きるためのツール

[ for x in 0..10 -> (x, pown 2 x) ]

リスト内包表記(シーケンス式)

val it : (int * int) list =[(0, 1); (1, 2); (2, 4); (3, 8); (4, 16);(5, 32); (6, 64); (7, 128); (8, 256);(9, 512); (10, 1024)]

Page 31: これからの「言語」の話をしよう ―― 未来を生きるためのツール

public IEnumerable<Tuple<int, int>> Pain(){

return from x in Enumerable.Range(0, 11)select new Tuple<int, int>(x, (int)System.Math.Pow(2, x));

}

Page 32: これからの「言語」の話をしよう ―― 未来を生きるためのツール

maybe { let! x = Some 7let! y = Some 3return x + y }

モナド(コンピューテーション式)

Page 33: これからの「言語」の話をしよう ―― 未来を生きるためのツール

並列計算並列計算並列計算並列計算

Page 34: これからの「言語」の話をしよう ―― 未来を生きるためのツール

並列化の困難例えば・・・

素敵なファイル

読読読読 : 問題なし問題なし問題なし問題なし

書書書書 : 問題あり問題あり問題あり問題あり

Page 35: これからの「言語」の話をしよう ―― 未来を生きるためのツール

関数型と並列

値が変更できない(immutable)

Read Only !

並列化が容易!

(何も意識する必要がない)

Page 36: これからの「言語」の話をしよう ―― 未来を生きるためのツール

F#なら朝メシ前!

• 標準ライブラリが並列計算を強力にサポート!

• Demonstration !

–画像処理を並列化しよう画像処理を並列化しよう画像処理を並列化しよう画像処理を並列化しよう

Page 37: これからの「言語」の話をしよう ―― 未来を生きるためのツール

おすすめ書籍

Page 38: これからの「言語」の話をしよう ―― 未来を生きるためのツール

コミュニティ

• F# User Group - Japan

http://tinyurl.com/fsugjp

– メーリングリスト– Lingr

– Wiki

– twitter : #fsharp, #fsugjp

• MSDNフォーラム : Visual F#

Page 39: これからの「言語」の話をしよう ―― 未来を生きるためのツール

F#F#の街の街

さっぽろさっぽろ

Page 40: これからの「言語」の話をしよう ―― 未来を生きるためのツール
Page 41: これからの「言語」の話をしよう ―― 未来を生きるためのツール
Page 42: これからの「言語」の話をしよう ―― 未来を生きるためのツール

なまらなまらF#F#しようよ!しようよ!

Page 43: これからの「言語」の話をしよう ―― 未来を生きるためのツール

Q & AQ & AQ & AQ & A

• なんでもどうぞ!• 展示会場にF#のブースもあります!

Page 44: これからの「言語」の話をしよう ―― 未来を生きるためのツール

おしまい

小泉将久

@nobuhisa_k

λλλλ