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

Post on 20-Jun-2015

4.176 views 5 download

description

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

Transcript of 言語アップデート -Scala編-

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

水島 宏太

(@kmizu)

自己紹介

@kmizu http://twitter.com/kmizu

id:kmizushima

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

他称 Scala Bot Scala辻斬り

自称 Scala 辻ヒーラー

Scalaって何?

はおいといて

採用企業

TwitterLinkedIn

EDF Trading

Foursquare

Siemens

Novell

Amazon.com

VMWare

GridGain

Remember the Milk

...

最近のScala

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

Scala 2.9

目玉機能

1. 並列コレクション

implicit parallelism

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

t.par.sum

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

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

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

何故?

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

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

...

でも

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

⇒簡単に導入可能

注意点

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

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

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

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

並列化されない処理

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

処理を行う処理

foldLeft

foldRight

reduceLeft

reduceRight

...

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

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

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

一つが改善

import scala.sys.process._

"ls" run

たったこれだけ

リダイレクトも簡単

import scala.sys.process._

import java.io_

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

もちろんパイプ処理も

import scala.sys.process._

"ls" #| "sort" run

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

import scala.sys.process._

val lsResult = Process("ls") !!

//lsResult: String

import scala.sys.process._

val lines = Process("ls") lines

// lines: Stream[String]

3. scala.Dynamic

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

何故?

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

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

Scala的な思想にそぐわない

...

-Xexperimental付けた場合のみ有効

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

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

多用すべからず

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

Scala本家の最近の動向

2011前半: Typesafe社設立

Scalaの商用サポート

Scala IDE for Eclipse開発移管

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

+ 今のところScala + Akka + α

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

(たぶん)

Typesafe(Scalaチームの方向)

2011/08/29 Scala 2.9.1 final

ポイント

REPLの起動が高速化

5倍くらい速くなった

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

元が遅かったという話も

コンパイルも高速化

1.5倍くらい

基本的にはメンテナンス

リリース

2.9.0とバイナリ互換

2011/09/13

Scala IDE for Eclipse

2.0.0 beta 10

sbtベースのビルド

マネージャ

セミコロン推論の表示

とか色々

Scala 2.9.1 finalベース

Scala IDE for Eclipse

は普通に使える子

↑昔は要らない子だった

だが

IntelliJ IDEA

の方が先を行ってる

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

Java -> Scala 変換

Import補完

Implicit conversion補完

...

最近のScala界の流れ

RESTful HTTPサービス

ライブラリの流行

(≠フレームワーク)

PartialFunctionの活用

Unfiltered

BlueEyes

not MVC

というかViewが無い

型クラスの流行

昔からScalaには

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

あまり活用されて

なかった

Scala 2.8で

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

ここ1~2年で型クラス

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

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

sjson

...

More Functional

昔はScalaで手続き型

プログラミングしてる

ライブラリが多かった

最近のライブラリは

「More Functional」

副作用を可能な限り排除

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

永続データ構造の活用

sbt (特に0.10系)

Specs2

Scalaz

Unfiltered

BlueEyes

宣伝(1)

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

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

宣伝(2)

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

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

現場でのScala, Javaとの連携