Scala勉強会35回




     Scala2.9.0について

         よしだ @xuwei_k
今までの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 toList
a: 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).zipped
c: (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を継承している
ェ・・・把握できないぉ・・・(・ω・`)
Genってなに?
Generationの略?
だれか教えて > <
scala.collectionパッケージ配下の
Gen〇〇
というClassは、
並列化が可能
ということを示すため(?   あまり自信ない) で、ユーザーが
直接この型を使用することは、あまりなさそう
● 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
Accessor とTransformer って何?
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パッケージが便利過
ぎる件について

最適化の話?
・・・え?(・ω・`) お わ り ?

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

rpscala35-scala2.9.0