Advanced Tech Night No.02



                Scala事始め
    ~徹底解剖 ラムダ式との付き合い方~



                                2011/07/22
                            橋本拓也/岡田拓也
はじめに

 自己紹介その1
  名前: 橋本拓也
  Twitter: @toge_
  仕事: トラブルシューター


 自己紹介その2
  名前: 岡田拓也
  Twitter: @omochiya
  仕事: なんでも屋

                                        1
                  Advanced Tech Night
目的

1. 何かと話題のScala。
   システム開発でどれだけ使えるのか、
   Javaエンジニアの視点で紹介するセッション。

2. 関数型言語といえば、Lisp。
   というわけで学生時代に「()」とお友達だった
   二人が、Scalaを解析/紹介します。



                                 2
           Advanced Tech Night
内容

1.   Scalaとは?
2.   Scalaの使い方
3.   Javaエンジニアにとって便利な点
4.   Javaエンジニアにとって気になるところ
5.   Scalaで並列プログラミング
6.   まだまだこれからのところ
7.   まとめ


                                    3
              Advanced Tech Night
1-1. Scalaとは?

                     オブジェクト指向
      遅延評価

                DSL                   Javaと相互互換
  関数型言語
                静的型付け
       独断と偏見で、
     掻い摘んで紹介します。
並列プログラミング
                                           カリー化
                          型推論
部分関数

   Mix-in            パターンマッチ
                                                  4
                Advanced Tech Night
1-2. Scalaの位置づけ

1. 手続き型でもあり、関数型でもある
  Javaライクにも、関数型言語としても、
   どちらの方法でも記述できます。
2. 純粋オブジェクト指向言語
  IntもDoubleも全てオブジェクトです。
3. .NET上でも利用可能
  MicrosoftがScalaのサポートを正式発表。




                                    5
              Advanced Tech Night
1-3. 多言語との比較
           Java               Ruby         Scala
パフォーマンス    ◎                  △            ○
           もはや「遅い」という人        コンパイル言語と比べ   JVM上で動作し、Java
           はもぐりですね            て一桁遅い        と同等レベル
静的型付       ◎                  △            ◎

並列処理       △                  ◎            ◎
           スレッド               Fibetがサポート   Actorがサポート
柔軟性        △                  ◎            ○

オブジェクト指向   ○                  ◎            ◎
           プリミティブ型とか。。。       純粋オブジェクト指向   純粋オブジェクト指向
関数型        ×                  △            ◎
           なし                 可能           言語としてサポート


            イイトコどり言語
           =後発の強みですね。
                                                        6
                    Advanced Tech Night
1-4. 複雑になりすぎることも。。。

1. イイトコどりの代償として、
   文法に色々な要素が取り入れられています。
2. 暗黙の型変換を定義できたり、
   演算子を再定義できたりと、やりたい放題です。
3. 様々な文法要素を取り込むと、
   「書くのは楽でも、読むのは大変」な実装に
   なってしまうことも。。。

    言語を極めて楽をしたいプログラマ向き!?
   変態的プログラミング好きの私にはたまりません。

                                  7
            Advanced Tech Night
2-1. Scalaの使い方
セットアップまでは、いろいろなチュートリアルサイトに説明があるので、ここでは簡単に。

1. インストール。
  ① Javaをインストール、、、
    、、、されてますよね!?当然!?
  ② http://www.scala-lang.org/ からインストーラをDL
    →最新バージョンは2.9.0.1です。
2. 環境変数を設定。
3. とりあえず、コマンドプロンプトで
   「scala」と打ってみよう。
  ちなみに、、、
    64bit Windowsで、32bit JDKを使っていると、
    scala.batのデバッグから楽しめます。。。
                                             8
                    Advanced Tech Night
2-2. 手続き型言語と関数型言語とは?

 手続き型言語とは?
 ① 記述された命令を逐次的に実行していくプログラミング言
   語のこと。
 ② 従来のJavaと同様の考え方です。
 関数型言語とは?
 ① すべての計算や処理を、関数の定義の組合せとして記述
   するプログラミング言語。
 ② 関数を値として扱う。
  • 関数の引数として関数を使ったり、
    関数の引数一部を定数化した関数を作ったり。
  • Java8で導入予定のラムダ式も、この考え方を元にしています。



                                      9
              Advanced Tech Night
