言語アップデート -scala編-

95
言語 – Scala - 水島 宏太 (@kmizu)

Upload: kota-mizushima

Post on 20-Jun-2015

4.176 views

Category:

Technology


5 download

DESCRIPTION

函数プログラミングの集い2011 in Tokyo の言語アップデートにおける発表スライドです。超高速でScalaの新し目の話題を提供することに特化してて、コードは少なめです。

TRANSCRIPT

Page 1: 言語アップデート -Scala編-

言語アップデート– Scala 編-

水島 宏太

(@kmizu)

Page 2: 言語アップデート -Scala編-

自己紹介

Page 3: 言語アップデート -Scala編-

@kmizu http://twitter.com/kmizu

id:kmizushima

http://d.hatena.ne.jp/kmizushima

他称 Scala Bot Scala辻斬り

自称 Scala 辻ヒーラー

Page 4: 言語アップデート -Scala編-

Scalaって何?

Page 5: 言語アップデート -Scala編-

はおいといて

Page 6: 言語アップデート -Scala編-

採用企業

Page 7: 言語アップデート -Scala編-

TwitterLinkedIn

EDF Trading

Foursquare

Siemens

Novell

Amazon.com

VMWare

GridGain

Remember the Milk

...

Page 8: 言語アップデート -Scala編-

最近のScala

Page 9: 言語アップデート -Scala編-

最近過ぎるのも何なので2.9から

Page 10: 言語アップデート -Scala編-

Scala 2.9

Page 11: 言語アップデート -Scala編-

目玉機能

Page 12: 言語アップデート -Scala編-

1. 並列コレクション

Page 13: 言語アップデート -Scala編-

implicit parallelism

Page 14: 言語アップデート -Scala編-

def psum[T:Numeric](t: Traversable[T]): T =

t.par.sum

Page 15: 言語アップデート -Scala編-

コレクションのparメソッド呼ぶだけでOK

Page 16: 言語アップデート -Scala編-

勝手に複数コアに処理を割り振ってくれる

Page 17: 言語アップデート -Scala編-

N倍速(N=CPUコア数)になる程都合良くはない

Page 18: 言語アップデート -Scala編-

何故?

Page 19: 言語アップデート -Scala編-

タスクスケジューリングのためのオーバーヘッド

特に、内部的に待ち合わせが必要な処理

...

Page 20: 言語アップデート -Scala編-

でも

Page 21: 言語アップデート -Scala編-

並列化のための記述コストがほとんどかからない

Page 22: 言語アップデート -Scala編-

⇒簡単に導入可能

Page 23: 言語アップデート -Scala編-

注意点

Page 24: 言語アップデート -Scala編-

不変コレクション and 副作用無しの処理が基本

Page 25: 言語アップデート -Scala編-

⇒並列化されていることは「見えない」

Page 26: 言語アップデート -Scala編-

可変コレクション or 副作用ありの処理

Page 27: 言語アップデート -Scala編-

⇒並列化されていることが「見えて」しまう

Page 28: 言語アップデート -Scala編-

並列化されない処理

Page 29: 言語アップデート -Scala編-

コレクションの「前の要素の処理結果」を使って

処理を行う処理

Page 30: 言語アップデート -Scala編-

foldLeft

foldRight

reduceLeft

reduceRight

...

Page 31: 言語アップデート -Scala編-

とりあえず、使ってみませう

Page 32: 言語アップデート -Scala編-

2. プロセス呼び出しライブラリ

Page 33: 言語アップデート -Scala編-

Scalaの弱点(I/O,プロセス処理が面倒)の

一つが改善

Page 34: 言語アップデート -Scala編-

import scala.sys.process._

"ls" run

Page 35: 言語アップデート -Scala編-

たったこれだけ

Page 36: 言語アップデート -Scala編-

リダイレクトも簡単

Page 37: 言語アップデート -Scala編-

import scala.sys.process._

import java.io_

"ls" #> new File("hoge.txt") run

Page 38: 言語アップデート -Scala編-

もちろんパイプ処理も

Page 39: 言語アップデート -Scala編-

import scala.sys.process._

"ls" #| "sort" run

Page 40: 言語アップデート -Scala編-

プロセスの標準出力の取得も簡単

Page 41: 言語アップデート -Scala編-

import scala.sys.process._

val lsResult = Process("ls") !!

//lsResult: String

Page 42: 言語アップデート -Scala編-

import scala.sys.process._

val lines = Process("ls") lines

// lines: Stream[String]

Page 43: 言語アップデート -Scala編-

3. scala.Dynamic

Page 44: 言語アップデート -Scala編-

導入に当たって意見が分かれた

Page 45: 言語アップデート -Scala編-

何故?

Page 46: 言語アップデート -Scala編-

Rubyのmethod_missingのようなものだから

Page 47: 言語アップデート -Scala編-

型安全性を部分的に破壊できる

Page 48: 言語アップデート -Scala編-

