Scala2.9.0について よしだ @xuwei_k Scala勉強会35回
今までの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日
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式で使った場合最適化されるの?
● コンパイル速くなった?
Generalized catch blocks
catchの部分にPartialFunction[Throwable,T]がかける
● The App Trait○ Application Traitが色々問題あって、その代わ
りにできたらしい
● scala.DelayedInit
○ App Traitでも使われてる。
○ 初期化時にごにょごにょしたい場合につかう?
Predefの細かい変更を分かる範囲で調べてみた
● OptManifest, NoManifest○ なにこれ?増えてる(・ω・`)
● currentThread○ 非推奨になってるェ・・・
● error exit○ 非推奨 scala.sysパッケージのもの使えってことらしい
● format も非推奨
● ensuring○ メッセージ部分が名前渡しになってる
● zipped2ToTraversable と zipped3ToTraversable 増えてる
● java.lang.LongなどのクラスからAnyValへの暗黙変換
● <%< 非推奨
AnyRef specialization
https://gist.github.com/990659
プリミティブ型と参照型の配列はVMレベルで命令が異なっている
参考: wikipediaのJVMのオペコード
ちょっと話それるけど
zipped2とzipped3について
● それぞれTuple2とTuple3に定義されてる
● コレクション自体のzipというメソッドを呼ぶ方法もあるが、Tupleのzippedは遅延評価されるので、無駄なオブジェクトつくらないし、うまく使えば速くなるかもしれない
● しかし2.8.1までは、Zipped型にたいして filter flatMap forall foreach exists などのメソッドしかなかった
● Predefに暗黙変換のメソッドができたことにより、便利に
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 }
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 //これだけでいい
Collectionの説明のまえに予備知識として読んでおいたほうがいいもの
scalaプログラマなら絶対に読んでおくべきDocument
Parallel Collection
● 使う側は、ほとんど労力を必要とせずに、数種類のメソッドについて、内部的に自動で並列化されて実行される
● 理論的には、コア数が増えればそれに比例してはやくなるかもしれない(?)
● 論文をちょっと読んだけど、内部構造を完璧には把握してない
● 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
親の(直接使わない)traitが大量になって、大変なことになっている図
http://class-diagram.appspot.com/scala.collection.immutable.Vector
Collectionの場合どのclassも最終的に 30 ~ 40のtraitを継承している
ェ・・・把握できないぉ・・・(・ω・`)
● scala.collection.parallelパッケージ内についても、具象クラスはなく、traitまたはobjectのみ
● http://www.scala-lang.org/api/current/index.html#scala.collection.parallel.package
● 具象クラス
○ scala.collection.parallel.immutableの
■ ParHashMap■ ParHashSet■ ParRange■ ParVector
○ scala.collection.parallel.mutable
■ ParArray■ ParHashMap■ ParHashSet
● 実際使うのこれだけらしい
● 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メソッドを呼ぶほうが大半?
● 大半の実装が scala.collection.parallel.ParIterableLike にある
● 1400行くらい
● 内部classが39個 !!!
● 内部traitが11個( + 内部traitの内部traitがさらに1つ )
● debug用関数が残ってるェ・・・
内部クラスをなんとなく分類してみる
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
内部trait
ParIterator SignalContextPassingIterator TaskOps BuilderOps(さらに内部クラスとして Otherwise)
SignallingOps StrictSplitterCheckTask Accessor NonDivisibleTask NonDivisible Transformer ScanTree
Task
StrictSplitterCheckTask
Accessor
Transformer
● 自分が今までに書いた2.9.0に関するもの
● またもやScala2.9.0のREPLの隠し(?)機能の紹介
● Scala2.9.0のREPLで、すごく便利な裏技を発見した件(全自動ぁばばばばばばばばばばばばばばば)
● scala2.9のparallel collection の benchmark をしてみた
● scalaの2.9で入るらしい新機能試してみた(ちょっと情報ふるいかも)
その他の人のblogなど
Scala2.9から導入されたバイナリ互換性確保のためのbridgeアノテーションについて調べた
Scala 2.9.0のscala.sys.processパッケージが便利過ぎる件について
最適化の話?