2-3. Scalaの手続き型らしい使い方

 object FizzBuzz {
   def main(arg:Array[String]) = {
     for (n <- 1 to 100) {
       if (n % 15 == 0) {
         println("FizzBuzz")
       } else if (n % 3 == 0) {
         println("Fizz")
       } else if (n % 5 == 0) {
         println("Buzz")
       } else {
         println(n)
 } } } }
                                      10
                Advanced Tech Night
2-4. Scalaの関数型らしい使い方1

1. Listを定義
 val list = List(1, 2, 3, 4, 5)

2. 関数を定義
  ① 「Intの引数をとり、二乗した値を返す」関数を
    定義して、変数に代入します
 val pow = (x:Int) => x * x

3. Listの各要素に関数を適用
  ① Listから要素を取り出して、一つずつ結果を表示
 list.foreach( i =>   print( pow( i ) + ", " ) )
 1, 4, 9, 16, 25,
                                                   11
                      Advanced Tech Night
2-5. Scalaの関数型らしい使い方2

4. 「Listと関数」を引数に持つ関数を定義
 def map(x:List[Int])(f:Int => Int):Unit = {
   x.foreach( i => print( f( i ) + ", " ) )
 }

5. Listと関数を入れてみる
 map(list)(pow)
 1, 4, 9, 16, 25,

6. 別のListと関数を入れてみる
 map(List(1,2,3))(x => x * x * x)
 1, 8, 27,

                                           12
                    Advanced Tech Night
3-1. Javaエンジニアにとって便利な点1

 Javaと相互互換
 ① ScalaはJVM上で実行される
 ② Scalaから、すべてのJavaクラスを呼び出し可能
   豊富なJavaのライブラリをそのまま利用できる
 ③ JavaクラスからScalaクラスを呼び出すことも自由



   これまでの資産を無駄にしないで済む
 JavaとScalaを使い分けながら開発できる

                                    13
              Advanced Tech Night
3-2. Javaエンジニアにとって便利な点2

     コード量を削減
public class Person {
  private String lastName_;
  private String firstName_;                 class Person(var lastName:String,
                                                          var firstName:String)
    public Person(String lastName,
                 String firstname) {                              After(Scala)
      lastName_ = lastName;
      firstName_ = firstName;
    }
    public void setXxx(xxx) { ・・・ }
    public String getXxx() { ・・・ }                     コンストラクタやsetter/getterは
}                                                      暗黙的に作成される。
                Before(Java)

                   分かりきっていることは、
                   書きたくないですよね?
                                                                            14
                                 Advanced Tech Night
3-3. Javaエンジニアにとって便利な点3

 Mix-in
       ① trait(トレイト)を用いた複数継承が可能
       ② traitは実装を持つinterface 多重継承使い放題!
import scala.io.Source                                    class Staff(name : String) extends Person(name)
                                                           with FiniteLoop
class Person(name : String)                                with PrintWithParen {

trait FiniteLoop {                                            def action(message :String)
  # actionとcountを実装してもらう                                        = println(message + "@" + name)
  def action(message : String)                                def count():Int = 5
  def count() : Int                                       }

 def loop(message:String) = {                             val person = new Staff("foobar")
  val max = count()
  for (index <- 1 to max) {                               person.loop("work")
    action(message)                                       person.print("some message")
  } } }

trait PrintWithParen {
  # actionを実装してもらう
  def action(message:String)

 def print(message : String) = {
  println("{"); action(message); println("}")
 } }                                                                                                        15
                                                Advanced Tech Night
3-4. Javaエンジニアにとって便利な点4

 演算子のオーバーロード
  case class CSVLine ( line_ : String) {
    var line: String = line_

      def + ( data:String ) : CSVLine = CSVLine(line + "," + data)
      def += ( data:String ) : this.type = {
        line += "," + data
        this
      }
  }

  import scala.io.Source

  var csv = CSVLine("")

  csv = csv + "foo"

  csv += "bar"


      Javaではできない演算子の再定義が可能に!
                                                                     16
                             Advanced Tech Night
4-1. Javaエンジニアにとって気になるところ1

1. JavaVMのオプションはどうやって指定する?
  ① 起動スクリプトを見る限り、-D, -Jを付けることで、
    JavaVMにオプションが渡せるようになっています。
  ② デフォルトではヒープサイズの指定(後述)しかして
    くれないので、JavaVMお約束のオプションは指定
    しておきましょう。
