SlideShare ist ein Scribd-Unternehmen logo
1 von 29
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

Weitere ähnliche Inhalte

Was ist angesagt?

Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Ra Zon
 
JDK 10 へようこそ
JDK 10 へようこそJDK 10 へようこそ
JDK 10 へようこそDavid Buck
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2Masatoshi Tada
 
Shibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R についてShibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R についてtnoda
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0Kenji Yoshida
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みChihiro Ito
 
Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編takeuchi-tk
 
ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月Taku Miyakawa
 
JVMの中身を可視化してみた
JVMの中身を可視化してみたJVMの中身を可視化してみた
JVMの中身を可視化してみたKengo Toda
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!bitter_fox
 
夏だからJava再入門
夏だからJava再入門夏だからJava再入門
夏だからJava再入門Katsumi Honda
 
PHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較するPHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較するkwatch
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Tomoharu ASAMI
 
正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?kwatch
 
Java8のstreamをダラダラまとめてみる
Java8のstreamをダラダラまとめてみるJava8のstreamをダラダラまとめてみる
Java8のstreamをダラダラまとめてみるShinya Mochida
 
演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみよう演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみようTakashi Ishio
 
ジェネリクスの基礎と クラス設計への応用
ジェネリクスの基礎とクラス設計への応用ジェネリクスの基礎とクラス設計への応用
ジェネリクスの基礎と クラス設計への応用nagise
 

Was ist angesagt? (20)

Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
JDK 10 へようこそ
JDK 10 へようこそJDK 10 へようこそ
JDK 10 へようこそ
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
 
Shibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R についてShibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R について
 
Java8勉強会
Java8勉強会Java8勉強会
Java8勉強会
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
 
Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編
 
ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月
 
JVMの中身を可視化してみた
JVMの中身を可視化してみたJVMの中身を可視化してみた
JVMの中身を可視化してみた
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
 
夏だからJava再入門
夏だからJava再入門夏だからJava再入門
夏だからJava再入門
 
Phantom Type in Scala
Phantom Type in ScalaPhantom Type in Scala
Phantom Type in Scala
 
PHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較するPHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較する
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
 
正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?
 
Java8のstreamをダラダラまとめてみる
Java8のstreamをダラダラまとめてみるJava8のstreamをダラダラまとめてみる
Java8のstreamをダラダラまとめてみる
 
演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみよう演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみよう
 
Xtend の紹介
Xtend の紹介Xtend の紹介
Xtend の紹介
 
ジェネリクスの基礎と クラス設計への応用
ジェネリクスの基礎とクラス設計への応用ジェネリクスの基礎とクラス設計への応用
ジェネリクスの基礎と クラス設計への応用
 

Ähnlich wie ATN No.2 Scala事始め

Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsShogo Sensui
 
Scalatronで楽しく学ぶ関数型プログラミング
Scalatronで楽しく学ぶ関数型プログラミングScalatronで楽しく学ぶ関数型プログラミング
Scalatronで楽しく学ぶ関数型プログラミングJun Saito
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentialstnoda
 
第2回関数型言語勉強会 大阪
第2回関数型言語勉強会 大阪第2回関数型言語勉強会 大阪
第2回関数型言語勉強会 大阪Naoki Kitora
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門SatoYu1ro
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門masatora atarashi
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発papamitra
 
Scala Daysに行ってみて
Scala Daysに行ってみてScala Daysに行ってみて
Scala Daysに行ってみてKota Mizushima
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and designTomoharu ASAMI
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発Kota Mizushima
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiTomohiro Kumagai
 
言語アップデート -Scala編-
言語アップデート -Scala編-言語アップデート -Scala編-
言語アップデート -Scala編-Kota Mizushima
 

Ähnlich wie ATN No.2 Scala事始め (20)

Trait in scala
Trait in scalaTrait in scala
Trait in scala
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
Rpscala2011 0601
Rpscala2011 0601Rpscala2011 0601
Rpscala2011 0601
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
Scalatronで楽しく学ぶ関数型プログラミング
Scalatronで楽しく学ぶ関数型プログラミングScalatronで楽しく学ぶ関数型プログラミング
Scalatronで楽しく学ぶ関数型プログラミング
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentials
 