Scala的な思想にそぐわない

...

Page 49: 言語アップデート -Scala編-

-Xexperimental付けた場合のみ有効

Page 50: 言語アップデート -Scala編-

class MethodNamePrinter extends Dynamic {

def applyDynamic(name: String)(args: Any*): Any = {

println(

name + "(" + args.mkString(", ") + ") invoked"

)

}

}

val printer = new MethodNamePrinter

printer.foo // foo() invoked

printer.hoge // hoge() invoked

Page 51: 言語アップデート -Scala編-

O/Rマッパーとかある種のDSLで有効

Page 52: 言語アップデート -Scala編-

多用すべからず

Page 53: 言語アップデート -Scala編-

2.9の新機能はこれくらいにして

Page 54: 言語アップデート -Scala編-

Scala本家の最近の動向

Page 55: 言語アップデート -Scala編-

2011前半: Typesafe社設立

Page 56: 言語アップデート -Scala編-

Scalaの商用サポート

Scala IDE for Eclipse開発移管

「全部込み」パッケージの提供

+ 今のところScala + Akka + α

+ 将来的にはEclipse+ sbtが入る

(たぶん)

Page 57: 言語アップデート -Scala編-

Typesafe(Scalaチームの方向)

Page 58: 言語アップデート -Scala編-

2011/08/29 Scala 2.9.1 final

Page 59: 言語アップデート -Scala編-

ポイント

Page 60: 言語アップデート -Scala編-

REPLの起動が高速化

Page 61: 言語アップデート -Scala編-

5倍くらい速くなった

7秒 -> 1秒(筆者環境)

Page 62: 言語アップデート -Scala編-

元が遅かったという話も

Page 63: 言語アップデート -Scala編-

コンパイルも高速化

Page 64: 言語アップデート -Scala編-

1.5倍くらい

Page 65: 言語アップデート -Scala編-

基本的にはメンテナンス

リリース

Page 66: 言語アップデート -Scala編-

2.9.0とバイナリ互換

Page 67: 言語アップデート -Scala編-

2011/09/13

Scala IDE for Eclipse

2.0.0 beta 10

Page 68: 言語アップデート -Scala編-

sbtベースのビルド

マネージャ

Page 69: 言語アップデート -Scala編-

セミコロン推論の表示

とか色々

Page 70: 言語アップデート -Scala編-

Scala 2.9.1 finalベース

Page 71: 言語アップデート -Scala編-

Scala IDE for Eclipse

は普通に使える子

↑昔は要らない子だった

Page 72: 言語アップデート -Scala編-

だが

Page 73: 言語アップデート -Scala編-

IntelliJ IDEA

の方が先を行ってる

Page 74: 言語アップデート -Scala編-

言語横断のリファクタリング

Java -> Scala 変換

Import補完

Implicit conversion補完

...

Page 75: 言語アップデート -Scala編-

最近のScala界の流れ

Page 76: 言語アップデート -Scala編-

RESTful HTTPサービス

ライブラリの流行

(≠フレームワーク)

Page 77: 言語アップデート -Scala編-

PartialFunctionの活用

Page 78: 言語アップデート -Scala編-

Unfiltered

BlueEyes

Page 79: 言語アップデート -Scala編-

not MVC

Page 80: 言語アップデート -Scala編-

というかViewが無い

Page 81: 言語アップデート -Scala編-

型クラスの流行

Page 82: 言語アップデート -Scala編-

昔からScalaには

型クラス(相当)があった

Page 83: 言語アップデート -Scala編-

あまり活用されて

なかった

Page 84: 言語アップデート -Scala編-

Scala 2.8で

いくつか型クラスが入った

Page 85: 言語アップデート -Scala編-

ここ1~2年で型クラス

を使ったライブラリが色々

Page 86: 言語アップデート -Scala編-

Scalaz <- 型クラスライブラリ

sjson

...

Page 87: 言語アップデート -Scala編-

More Functional

Page 88: 言語アップデート -Scala編-

昔はScalaで手続き型

プログラミングしてる

ライブラリが多かった

Page 89: 言語アップデート -Scala編-

最近のライブラリは

「More Functional」

Page 90: 言語アップデート -Scala編-

副作用を可能な限り排除

オブジェクト(関数)合成

永続データ構造の活用

Page 91: 言語アップデート -Scala編-

sbt (特に0.10系)

Specs2

Scalaz

Unfiltered

BlueEyes

Page 92: 言語アップデート -Scala編-

宣伝(1)

Page 93: 言語アップデート -Scala編-

通称コップ本 第二版 2011/09/27 発売予定

Scala 2.8対応+付録Scala 2.9記事(by @kmizu)

Page 94: 言語アップデート -Scala編-

宣伝(2)

Page 95: 言語アップデート -Scala編-

こんなキーワードにピンと来たら(ry

Cakeパターン, CONCEPTパターン, 限定継続

現場でのScala, Javaとの連携