Top Banner
Scala2.9.0について よしだ @xuwei_k Scala勉強会35回
31

rpscala35-scala2.9.0

Jul 17, 2015

Download

Technology

Kenji Yoshida
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: rpscala35-scala2.9.0

Scala2.9.0について

よしだ @xuwei_k

Scala勉強会35回

Page 2: rpscala35-scala2.9.0

今までのversionの整理● 2.7.7final リポジトリ

○ 2009年10月28日○ これ以前はあまり詳しいことしらね。このVersion使ってる女子がいたら注意

● 2.8.0final リポジトリ

○ 2010年7月14日

○ コレクションライブラリの再設計とか

● 2.8.1final リポジトリ

○ 2010年11月9日

○ 2.8.0からのバグフィックスが中心で機能追加はあまりない

● 2.9.0final リポジトリ

○ 2011年5月12日

Page 3: rpscala35-scala2.9.0

2.9.0の新機能

http://www.scala-lang.org/node/9483 ● Parallel Collection● Generalized catch blocks● The App Trait● scala.DelayedInit● scala.sys● scala.Dynamic● Auto-Unboxing for Java Boxed values● Some methods added to Collections

など

● RangeをWhileとかfor式で使った場合最適化されるの?

● コンパイル速くなった?

Page 4: rpscala35-scala2.9.0

Generalized catch blocks

catchの部分にPartialFunction[Throwable,T]がかける

Page 5: rpscala35-scala2.9.0

● The App Trait○ Application Traitが色々問題あって、その代わ

りにできたらしい

● scala.DelayedInit

○ App Traitでも使われてる。

○ 初期化時にごにょごにょしたい場合につかう?

Page 6: rpscala35-scala2.9.0

Predefの細かい変更を分かる範囲で調べてみた

● OptManifest, NoManifest○ なにこれ?増えてる(・ω・`)

● currentThread○ 非推奨になってるェ・・・

● error exit○ 非推奨 scala.sysパッケージのもの使えってことらしい

● format も非推奨

● ensuring○ メッセージ部分が名前渡しになってる

● zipped2ToTraversable と zipped3ToTraversable 増えてる

● java.lang.LongなどのクラスからAnyValへの暗黙変換

● <%< 非推奨

Page 7: rpscala35-scala2.9.0

AnyRef specialization

https://gist.github.com/990659

プリミティブ型と参照型の配列はVMレベルで命令が異なっている

参考: wikipediaのJVMのオペコード

Page 8: rpscala35-scala2.9.0

ちょっと話それるけど

zipped2とzipped3について

● それぞれTuple2とTuple3に定義されてる

● コレクション自体のzipというメソッドを呼ぶ方法もあるが、Tupleのzippedは遅延評価されるので、無駄なオブジェクトつくらないし、うまく使えば速くなるかもしれない

● しかし2.8.1までは、Zipped型にたいして filter flatMap forall foreach exists などのメソッドしかなかった

● Predefに暗黙変換のメソッドができたことにより、便利に

Page 9: rpscala35-scala2.9.0

val a = 1 to 10000 toLista: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12…

val b = a.map{ _ * 2 }b: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18…

// a.zip(b) だとその時点でList[(Int,Int)] が生成されるので、要素数が多い場合あまりよくない

val c = (a,b).zippedc: (List[Int], List[Int])#Zipped[List[Int],Int,List[Int],Int] = scala.Tuple2$Zipped@16783d3

// 2.9.0で、Predefにimplicitなメソッドが定義されたことにより、呼べるメソッド増えた

// たとえば以下のように foldLeftを呼ぶのは、2.9.0でないとできない

val d = c.foldLeft(0){ case (a,(b,c)) => a + b + c }

Page 10: rpscala35-scala2.9.0

Auto-Unboxing for Java Boxed values

2.8.1まで

val one = new java.lang.Long(1)one < 2L //これは無理

one.longValue < 2L //一度longValueで変換必要

2.9.0から

one < 2L //これだけでいい

Page 11: rpscala35-scala2.9.0

Collectionの説明のまえに予備知識として読んでおいたほうがいいもの

scalaプログラマなら絶対に読んでおくべきDocument

Page 12: rpscala35-scala2.9.0

Parallel Collection

● 使う側は、ほとんど労力を必要とせずに、数種類のメソッドについて、内部的に自動で並列化されて実行される

● 理論的には、コア数が増えればそれに比例してはやくなるかもしれない(?)

● 論文をちょっと読んだけど、内部構造を完璧には把握してない

Page 13: rpscala35-scala2.9.0

● scala.collectionパッケージ下で増えたファイル

○ CustomParallelizable.scala○ GenIterable.scala○ GenIterableLike.scala○ GenIterableView.scala○ GenIterableViewLike.scala○ GenMap.scala○ GenMapLike.scala○ GenSeq.scala○ GenSeqLike.scala○ GenSeqView.scala○ GenSeqViewLike.scala○ GenSet.scala○ GenSetLike.scala○ GenTraversable.scala○ GenTraversableLike.scala○ GenTraversableOnce.scala○ GenTraversableView.scala○ GenTraversableViewLike.scala○ Parallel.scala○ Parallelizable.scala

Page 14: rpscala35-scala2.9.0

親の(直接使わない)traitが大量になって、大変なことになっている図

http://class-diagram.appspot.com/scala.collection.immutable.Vector

Collectionの場合どのclassも最終的に 30 ~ 40のtraitを継承している

ェ・・・把握できないぉ・・・(・ω・`)