第2回関数型言語勉強会 大阪
第2回関数型言語勉強会 大阪第2回関数型言語勉強会 大阪
第2回関数型言語勉強会 大阪
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
Scala Daysに行ってみて
Scala Daysに行ってみてScala Daysに行ってみて
Scala Daysに行ってみて
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and design
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
 
言語アップデート -Scala編-
言語アップデート -Scala編-言語アップデート -Scala編-
言語アップデート -Scala編-
 

Mehr von AdvancedTechNight

CSS3Rendererを使ってiOSでもサクサク3D
CSS3Rendererを使ってiOSでもサクサク3DCSS3Rendererを使ってiOSでもサクサク3D
CSS3Rendererを使ってiOSでもサクサク3DAdvancedTechNight
 
D3.jsと学ぶVisualization(可視化)の世界
D3.jsと学ぶVisualization(可視化)の世界D3.jsと学ぶVisualization(可視化)の世界
D3.jsと学ぶVisualization(可視化)の世界AdvancedTechNight
 
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めようAdvancedTechNight
 
CSSだけで実現するグラフィック表現
CSSだけで実現するグラフィック表現CSSだけで実現するグラフィック表現
CSSだけで実現するグラフィック表現AdvancedTechNight
 
これから利用拡大?WebSocket
これから利用拡大?WebSocketこれから利用拡大?WebSocket
これから利用拡大?WebSocketAdvancedTechNight
 
全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験AdvancedTechNight
 
TypeScriptのススメ ~JavaエンジニアのためのJava(like)Script
TypeScriptのススメ ~JavaエンジニアのためのJava(like)ScriptTypeScriptのススメ ~JavaエンジニアのためのJava(like)Script
TypeScriptのススメ ~JavaエンジニアのためのJava(like)ScriptAdvancedTechNight
 
three.jsで作る3Dの世界
three.jsで作る3Dの世界three.jsで作る3Dの世界
three.jsで作る3Dの世界AdvancedTechNight
 
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介AdvancedTechNight
 
Stormの注目の新機能TridentAPI
Stormの注目の新機能TridentAPIStormの注目の新機能TridentAPI
Stormの注目の新機能TridentAPIAdvancedTechNight
 
分散ストリーム処理フレームワーク Apache S4
分散ストリーム処理フレームワーク Apache S4分散ストリーム処理フレームワーク Apache S4
分散ストリーム処理フレームワーク Apache S4AdvancedTechNight
 
Twitterのリアルタイム分散処理システム「Storm」入門 demo
Twitterのリアルタイム分散処理システム「Storm」入門 demoTwitterのリアルタイム分散処理システム「Storm」入門 demo
Twitterのリアルタイム分散処理システム「Storm」入門 demoAdvancedTechNight
 
Twitterのリアルタイム分散処理システム「Storm」入門
Twitterのリアルタイム分散処理システム「Storm」入門Twitterのリアルタイム分散処理システム「Storm」入門
Twitterのリアルタイム分散処理システム「Storm」入門AdvancedTechNight
 
ログ収集フレームワークの新バージョン「FlumeNG」
ログ収集フレームワークの新バージョン「FlumeNG」ログ収集フレームワークの新バージョン「FlumeNG」
ログ収集フレームワークの新バージョン「FlumeNG」AdvancedTechNight
 
Hadoop scr第7回 hw2011フィードバック
Hadoop scr第7回 hw2011フィードバックHadoop scr第7回 hw2011フィードバック
Hadoop scr第7回 hw2011フィードバックAdvancedTechNight
 
ななめ45°から見たJavaOne
ななめ45°から見たJavaOneななめ45°から見たJavaOne
ななめ45°から見たJavaOneAdvancedTechNight
 
ATN No.1 MapReduceだけでない!? Hadoopとその仲間たち
ATN No.1 MapReduceだけでない!? Hadoopとその仲間たちATN No.1 MapReduceだけでない!? Hadoopとその仲間たち
ATN No.1 MapReduceだけでない!? Hadoopとその仲間たちAdvancedTechNight
 