scala.bat
  -J-XX:+HeapDumpOnOutOfMemoryError
  -J-XX:+PrintClassHistogram -J-verbose:gc
  sample.scala
                                             17
                    Advanced Tech Night
4-2. Javaエンジニアにとって気になるところ2

2. デフォルトのヒープサイズはいくつ?
 ① 起動スクリプトを見ると、
   初期値32MB、最大256MBになってます。
   ちょっと本格的な処理を書き始めるとあっさり
   OOMEになるので注意が必要です。
 ② 変更方法は次のどれかですかね。
   a. 起動スクリプト直接いじる
   b. 環境変数JAVA_OPTSにオプションを列挙する
   c. -Jオプションを指定する(例:-J-Xmx1024m)



                                     18
               Advanced Tech Night
4-3. Javaエンジニアにとって気になるところ3

3. スレッドダンプでScala部分は見えるの?
   ⇒scala部分も行数付きで表示されました!
"main" prio=10 tid=0x000000004118f000 nid=0xc83 runnable [0x00007f5ae99cd000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.String.length(String.java:651)
        at java.util.regex.Matcher.getTextLength(Matcher.java:1140)
        at java.util.regex.Matcher.reset(Matcher.java:291)
        at java.util.regex.Matcher.<init>(Matcher.java:211)
        at java.util.regex.Pattern.matcher(Pattern.java:888)
        at java.util.Formatter.parse(Formatter.java:2458)
        at java.util.Formatter.format(Formatter.java:2414)
        at java.util.Formatter.format(Formatter.java:2367)
        at java.lang.String.format(String.java:2769)
        at scala.collection.immutable.StringLike$class.format(StringLike.scala:270)
        at scala.collection.immutable.StringOps.format(StringOps.scala:31)
        at OOMESample$$anonfun$main$1.apply(OOMESample.scala:10)
        at OOMESample$$anonfun$main$1.apply(OOMESample.scala:9)
        at scala.collection.immutable.Range.foreach(Range.scala:75)
        at OOMESample$.main(OOMESample.scala:9)
        at OOMESample.main(OOMESample.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)


                                                                                19
                                    Advanced Tech Night
4-4. Javaエンジニアにとって気になるところ4

4. ひょっとしてヒープダンプも見やすかったり?
 ⇒VisualVMで見ましたが、さすがにダメっぽい・・・。




                                  20
            Advanced Tech Night
5-1. Scalaで並列プログラミング1

1. 2.9から追加されたparを使えば非常に簡単に
   並列化できます。
 object ParaFor {
   def loop(x : Int): (Int, Int) =         {
     var total = 0
     for (i <- 0 to x) {
       total += i
     }
     (x, total)
   }

     def main(args: Array[String]) {
       import scala.io.Source

         (1 to 100).par foreach ( x => print(loop(x) + " "))
     }
 }


 (4,10) (13,91) (76,2926) (26,351) (5,15) (38,741) (27,378) (51,1326)
 (7,28) (1,1) (39,780) (28,406) (2,3) (40,820) (6,21) (77,3003) (14,105)
 (41,861) .... ※順序は実行するたびに変わります。
                                                                           21
                                  Advanced Tech Night
5-2. Scalaで並列プログラミング2

1. parを使った並列処理は、とても単純な物しか
   実現できません。
2. 細かい制御を行うには「アクター」という機能を
   利用します。
 ① Javaの場合はメモリ領域をスレッド間で共有する
   並列処理が一般的です。(共有メモリ)
 ② Scalaではスレッド間がメッセージをやり取りする方
   式をとります。(メッセージパッシング)

   スレッド同士がメッセージをやり取りする
   仕組みを提供していると考えてください。
                                   22
             Advanced Tech Night
5-3. Scalaで並列プログラミング3
import scala.actors._                             val summer = new Summer
import scala.actors.Actor._                       summer.start

class Summer extends Actor {                      val (count, total) = (summer !? 20)
  def sumup(x:Int):(Int, Int) =   {               println(count + ":" + total)
    var total = 0
    for (i <- 0 to x) {                           summer ! 'dispose
      total += i
    }
    (x, total)
  }

    def act() {
      loop {
        react {
          case 'dispose =>
            println("dispose")
            exit
          case n:Int =>
            reply(sumup(n)) ざっと説明するには時間が足りない、、、
        }
      }                       java.util.concurrentも使えるので
    }
}                              おいおい理解すればいいかと。
                                                                                    23
                                      Advanced Tech Night
5-4. 一歩先行くakka

1. Scalaの並列性をさらに推し進めるライブラリ
   "akka"が精力的に開発されています。



2. ScalaのActorを推し進め、さらにSTMというモ
   デルを取り込んだらしいのですが、まだちゃん
   と分かっていません。
3. どなたか説明して頂ける方募集中。
 特にJavaで使えるらしいところを・・・。


                                       24
                 Advanced Tech Night
6-1. まだまだこれからのところ1

1. サポートツールの進化が言語自体に追いつい
   ていない。
 ① EclipseのIDE(ScalaIDE)が2.9.0に未対応
   • 7/21にbeta 9が公開されたばかりのVer 2.0.0で
     対応する予定。



 ② 言語自体の改善の速度が速い、とも言えます。
   TypeSafe社が立ち上がった今年以降も、
   当分この状態は続く可能性あり・・・。

                                       25
                 Advanced Tech Night
6-2. まだまだこれからのところ2

2. 文法もライブラリの仕様も結構変わる。
 ① 1年前のコードでも時代遅れになってしまう。
   将来的にマイナーな文法や機能は動かなくなるか
   もしれない。
   • 改善されていくのはうれしいが、
     実運用には、リスクを見極めて利用する必要あり。


 ② 個人的に敬愛する浅海智晴先生の
   「ボクらのScala」(Scala2.7ベース)は
   2010年発行なのにもう古い個所も。

                                     26
               Advanced Tech Night
6-3. まだまだこれからのところ3

3. Javaほど障害解析・運用監視の基盤が用意さ
   れていない。
 ① プロファイラ・ヒープ解析などの解析ツール、
   運用監視ツールはまだ未整備。
  • JavaVMベースのツールが使えるのがある程度救い。
 ② 程よくJava Bytecodeがwrapされているので、
   ヒープダンプをとっても
   「Scalaのオブジェクトがメモリ使ってるんだな」
   程度しか分からない。



                                    27
              Advanced Tech Night
7. まとめ

1. Scalaは色々な言語のイイとこどり言語です。
2. かゆいところに手が届く一方で、
   大量の機能に翻弄されがち。
3. まずはbetter Javaとして使う・・・ぐらいの
   気軽さで使い始めるのがいいと思います。


         開発効率の高さや柔軟性、
Javaや他のJVM言語との組合せによる可能性を考えると、
      今後が楽しみな言語だと考えています。

                                    28
              Advanced Tech Night

ATN No.2 Scala事始め

  • 1.
    Advanced Tech NightNo.02 Scala事始め ~徹底解剖 ラムダ式との付き合い方~ 2011/07/22 橋本拓也/岡田拓也
  • 2.
    はじめに  自己紹介その1 名前: 橋本拓也  Twitter: @toge_  仕事: トラブルシューター  自己紹介その2  名前: 岡田拓也  Twitter: @omochiya  仕事: なんでも屋 1 Advanced Tech Night
  • 3.
    目的 1. 何かと話題のScala。 システム開発でどれだけ使えるのか、 Javaエンジニアの視点で紹介するセッション。 2. 関数型言語といえば、Lisp。 というわけで学生時代に「()」とお友達だった 二人が、Scalaを解析/紹介します。 2 Advanced Tech Night
  • 4.
    内容 1. Scalaとは? 2. Scalaの使い方 3. Javaエンジニアにとって便利な点 4. Javaエンジニアにとって気になるところ 5. Scalaで並列プログラミング 6. まだまだこれからのところ 7. まとめ 3 Advanced Tech Night
  • 5.
    1-1. Scalaとは? オブジェクト指向 遅延評価 DSL Javaと相互互換 関数型言語 静的型付け 独断と偏見で、 掻い摘んで紹介します。 並列プログラミング カリー化 型推論 部分関数 Mix-in パターンマッチ 4 Advanced Tech Night
  • 6.
    1-2. Scalaの位置づけ 1. 手続き型でもあり、関数型でもある  Javaライクにも、関数型言語としても、 どちらの方法でも記述できます。 2. 純粋オブジェクト指向言語  IntもDoubleも全てオブジェクトです。 3. .NET上でも利用可能  MicrosoftがScalaのサポートを正式発表。 5 Advanced Tech Night
  • 7.
    1-3. 多言語との比較 Java Ruby Scala パフォーマンス ◎ △ ○ もはや「遅い」という人 コンパイル言語と比べ JVM上で動作し、Java はもぐりですね て一桁遅い と同等レベル 静的型付 ◎ △ ◎ 並列処理 △ ◎ ◎ スレッド Fibetがサポート Actorがサポート 柔軟性 △ ◎ ○ オブジェクト指向 ○ ◎ ◎ プリミティブ型とか。。。 純粋オブジェクト指向 純粋オブジェクト指向 関数型 × △ ◎ なし 可能 言語としてサポート イイトコどり言語 =後発の強みですね。 6 Advanced Tech Night
  • 8.
    1-4. 複雑になりすぎることも。。。 1. イイトコどりの代償として、 文法に色々な要素が取り入れられています。 2. 暗黙の型変換を定義できたり、 演算子を再定義できたりと、やりたい放題です。 3. 様々な文法要素を取り込むと、 「書くのは楽でも、読むのは大変」な実装に なってしまうことも。。。 言語を極めて楽をしたいプログラマ向き!? 変態的プログラミング好きの私にはたまりません。 7 Advanced Tech Night
  • 9.
    2-1. Scalaの使い方 セットアップまでは、いろいろなチュートリアルサイトに説明があるので、ここでは簡単に。 1. インストール。 ① Javaをインストール、、、 、、、されてますよね!?当然!? ② http://www.scala-lang.org/ からインストーラをDL →最新バージョンは2.9.0.1です。 2. 環境変数を設定。 3. とりあえず、コマンドプロンプトで 「scala」と打ってみよう。 ちなみに、、、 64bit Windowsで、32bit JDKを使っていると、 scala.batのデバッグから楽しめます。。。 8 Advanced Tech Night
  • 10.
    2-2. 手続き型言語と関数型言語とは?  手続き型言語とは? ① 記述された命令を逐次的に実行していくプログラミング言 語のこと。 ② 従来のJavaと同様の考え方です。  関数型言語とは? ① すべての計算や処理を、関数の定義の組合せとして記述 するプログラミング言語。 ② 関数を値として扱う。 • 関数の引数として関数を使ったり、 関数の引数一部を定数化した関数を作ったり。 • Java8で導入予定のラムダ式も、この考え方を元にしています。 9 Advanced Tech Night
  • 11.
    2-3. Scalaの手続き型らしい使い方 objectFizzBuzz { def main(arg:Array[String]) = { for (n <- 1 to 100) { if (n % 15 == 0) { println("FizzBuzz") } else if (n % 3 == 0) { println("Fizz") } else if (n % 5 == 0) { println("Buzz") } else { println(n) } } } } 10 Advanced Tech Night
  • 12.
    2-4. Scalaの関数型らしい使い方1 1. Listを定義 val list = List(1, 2, 3, 4, 5) 2. 関数を定義 ① 「Intの引数をとり、二乗した値を返す」関数を 定義して、変数に代入します val pow = (x:Int) => x * x 3. Listの各要素に関数を適用 ① Listから要素を取り出して、一つずつ結果を表示 list.foreach( i => print( pow( i ) + ", " ) ) 1, 4, 9, 16, 25, 11 Advanced Tech Night
  • 13.
    2-5. Scalaの関数型らしい使い方2 4. 「Listと関数」を引数に持つ関数を定義 def map(x:List[Int])(f:Int => Int):Unit = { x.foreach( i => print( f( i ) + ", " ) ) } 5. Listと関数を入れてみる map(list)(pow) 1, 4, 9, 16, 25, 6. 別のListと関数を入れてみる map(List(1,2,3))(x => x * x * x) 1, 8, 27, 12 Advanced Tech Night
  • 14.
    3-1. Javaエンジニアにとって便利な点1  Javaと相互互換 ① ScalaはJVM上で実行される ② Scalaから、すべてのJavaクラスを呼び出し可能 豊富なJavaのライブラリをそのまま利用できる ③ JavaクラスからScalaクラスを呼び出すことも自由 これまでの資産を無駄にしないで済む JavaとScalaを使い分けながら開発できる 13 Advanced Tech Night
  • 15.
    3-2. Javaエンジニアにとって便利な点2  コード量を削減 public class Person { private String lastName_; private String firstName_; class Person(var lastName:String, var firstName:String) public Person(String lastName, String firstname) { After(Scala) lastName_ = lastName; firstName_ = firstName; } public void setXxx(xxx) { ・・・ } public String getXxx() { ・・・ } コンストラクタやsetter/getterは } 暗黙的に作成される。 Before(Java) 分かりきっていることは、 書きたくないですよね? 14 Advanced Tech Night
  • 16.
    3-3. Javaエンジニアにとって便利な点3  Mix-in ① trait(トレイト)を用いた複数継承が可能 ② traitは実装を持つinterface 多重継承使い放題! import scala.io.Source class Staff(name : String) extends Person(name) with FiniteLoop class Person(name : String) with PrintWithParen { trait FiniteLoop { def action(message :String) # actionとcountを実装してもらう = println(message + "@" + name) def action(message : String) def count():Int = 5 def count() : Int } def loop(message:String) = { val person = new Staff("foobar") val max = count() for (index <- 1 to max) { person.loop("work") action(message) person.print("some message") } } } trait PrintWithParen { # actionを実装してもらう def action(message:String) def print(message : String) = { println("{"); action(message); println("}") } } 15 Advanced Tech Night
  • 17.
    3-4. Javaエンジニアにとって便利な点4  演算子のオーバーロード case class CSVLine ( line_ : String) { var line: String = line_ def + ( data:String ) : CSVLine = CSVLine(line + "," + data) def += ( data:String ) : this.type = { line += "," + data this } } import scala.io.Source var csv = CSVLine("") csv = csv + "foo" csv += "bar" Javaではできない演算子の再定義が可能に! 16 Advanced Tech Night
  • 18.
    4-1. Javaエンジニアにとって気になるところ1 1. JavaVMのオプションはどうやって指定する? ① 起動スクリプトを見る限り、-D, -Jを付けることで、 JavaVMにオプションが渡せるようになっています。 ② デフォルトではヒープサイズの指定(後述)しかして くれないので、JavaVMお約束のオプションは指定 しておきましょう。 scala.bat -J-XX:+HeapDumpOnOutOfMemoryError -J-XX:+PrintClassHistogram -J-verbose:gc sample.scala 17 Advanced Tech Night
  • 19.
    4-2. Javaエンジニアにとって気になるところ2 2. デフォルトのヒープサイズはいくつ? ① 起動スクリプトを見ると、 初期値32MB、最大256MBになってます。 ちょっと本格的な処理を書き始めるとあっさり OOMEになるので注意が必要です。 ② 変更方法は次のどれかですかね。 a. 起動スクリプト直接いじる b. 環境変数JAVA_OPTSにオプションを列挙する c. -Jオプションを指定する(例:-J-Xmx1024m) 18 Advanced Tech Night
  • 20.
    4-3. Javaエンジニアにとって気になるところ3 3. スレッドダンプでScala部分は見えるの? ⇒scala部分も行数付きで表示されました! "main" prio=10 tid=0x000000004118f000 nid=0xc83 runnable [0x00007f5ae99cd000] java.lang.Thread.State: RUNNABLE at java.lang.String.length(String.java:651) at java.util.regex.Matcher.getTextLength(Matcher.java:1140) at java.util.regex.Matcher.reset(Matcher.java:291) at java.util.regex.Matcher.<init>(Matcher.java:211) at java.util.regex.Pattern.matcher(Pattern.java:888) at java.util.Formatter.parse(Formatter.java:2458) at java.util.Formatter.format(Formatter.java:2414) at java.util.Formatter.format(Formatter.java:2367) at java.lang.String.format(String.java:2769) at scala.collection.immutable.StringLike$class.format(StringLike.scala:270) at scala.collection.immutable.StringOps.format(StringOps.scala:31) at OOMESample$$anonfun$main$1.apply(OOMESample.scala:10) at OOMESample$$anonfun$main$1.apply(OOMESample.scala:9) at scala.collection.immutable.Range.foreach(Range.scala:75) at OOMESample$.main(OOMESample.scala:9) at OOMESample.main(OOMESample.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 19 Advanced Tech Night
  • 21.
    4-4. Javaエンジニアにとって気になるところ4 4. ひょっとしてヒープダンプも見やすかったり? ⇒VisualVMで見ましたが、さすがにダメっぽい・・・。 20 Advanced Tech Night
  • 22.
    5-1. Scalaで並列プログラミング1 1. 2.9から追加されたparを使えば非常に簡単に 並列化できます。 object ParaFor { def loop(x : Int): (Int, Int) = { var total = 0 for (i <- 0 to x) { total += i } (x, total) } def main(args: Array[String]) { import scala.io.Source (1 to 100).par foreach ( x => print(loop(x) + " ")) } } (4,10) (13,91) (76,2926) (26,351) (5,15) (38,741) (27,378) (51,1326) (7,28) (1,1) (39,780) (28,406) (2,3) (40,820) (6,21) (77,3003) (14,105) (41,861) .... ※順序は実行するたびに変わります。 21 Advanced Tech Night
  • 23.
    5-2. Scalaで並列プログラミング2 1. parを使った並列処理は、とても単純な物しか 実現できません。 2. 細かい制御を行うには「アクター」という機能を 利用します。 ① Javaの場合はメモリ領域をスレッド間で共有する 並列処理が一般的です。(共有メモリ) ② Scalaではスレッド間がメッセージをやり取りする方 式をとります。(メッセージパッシング) スレッド同士がメッセージをやり取りする 仕組みを提供していると考えてください。 22 Advanced Tech Night
  • 24.
    5-3. Scalaで並列プログラミング3 import scala.actors._ val summer = new Summer import scala.actors.Actor._ summer.start class Summer extends Actor { val (count, total) = (summer !? 20) def sumup(x:Int):(Int, Int) = { println(count + ":" + total) var total = 0 for (i <- 0 to x) { summer ! 'dispose total += i } (x, total) } def act() { loop { react { case 'dispose => println("dispose") exit case n:Int => reply(sumup(n)) ざっと説明するには時間が足りない、、、 } } java.util.concurrentも使えるので } } おいおい理解すればいいかと。 23 Advanced Tech Night
  • 25.
    5-4. 一歩先行くakka 1. Scalaの並列性をさらに推し進めるライブラリ "akka"が精力的に開発されています。 2. ScalaのActorを推し進め、さらにSTMというモ デルを取り込んだらしいのですが、まだちゃん と分かっていません。 3. どなたか説明して頂ける方募集中。 特にJavaで使えるらしいところを・・・。 24 Advanced Tech Night
  • 26.
    6-1. まだまだこれからのところ1 1. サポートツールの進化が言語自体に追いつい ていない。 ① EclipseのIDE(ScalaIDE)が2.9.0に未対応 • 7/21にbeta 9が公開されたばかりのVer 2.0.0で 対応する予定。 ② 言語自体の改善の速度が速い、とも言えます。 TypeSafe社が立ち上がった今年以降も、 当分この状態は続く可能性あり・・・。 25 Advanced Tech Night
  • 27.
    6-2. まだまだこれからのところ2 2. 文法もライブラリの仕様も結構変わる。 ① 1年前のコードでも時代遅れになってしまう。 将来的にマイナーな文法や機能は動かなくなるか もしれない。 • 改善されていくのはうれしいが、 実運用には、リスクを見極めて利用する必要あり。 ② 個人的に敬愛する浅海智晴先生の 「ボクらのScala」(Scala2.7ベース)は 2010年発行なのにもう古い個所も。 26 Advanced Tech Night
  • 28.
    6-3. まだまだこれからのところ3 3. Javaほど障害解析・運用監視の基盤が用意さ れていない。 ① プロファイラ・ヒープ解析などの解析ツール、 運用監視ツールはまだ未整備。 • JavaVMベースのツールが使えるのがある程度救い。 ② 程よくJava Bytecodeがwrapされているので、 ヒープダンプをとっても 「Scalaのオブジェクトがメモリ使ってるんだな」 程度しか分からない。 27 Advanced Tech Night
  • 29.
    7. まとめ 1. Scalaは色々な言語のイイとこどり言語です。 2.かゆいところに手が届く一方で、 大量の機能に翻弄されがち。 3. まずはbetter Javaとして使う・・・ぐらいの 気軽さで使い始めるのがいいと思います。 開発効率の高さや柔軟性、 Javaや他のJVM言語との組合せによる可能性を考えると、 今後が楽しみな言語だと考えています。 28 Advanced Tech Night