Page 15: rpscala35-scala2.9.0

Genってなに?

Page 16: rpscala35-scala2.9.0

Generationの略?

だれか教えて > <

Page 17: rpscala35-scala2.9.0

scala.collectionパッケージ配下の

Gen〇〇

というClassは、

並列化が可能ということを示すため(?あまり自信ない) で、ユーザーが直接この型を使用することは、あまりなさそう

Page 18: rpscala35-scala2.9.0

● scala.collection.parallelパッケージ内についても、具象クラスはなく、traitまたはobjectのみ

● http://www.scala-lang.org/api/current/index.html#scala.collection.parallel.package

Page 20: rpscala35-scala2.9.0

● ParRange以外の6つのclassについては、

scala> import scala.collection.parallel.immutable._import scala.collection.parallel.immutable._

scala> ParVector(1,2,3)res0 : scala.collection.parallel.immutable.ParVector[Int] = ParVector(1, 2, 3)

というように、今までの他のcollectionと同じようにコンパニオンオブジェクトに可変長引数をとるapplyが定義されているみたい

● しかし、実用的に使う場合を考えると、普通のコレクションからparメソッドを呼ぶほうが大半?

Page 21: rpscala35-scala2.9.0

ソースコード追ってたら興味でてきたので内部実装の話へ

ε=ε=ε=ヾ(´▽`*)ノ

Page 22: rpscala35-scala2.9.0

● 大半の実装が scala.collection.parallel.ParIterableLike にある

● 1400行くらい

● 内部classが39個 !!!

● 内部traitが11個( + 内部traitの内部traitがさらに1つ )

● debug用関数が残ってるェ・・・

Page 23: rpscala35-scala2.9.0

内部クラスをなんとなく分類してみる

Accessorを継承 (15個)

Foreach Count Reduce Fold Sum Product Min Max Forall Exists Find Filter FilterNot CopyToArray

Transformerを継承(17個)

Map Collect FlatMap Copy Partition GroupBy Take Drop Slice SplitAt TakeWhile Span Zip ZipAll ToParCollection ToParMap CreateScanTree

その他 ( 8個)

Composite SeqComposite ParComposite ResultMapping FromScanTree Aggregate ScanNode ScanLeaf

Page 24: rpscala35-scala2.9.0

内部trait

ParIterator SignalContextPassingIterator TaskOps BuilderOps(さらに内部クラスとして Otherwise)

SignallingOps StrictSplitterCheckTask Accessor NonDivisibleTask NonDivisible Transformer ScanTree

Page 25: rpscala35-scala2.9.0

Accessor とTransformer って何?

Page 27: rpscala35-scala2.9.0

え?(´・ω・`)

Page 28: rpscala35-scala2.9.0

僕もあまり詳しくわかりません ><

Page 29: rpscala35-scala2.9.0

● 自分が今までに書いた2.9.0に関するもの

● またもやScala2.9.0のREPLの隠し(?)機能の紹介

● Scala2.9.0のREPLで、すごく便利な裏技を発見した件(全自動ぁばばばばばばばばばばばばばばば)

● scala2.9のparallel collection の benchmark をしてみた

● scalaの2.9で入るらしい新機能試してみた(ちょっと情報ふるいかも)

Page 30: rpscala35-scala2.9.0

その他の人のblogなど

Scala2.9から導入されたバイナリ互換性確保のためのbridgeアノテーションについて調べた

Scala 2.9.0のscala.sys.processパッケージが便利過ぎる件について

最適化の話?

Page 31: rpscala35-scala2.9.0

・・・え?(・ω・`) お わ り ?

さらにみんなでソースコードリーディング?