javaworld day 2009 scala
DESCRIPTION
JavaWorld Day 2009TRANSCRIPT
“ネクストJava”の大本命!?マルチパラダイム言語「Scala」
2009年8月6日
浅海智晴匠Lab、edge2.cc、日本Javaユーザグループ
自己紹介
SimpleModelerScala DSLを用いたモデル・コンパイラScala DSLで記述したモデルからクラス図、ステートマシーン図やGoogle App Engineのアプリケーションを生成http://code.google.com/p/simplemodeler/Scalaプログラミング歴1年強
edge2.ccクラウド・コンピューティングの実証研究プロジェクトhttp://www.edge2.cc
匠Lab匠の技でビジネスとITを繋げるhttp://www.takumi-lab.co.jp/要求開発×モデル駆動開発×クラウド・コンピューティング
内容
Scalaとは
Scala文法ハイライト
Scalaの応用分野
Scalaとは
Scalaとは
Scalable Language「純粋」オブジェクト指向&「本格」関数型のハイブリッド言語
現時点のプログラミング言語の便利機能を貪欲に吸収
体感的には…使いやすいJava関数型までついてる
Scalaは巨大?
言語仕様はJavaの方が大きいかも『Programming in Scala』 776ページ『Java Programming Language第4版』 928ページ『Java Programming Language第1版』 333ページ
クラスライブラリScala固有のクラスライブラリ
言語と緊密な関係を持つものScalaならではの応用
その他はJavaと共通
実行環境Java VM → Javaと共通
プログラミング言語の歴史手続き型/C→OO/Java→関数型/Scala?
1985 1995 2009
C Java Scala ?
オブジェクト指向 関数型
クラス/オブジェクト継承
高階関数遅延評価
ハードウェア性能の向上
手続き型・オブジェクト指向・関数型
プログラム本体
サブルーチン
呼び出し
プログラム本体
サブルーチン
呼び出し
フレームワーク
呼び出し
手続き型言語 オブジェクト指向言語
プログラム本体
アルゴリズム
呼び出し
フレームワーク
呼び出し
サブルーチン
関数型(+オブジェクト指向言語)
クラス/オブジェクト継承
高階関数遅延評価
関数型言語の2つの側面
関数型言語関数が基本的な構成要素となる言語
数学のバックボーン(ラムダ計算)を持つプログラミング言語
数学を基盤にすることで、プログラムの処理内容の証明が可能
研究継続中?
並列処理では重要な意味を持つかもしれない
高階関数、遅延評価の機構によってプログラム断片の再利用率が飛躍的に高まる
実用言語としては、これが重要
Scalaの特徴
Scala
Java
C#
C C++
Smalltalk
Ruby
オブジェクト指向
統一オブジェクト
モデル
普遍ネスティング
Algol
Simula
Beta
gbeta
Effiel
統一アクセス
関数型
ML
SML
Ocaml
F#
Haskel
Erlang
スケーラビリティ
アクター基盤並行ライブラリ
Smalltalk
Iswim
Lisp
C++
&オブジェクト指向 関数型
Ruby
Smalltalk
Python
Pizza
Nice
Multi-Java
OCaml
F#
PLT-Scheme
abstract type
trait
extractor
Scalaの言語機能
Java
スクリプト言語
統一オブジェクト・モデルテキスト指向
使いやすいコレクションクロージャ
コンパイラ
Scala
関数型言語
高階関数遅延評価
不変オブジェクトパターン・マッチング
モナドアクター
オブジェクト指向
Java VMクラス・ライブラリ
業界標準API
C文法
コンパイラ
オブジェクト指向
Java VMクラス・ライブラリ
業界標準API
統一オブジェクト・モデルテキスト指向
使いやすいコレクションクロージャ
高階関数遅延評価
不変オブジェクトパターン・マッチング
モナドアクター
型推論
静的型付
インタープリタ
動的型付
インタープリタ
型推論
静的型付
抽象型トレイツ
エクストラクタケース・クラス
暗黙変換XMLリテラル
パーサー・コンビネータ
メタ・オブジェクト
Scalaの特徴的な機能(私見best 5)trait(トレイツ)
抽象クラスーα多重継承の問題を回避しつつ、多重継承的な機能を実現mix-inに使用
for文モナドの文法糖衣
チェック付き例外なしプログラミングが楽に!特に問題は感じられなかった
match文パターン・マッチングがデータ構造操作でも非常に重要Javaプログラミングではイディオムとして繰り返し手入力が必要な処理がmatch文で簡明に記述
caseクラスデータを記述するためのクラスの記述が楽になるmatch文との連携
Scalaクラスライブラリ
Parser CombinatorパーサージェネレータBNFを記述するScala DSL
Actorアクター・モデルによる並行処理
副作用がない関数型を活かす並行処理モデルScala DSLによる専用文法
Scala SwingSwing用Scala DSL
BDD (Behavior Driven Development)scalatesthttp://www.artima.com/scalatest/BDD用Scala DSL
応用
LiftWebフレームワーク
Twitterメッセージ・エンジンRubyからScalaに変更
Apache CamelのDSLXML DSL (SpringのXMLコンフィグに埋め込んで使用)、Java DSLに続いて、Scala DSLを開発中
SimpleModeler浅海が開発中
Scala DSLで記述したモデルからクラス図、ステートマシーン図やGoogle App Engine/Javaのアプリケーションを生成
http://code.google.com/p/simplemodeler/
なぜScalaなのか
ハードウェアの進化スクリプト言語と関数型の機能を実用言語の言語機能として利用することが可能になった。
Webの台頭Web指向、テキスト指向のプログラミング言語が必要になった。
マルチコア、クラウド・コンピューティング、DSLなどの新しい応用
これらの応用に対応できるプログラミング言語が必要になった。
Scala文法ハイライト
Scala文法ハイライトfor文
for (i <- 0 until 3) {println(i)
}
012
val list = List(1, 2, 3)for (elem <- list) {println(elem)
}
012
Scala文法ハイライトfor yield文
val list = List(1, 2, 3)val result0 = list.map(_ + 1)println("pre = " + result0)val result1 = list.map(elem => (elem + 1).toString)println("use map = " + result1)val result2 = for (elem <- list) yield
(elem + 1).toStringprintln("use for = " + result2)
pre = List(2, 3, 4)use map = List(2, 3, 4)use for = List(2, 3, 4)
Scala文法ハイライトExtractor&正規表現
val extractor = """(¥d¥d¥d¥d)-(¥d¥d)-(¥d¥d)""".rval extractor(yearString, monthString, dayString) =
"2009-08-06"val year = yearString.toIntval month = monthString.toIntval day = dayString.toIntval result = "%04d-%02d-%02d".format(year,
month, day)println(result)
2009-08-06
Scala文法ハイライトmatch文
abstract class Baseclass Concrete1 extends Base {
def one = println("concrete one")}class Concrete2 extends Base {
def two = println("concrete two")}class Concrete3 extends Base {
def three = println("concrete three")}
def get_base = if (true) new Concrete2 else new Concrete3val b = get_baseb match {
case c: Concrete1 => c.onecase c: Concrete2 => c.twocase c: Concrete3 => c.three
}
concrete two
Scala文法ハイライトExtractorとmatch文
val extractor = """(¥d¥d¥d¥d)-(¥d¥d)-(¥d¥d)""".rval ymd = "2009-08-06"ymd match {case extractor("2008", _, _) => println("2008")case extractor("2009", _, _) => println("2009")case extractor("2010", _, _) => println("2010")case _ => println("Unkonwn")
}
2009
Scala文法ハイライトケースクラスとmatch文
case class YearMonthDay(year: Int, month: Int, day: Int)
val ymd = YearMonthDay(2009, 8, 6)ymd match {case YearMonthDay(2008, _, _) => println("2008")case YearMonthDay(2009, _, _) => println("2009")case YearMonthDay(2010, _, _) => println("2010")case _ => println("Unkonwn")
}
2009
Scala文法ハイライト
クロージャ
val closures = for (index <- 0 until 3) yield{ (number: Int) => number + index }
println(closures)for (closure <- closures) {val result = closure(100)println(result)
}
RangeM(<function>, <function>, <function>)100101102
Scala文法ハイライトXML
val cities = <cities><city>Tokyo</city><city>Osaka</city></cities>
val names = for (city <- cities ¥¥ "city") yield city.textprintln(names)val cities2 = <cities>{
for (city <- names) yield <city>{ city }</city>}</cities>println(cities2)
ArrayBufferRO(Tokyo, Osaka)<cities><city>Tokyo</city><city>Osaka</city></cities>
Scalaの応用分野
マルチコア
単一のCPU筐体の中に複数のCPUコアが同梱されているプロセッサ。
アプリケーション・プログラムの観点からはマルチ・プロセッサとしてみえる。
性能向上はクロック数の向上ではなく、使用するコア数の増加によって達成する。
並列処理を行うアプリケーションでないと、性能が向上しない。
マルチコア関数による副作用を伴わない計算
可変データ
手続きメソッド
手続きメソッド
手続きメソッド
手続き型オブジェクト指向
純粋関数型
複数の関数がメモリを共有するので競合が
発生する
関数
不変データ 不変データ
不変データ
関数
関数
変換・複写
変換・複写
。変更がない部分は共有する 不変データなので
データが破壊されることはない
関数は不変データを変換しながら複写したデータを他の関数に受け渡す
不変データ
マルチコア共有メモリ方式とメッセージパッシング方式
メモリ
スレッド スレッド
スレッド
スレッド スレッド
スレッド
メッセージボックス
共有メモリ方式 メッセージパッシング方式
メモリ
メモリ
メッセージボックス
複数のスレッドがメモリを共有するので競合が発生
する
メモリはスレッドが、占有するので 競
合が発生しない
メッセージボックスを経由したメッセージ交換によって非同期処理を
実現する
Javaモニタjava.util.concurrentscala.concurrent
scala.actors
クラウド・コンピューティング
Webプラットフォームテキスト指向、XML指向
スケーラビリティパブリックなインターネット空間上に事実上無尽蔵に用意されたCPUやストレージなどのリソースを活用
非同期、並列、分散
分散アプリケーション非同期、並列、分散
アプリケーション・アーキテクチャ
プレゼンテーション層
サーバ側クラウド・アプリケーション
統合層
サービス
サービス
分散ストレージ
データベース
メッセージ・キュー
:アクセス方式2 手続き呼出し、性能特性 障害特性がローカル
。の手続き呼び出しよりも脆弱
:アクセス方式3 メッセージング。分散環境での連携に適応する特性をもつ
:アクセス方式4 分散ストレージ通常のデータベースのような更新処理は難し
。い
アクセス方式5:RESTWebページを手繰って情報を取得する
アクセス方式1:ローカル・データベースアプリケーションが占有するデータはロー
。カルデータベースに格納する
サービスサービス
ドメイン層
ビジネス層
プレゼンテーション層
REST
統合層
アプリケーションの論理的な構成は従来のものと変わらない
Web
クライアント側
GUI
RIA
サービス
クラウド・アプリケーションの構成例
クラウド・アプリケーション
サービス
メッセージ・キュー
サービス
メッセージ・キュー
プレゼンテーション
サービス
サービス
REST
サービス
分散ストレージ
マスターデータなど更新頻度が低いデータは分散ストレージで配布して
。直接参照する
バックエンドのサービス群もメッセ。ージによって連携
、結果を直接知りたい場合には 手続き呼び出しで同期型の連携を
。行う この形式の連携を行うとスケーラ
。ビリティが低くなる プレゼンテーションの段階ででき、ることをやっておくと スケールア
ウトの効果によってスケーラビリテ。ィが高まる
外部サービスからRESTを用いて情報を取得するのが典型的な利
。用方法
データベースデータベースをアクセスするスコ
ープはサービスに閉じておくのが。よい
サービス利用の主力はメッセージ。である この形式の連携を行うと
スケールアウトによってスケーラビ。リティを確保できる
メッセージ送信
同期通信
メッセージ配信
クラウド・コンピューティングとScala
テキスト指向、XML指向Scalaの得意とするところ
生文字リテラル、正規表現、パターン・マッチング、ExtractorXMLリテラル、パス検索、パターン・マッチング
非同期・並列・分散Javaの並列処理機能
スレッド、モニタ、並列ライブラリ
関数型言語不変オブジェクトモナド
アクター・ライブラリ
DSL(Domain Specific Language)
応用分野、技術分野の領域(ドメイン)ごとに専用の言語を用意する簡潔で過不足のない適切なモデルを記述できる
テキストDSLUMLのようなグラフィカル言語は、モデルを記述する作業が煩雑プログラミング言語のようにテキストでモデルを記述すると効率がよい
内部DSLホスト言語となるプログラミング言語上にDSLを構築Scalaはホスト言語に最適の文法を備えている
スケーラブル
外部DSLparser combinator
Scalaが提供するパーサー・ジェネレータ専用DSLでBNF相当の文法を定義
モデル駆動開発&コンポーネント
OO分析
DSL
DSL
OO設計 OO実装
DSL
OO設計 OO実装
コンポーネント
コンポーネント
コンポーネント
コンポーネント
コンポーネント
自動生成
自動生成
自動生成
OO分析
分析 設計 実装
DSLDSLの例
case class App20090505() extends 施設利用申請書 {会員番号 = 123456名前 = "Scala太郎"理由(<div>Scalaの勉強会を行うため。</div>)理由("Liftも少し取り上げるかもしれません。")
申請 {施設(20090601, 1300, 1400, 講堂) 理由は <div>初日は講堂で講演したいから</div>
同時利用(20090602, 1000, 1200) {施設(第1会議室)施設(第2会議室) 理由は "第1会議室だけだと足りないから"設備(ホワイトボード) 個数は 2 理由は "会議室ごとに利用"
} 理由は """両方同時に利用希望します。片方だけだと入りきらないので。"""}
}
DSLから生成したHTML
DSL変換処理
テキスト テキスト
XML XML
オブジェクトオブジェクト
変換処理
アプリケーション・フレームワーク
APIからDSLへ旧来のAPI:手続き呼び出し、抽象クラスの継承DSLを用いることで、簡潔、適切にフレームワークの提供する機能を利用することができるSpringに対するGrails
Groovyを用いたSpring DSLと考えることで、アーキテクチャ上の位置付けが理解できる
Apache CamelインテグレーションフレームワークXML DSL、Java DSLに続いてScala DSLを開発中
ScalaとJavaの協業アプリケーション・フレームワークはScalaコンポーネントはScalaまたはJavaアプリケーションはJavaまたはGroovy(JRuby, Jython)
アプリケーション・フレームワークScalaの使いどころ
フレームワーク構成管理
定義
コンポーネント
アプリケーション
Scala
SPI
Scala
Scala
Scala
Java
Java
Java
DSLAPI
DSL : Domain Specific Language
API : Application Programming Interface
SPI : Service Provider Interface
Java
Groovy
アプリケーション・フレームワーク開発の流れ
ビジネス・モデリング分析 設計 実装 テスト
分析 設計 実装 テスト
設計 実装 テスト
設計 製造
設計 実装 テスト
設計 実装 テスト
フレームワーク
設計 実装 テスト
フレームワーク
コンポーネント コンポーネント
組立 テスト
組立て
配備 管理
運用管理
まとめJavaプログラマにとってのScala
まず最初は便利なJavaとして使っても十分に有益
浅海の体感では3倍の生産性
最初はScala特有の難しい(そして便利な)機能は使わなくてもよい
これから興隆する新しい技術はScalaで攻めるのが得策
新技術分野のための機能が満載
マルチコア、クラウド・コンピューティング、DSL