ATN No.1 Hadoop vs Amazon EMR
ATN No.1 Hadoop vs Amazon EMRATN No.1 Hadoop vs Amazon EMR
ATN No.1 Hadoop vs Amazon EMRAdvancedTechNight
 

Mehr von AdvancedTechNight (20)

CSS3Rendererを使ってiOSでもサクサク3D
CSS3Rendererを使ってiOSでもサクサク3DCSS3Rendererを使ってiOSでもサクサク3D
CSS3Rendererを使ってiOSでもサクサク3D
 
D3.jsと学ぶVisualization(可視化)の世界
D3.jsと学ぶVisualization(可視化)の世界D3.jsと学ぶVisualization(可視化)の世界
D3.jsと学ぶVisualization(可視化)の世界
 
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
 
CSSだけで実現するグラフィック表現
CSSだけで実現するグラフィック表現CSSだけで実現するグラフィック表現
CSSだけで実現するグラフィック表現
 
これから利用拡大?WebSocket
これから利用拡大?WebSocketこれから利用拡大?WebSocket
これから利用拡大?WebSocket
 
全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験
 
Backbone.js入門
Backbone.js入門Backbone.js入門
Backbone.js入門
 
TypeScriptのススメ ~JavaエンジニアのためのJava(like)Script
TypeScriptのススメ ~JavaエンジニアのためのJava(like)ScriptTypeScriptのススメ ~JavaエンジニアのためのJava(like)Script
TypeScriptのススメ ~JavaエンジニアのためのJava(like)Script
 
three.jsで作る3Dの世界
three.jsで作る3Dの世界three.jsで作る3Dの世界
three.jsで作る3Dの世界
 
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介
 
Stormの注目の新機能TridentAPI
Stormの注目の新機能TridentAPIStormの注目の新機能TridentAPI
Stormの注目の新機能TridentAPI
 
Spine入門
Spine入門Spine入門
Spine入門
 
分散ストリーム処理フレームワーク Apache S4
分散ストリーム処理フレームワーク Apache S4分散ストリーム処理フレームワーク Apache S4
分散ストリーム処理フレームワーク Apache S4
 
Twitterのリアルタイム分散処理システム「Storm」入門 demo
Twitterのリアルタイム分散処理システム「Storm」入門 demoTwitterのリアルタイム分散処理システム「Storm」入門 demo
Twitterのリアルタイム分散処理システム「Storm」入門 demo
 
Twitterのリアルタイム分散処理システム「Storm」入門
Twitterのリアルタイム分散処理システム「Storm」入門Twitterのリアルタイム分散処理システム「Storm」入門
Twitterのリアルタイム分散処理システム「Storm」入門
 
ログ収集フレームワークの新バージョン「FlumeNG」
ログ収集フレームワークの新バージョン「FlumeNG」ログ収集フレームワークの新バージョン「FlumeNG」
ログ収集フレームワークの新バージョン「FlumeNG」
 
Hadoop scr第7回 hw2011フィードバック
Hadoop scr第7回 hw2011フィードバックHadoop scr第7回 hw2011フィードバック
Hadoop scr第7回 hw2011フィードバック
 
ななめ45°から見たJavaOne
ななめ45°から見たJavaOneななめ45°から見たJavaOne
ななめ45°から見たJavaOne
 
ATN No.1 MapReduceだけでない!? Hadoopとその仲間たち
ATN No.1 MapReduceだけでない!? Hadoopとその仲間たちATN No.1 MapReduceだけでない!? Hadoopとその仲間たち
ATN No.1 MapReduceだけでない!? Hadoopとその仲間たち
 
ATN No.1 Hadoop vs Amazon EMR
ATN No.1 Hadoop vs Amazon EMRATN No.1 Hadoop vs Amazon EMR
ATN No.1 Hadoop vs Amazon EMR
 

ATN No.2 Scala事始め

  • 1. Advanced Tech Night No.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の手続き型らしい使い方 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
  • 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