rpscala35-scala2.9.0

2,022 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,022
On SlideShare
0
From Embeds
0
Number of Embeds
201
Actions
Shares
0
Downloads
7
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

rpscala35-scala2.9.0

  1. 1. Scala勉強会35回 Scala2.9.0について よしだ @xuwei_k
  2. 2. 今までの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日
  3. 3. 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式で使った場合最適化されるの? ● コンパイル速くなった?
  4. 4. Generalized catch blockscatchの部分にPartialFunction[Throwable,T]がかける
  5. 5. ● The App Trait ○ Application Traitが色々問題あって、その代わ りにできたらしい● scala.DelayedInit ○ App Traitでも使われてる。 ○ 初期化時にごにょごにょしたい場合につかう?
  6. 6. Predefの細かい変更を分かる範囲で調べてみた● OptManifest, NoManifest ○ なにこれ?増えてる(・ω・`)● currentThread ○ 非推奨になってるェ・・・● error exit ○ 非推奨 scala.sysパッケージのもの使えってことらしい● format も非推奨● ensuring ○ メッセージ部分が名前渡しになってる● zipped2ToTraversable と zipped3ToTraversable 増えてる● java.lang.LongなどのクラスからAnyValへの暗黙変換● <%< 非推奨
  7. 7. AnyRef specialization https://gist.github.com/990659 プリミティブ型と参照型の配列はVMレベルで命令が異なっている参考: wikipediaのJVMのオペコード
  8. 8. ちょっと話それるけどzipped2とzipped3について ● それぞれTuple2とTuple3に定義されてる ● コレクション自体のzipというメソッドを呼ぶ方法もあるが、 Tupleのzippedは遅延評価されるので、無駄なオブジェクト つくらないし、うまく使えば速くなるかもしれない ● しかし2.8.1までは、Zipped型にたいして filter flatMap forall foreach exists などのメソッドしかなかった ● Predefに暗黙変換のメソッドができたことにより、便利に
  9. 9. 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 }
  10. 10. Auto-Unboxing for Java Boxed values2.8.1までval one = new java.lang.Long(1)one < 2L //これは無理one.longValue < 2L //一度longValueで変換必要2.9.0からone < 2L //これだけでいい
  11. 11. Collectionの説明のまえに予備知識として読んでおいたほうがいいものscalaプログラマなら絶対に読んでおくべきDocument
  12. 12. Parallel Collection● 使う側は、ほとんど労力を必要とせずに、数 種類のメソッドについて、内部的に自動で並 列化されて実行される● 理論的には、コア数が増えればそれに比例 してはやくなるかもしれない(?)● 論文をちょっと読んだけど、内部構造を完璧 には把握してない
  13. 13. ● 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
  14. 14. 親の(直接使わない)traitが大量になって、大変なことになっている図http://class-diagram.appspot.com/scala.collection.immutable.VectorCollectionの場合どのclassも最終的に 30 ~40のtraitを継承しているェ・・・把握できないぉ・・・(・ω・`)
  15. 15. Genってなに?
  16. 16. Generationの略?だれか教えて > <
  17. 17. scala.collectionパッケージ配下のGen〇〇というClassは、並列化が可能ということを示すため(? あまり自信ない) で、ユーザーが直接この型を使用することは、あまりなさそう
  18. 18. ● scala.collection.parallelパッケージ内につい ても、具象クラスはなく、traitまたはobjectの み● http://www.scala-lang. org/api/current/index.html#scala. collection.parallel.package
  19. 19. ● 具象クラス ○ scala.collection.parallel.immutableの ■ ParHashMap ■ ParHashSet ■ ParRange ■ ParVector ○ scala.collection.parallel.mutable ■ ParArray ■ ParHashMap ■ ParHashSet● 実際使うのこれだけらしい
  20. 20. ● 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メソッドを呼ぶほうが大半?
  21. 21. ソースコード追ってたら興味でてきたので内部実装の話へε=ε=ε=ヾ(´▽`*)ノ
  22. 22. ● 大半の実装が scala.collection.parallel.ParIterableLike に ある● 1400行くらい● 内部classが39個 !!!● 内部traitが11個( + 内部traitの内部traitがさらに1つ )● debug用関数が残ってるェ・・・
  23. 23. 内部クラスをなんとなく分類してみるAccessorを継承 (15個)Foreach Count Reduce Fold Sum Product Min Max Forall Exists FindFilter FilterNot CopyToArrayTransformerを継承(17個)Map Collect FlatMap Copy Partition GroupBy Take Drop Slice SplitAtTakeWhile Span Zip ZipAll ToParCollection ToParMapCreateScanTreeその他 ( 8個)Composite SeqComposite ParComposite ResultMappingFromScanTree Aggregate ScanNode ScanLeaf
  24. 24. 内部traitParIterator SignalContextPassingIteratorTaskOps BuilderOps(さらに内部クラスとして Otherwise)SignallingOps StrictSplitterCheckTaskAccessor NonDivisibleTask NonDivisibleTransformer ScanTree
  25. 25. Accessor とTransformer って何?
  26. 26. TaskStrictSplitterCheckTask Accessor Transformer
  27. 27. え?(´・ω・`)
  28. 28. 僕もあまり詳しくわかりません ><
  29. 29. ● 自分が今までに書いた2.9.0に関するもの● またもやScala2.9.0のREPLの隠し(?)機能の紹介● Scala2.9.0のREPLで、すごく便利な裏技を発見した件(全自動ぁばばばばばばばばばばばば ばばば)● scala2.9のparallel collection の benchmark をしてみた● scalaの2.9で入るらしい新機能試してみた(ちょっと情報ふるいかも)
  30. 30. その他の人のblogなどScala2.9から導入されたバイナリ互換性確保のためのbridgeアノテーションについて調べたScala 2.9.0のscala.sys.processパッケージが便利過ぎる件について最適化の話?
  31. 31. ・・・え?(・ω・`) お わ り ?さらにみんなでソースコードリーディング?

×