JavaWorld Day 2009 Scala

41
ネクストJava”の大本命!? マルチパラダイム言語「Scala200986浅海智晴 Labedge2.cc、日本Javaユーザグループ

description

JavaWorld Day 2009

Transcript of JavaWorld Day 2009 Scala

Page 1: JavaWorld Day 2009 Scala

“ネクストJava”の大本命!?マルチパラダイム言語「Scala」

2009年8月6日

浅海智晴匠Lab、edge2.cc、日本Javaユーザグループ

Page 2: JavaWorld Day 2009 Scala

自己紹介

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/要求開発×モデル駆動開発×クラウド・コンピューティング

Page 3: JavaWorld Day 2009 Scala

内容

Scalaとは

Scala文法ハイライト

Scalaの応用分野

Page 4: JavaWorld Day 2009 Scala

Scalaとは

Page 5: JavaWorld Day 2009 Scala

Scalaとは

Scalable Language「純粋」オブジェクト指向&「本格」関数型のハイブリッド言語

現時点のプログラミング言語の便利機能を貪欲に吸収

体感的には…使いやすいJava関数型までついてる

Page 6: JavaWorld Day 2009 Scala

Scalaは巨大?

言語仕様はJavaの方が大きいかも『Programming in Scala』 776ページ『Java Programming Language第4版』 928ページ『Java Programming Language第1版』 333ページ

クラスライブラリScala固有のクラスライブラリ

言語と緊密な関係を持つものScalaならではの応用

その他はJavaと共通

実行環境Java VM → Javaと共通

Page 7: JavaWorld Day 2009 Scala

プログラミング言語の歴史手続き型/C→OO/Java→関数型/Scala?

1985 1995 2009

C Java Scala ?

オブジェクト指向 関数型

クラス/オブジェクト継承

高階関数遅延評価

ハードウェア性能の向上

Page 8: JavaWorld Day 2009 Scala

手続き型・オブジェクト指向・関数型

プログラム本体

サブルーチン

呼び出し

プログラム本体

サブルーチン

呼び出し

フレームワーク

呼び出し

手続き型言語 オブジェクト指向言語

プログラム本体

アルゴリズム

呼び出し

フレームワーク

呼び出し

サブルーチン

関数型(+オブジェクト指向言語)

クラス/オブジェクト継承

高階関数遅延評価

Page 9: JavaWorld Day 2009 Scala

関数型言語の2つの側面

関数型言語関数が基本的な構成要素となる言語

数学のバックボーン(ラムダ計算)を持つプログラミング言語

数学を基盤にすることで、プログラムの処理内容の証明が可能

研究継続中?

並列処理では重要な意味を持つかもしれない

高階関数、遅延評価の機構によってプログラム断片の再利用率が飛躍的に高まる

実用言語としては、これが重要

Page 10: JavaWorld Day 2009 Scala

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

Page 11: JavaWorld Day 2009 Scala

Scalaの言語機能

Java

スクリプト言語

統一オブジェクト・モデルテキスト指向

使いやすいコレクションクロージャ

コンパイラ

Scala

関数型言語

高階関数遅延評価

不変オブジェクトパターン・マッチング

モナドアクター

オブジェクト指向

Java VMクラス・ライブラリ

業界標準API

C文法

コンパイラ

オブジェクト指向

Java VMクラス・ライブラリ

業界標準API

統一オブジェクト・モデルテキスト指向

使いやすいコレクションクロージャ

高階関数遅延評価

不変オブジェクトパターン・マッチング

モナドアクター

型推論

静的型付

インタープリタ

動的型付

インタープリタ

型推論

静的型付

抽象型トレイツ

エクストラクタケース・クラス

暗黙変換XMLリテラル

パーサー・コンビネータ

メタ・オブジェクト

Page 12: JavaWorld Day 2009 Scala

Scalaの特徴的な機能(私見best 5)trait(トレイツ)

抽象クラスーα多重継承の問題を回避しつつ、多重継承的な機能を実現mix-inに使用

for文モナドの文法糖衣

チェック付き例外なしプログラミングが楽に!特に問題は感じられなかった

match文パターン・マッチングがデータ構造操作でも非常に重要Javaプログラミングではイディオムとして繰り返し手入力が必要な処理がmatch文で簡明に記述

caseクラスデータを記述するためのクラスの記述が楽になるmatch文との連携

Page 13: JavaWorld Day 2009 Scala

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

Page 14: JavaWorld Day 2009 Scala

応用

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/

Page 15: JavaWorld Day 2009 Scala

なぜScalaなのか

ハードウェアの進化スクリプト言語と関数型の機能を実用言語の言語機能として利用することが可能になった。

Webの台頭Web指向、テキスト指向のプログラミング言語が必要になった。

マルチコア、クラウド・コンピューティング、DSLなどの新しい応用

これらの応用に対応できるプログラミング言語が必要になった。

Page 16: JavaWorld Day 2009 Scala

Scala文法ハイライト

Page 17: JavaWorld Day 2009 Scala

Scala文法ハイライトfor文

for (i <- 0 until 3) {println(i)

}

012

val list = List(1, 2, 3)for (elem <- list) {println(elem)

}

012

Page 18: JavaWorld Day 2009 Scala

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)

Page 19: JavaWorld Day 2009 Scala

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

Page 20: JavaWorld Day 2009 Scala

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

Page 21: JavaWorld Day 2009 Scala

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

Page 22: JavaWorld Day 2009 Scala

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

Page 23: JavaWorld Day 2009 Scala

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

Page 24: JavaWorld Day 2009 Scala

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>

Page 25: JavaWorld Day 2009 Scala

Scalaの応用分野

Page 26: JavaWorld Day 2009 Scala

マルチコア

単一のCPU筐体の中に複数のCPUコアが同梱されているプロセッサ。

アプリケーション・プログラムの観点からはマルチ・プロセッサとしてみえる。

性能向上はクロック数の向上ではなく、使用するコア数の増加によって達成する。

並列処理を行うアプリケーションでないと、性能が向上しない。

Page 27: JavaWorld Day 2009 Scala

マルチコア関数による副作用を伴わない計算

可変データ

手続きメソッド

手続きメソッド

手続きメソッド

手続き型オブジェクト指向

純粋関数型

複数の関数がメモリを共有するので競合が

発生する

関数

不変データ 不変データ

不変データ

関数

関数

変換・複写

変換・複写

。変更がない部分は共有する 不変データなので

データが破壊されることはない

関数は不変データを変換しながら複写したデータを他の関数に受け渡す

不変データ

Page 28: JavaWorld Day 2009 Scala

マルチコア共有メモリ方式とメッセージパッシング方式

メモリ

スレッド スレッド

スレッド

スレッド スレッド

スレッド

メッセージボックス

共有メモリ方式 メッセージパッシング方式

メモリ

メモリ

メッセージボックス

複数のスレッドがメモリを共有するので競合が発生

する

メモリはスレッドが、占有するので 競

合が発生しない

メッセージボックスを経由したメッセージ交換によって非同期処理を

実現する

Javaモニタjava.util.concurrentscala.concurrent

scala.actors

Page 29: JavaWorld Day 2009 Scala

クラウド・コンピューティング

Webプラットフォームテキスト指向、XML指向

スケーラビリティパブリックなインターネット空間上に事実上無尽蔵に用意されたCPUやストレージなどのリソースを活用

非同期、並列、分散

分散アプリケーション非同期、並列、分散

Page 30: JavaWorld Day 2009 Scala

アプリケーション・アーキテクチャ

プレゼンテーション層

サーバ側クラウド・アプリケーション

統合層

サービス

サービス

分散ストレージ

データベース

メッセージ・キュー

:アクセス方式2 手続き呼出し、性能特性 障害特性がローカル

。の手続き呼び出しよりも脆弱

:アクセス方式3 メッセージング。分散環境での連携に適応する特性をもつ

:アクセス方式4 分散ストレージ通常のデータベースのような更新処理は難し

。い

アクセス方式5:RESTWebページを手繰って情報を取得する

アクセス方式1:ローカル・データベースアプリケーションが占有するデータはロー

。カルデータベースに格納する

サービスサービス

ドメイン層

ビジネス層

プレゼンテーション層

REST

統合層

アプリケーションの論理的な構成は従来のものと変わらない

Web

クライアント側

GUI

RIA

サービス

Page 31: JavaWorld Day 2009 Scala

クラウド・アプリケーションの構成例

クラウド・アプリケーション

サービス

メッセージ・キュー

サービス

メッセージ・キュー

プレゼンテーション

サービス

サービス

REST

サービス

分散ストレージ

マスターデータなど更新頻度が低いデータは分散ストレージで配布して

。直接参照する

バックエンドのサービス群もメッセ。ージによって連携

、結果を直接知りたい場合には 手続き呼び出しで同期型の連携を

。行う この形式の連携を行うとスケーラ

。ビリティが低くなる プレゼンテーションの段階ででき、ることをやっておくと スケールア

ウトの効果によってスケーラビリテ。ィが高まる

外部サービスからRESTを用いて情報を取得するのが典型的な利

。用方法

データベースデータベースをアクセスするスコ

ープはサービスに閉じておくのが。よい

サービス利用の主力はメッセージ。である この形式の連携を行うと

スケールアウトによってスケーラビ。リティを確保できる

メッセージ送信

同期通信

メッセージ配信

Page 32: JavaWorld Day 2009 Scala

クラウド・コンピューティングとScala

テキスト指向、XML指向Scalaの得意とするところ

生文字リテラル、正規表現、パターン・マッチング、ExtractorXMLリテラル、パス検索、パターン・マッチング

非同期・並列・分散Javaの並列処理機能

スレッド、モニタ、並列ライブラリ

関数型言語不変オブジェクトモナド

アクター・ライブラリ

Page 33: JavaWorld Day 2009 Scala

DSL(Domain Specific Language)

応用分野、技術分野の領域(ドメイン)ごとに専用の言語を用意する簡潔で過不足のない適切なモデルを記述できる

テキストDSLUMLのようなグラフィカル言語は、モデルを記述する作業が煩雑プログラミング言語のようにテキストでモデルを記述すると効率がよい

内部DSLホスト言語となるプログラミング言語上にDSLを構築Scalaはホスト言語に最適の文法を備えている

スケーラブル

外部DSLparser combinator

Scalaが提供するパーサー・ジェネレータ専用DSLでBNF相当の文法を定義

Page 34: JavaWorld Day 2009 Scala

モデル駆動開発&コンポーネント

OO分析

DSL

DSL

OO設計 OO実装

DSL

OO設計 OO実装

コンポーネント

コンポーネント

コンポーネント

コンポーネント

コンポーネント

自動生成

自動生成

自動生成

OO分析

分析 設計 実装

Page 35: JavaWorld Day 2009 Scala

DSLDSLの例

case class App20090505() extends 施設利用申請書 {会員番号 = 123456名前 = "Scala太郎"理由(<div>Scalaの勉強会を行うため。</div>)理由("Liftも少し取り上げるかもしれません。")

申請 {施設(20090601, 1300, 1400, 講堂) 理由は <div>初日は講堂で講演したいから</div>

同時利用(20090602, 1000, 1200) {施設(第1会議室)施設(第2会議室) 理由は "第1会議室だけだと足りないから"設備(ホワイトボード) 個数は 2 理由は "会議室ごとに利用"

} 理由は """両方同時に利用希望します。片方だけだと入りきらないので。"""}

}

Page 36: JavaWorld Day 2009 Scala

DSLから生成したHTML

Page 37: JavaWorld Day 2009 Scala

DSL変換処理

テキスト テキスト

XML XML

オブジェクトオブジェクト

変換処理

Page 38: JavaWorld Day 2009 Scala

アプリケーション・フレームワーク

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)

Page 39: JavaWorld Day 2009 Scala

アプリケーション・フレームワークScalaの使いどころ

フレームワーク構成管理

定義

コンポーネント

アプリケーション

Scala

SPI

Scala

Scala

Scala

Java

Java

Java

DSLAPI

DSL : Domain Specific Language

API : Application Programming Interface

SPI : Service Provider Interface

Java

Groovy

Page 40: JavaWorld Day 2009 Scala

アプリケーション・フレームワーク開発の流れ

ビジネス・モデリング分析 設計 実装 テスト

分析 設計 実装 テスト

設計 実装 テスト

設計 製造

設計 実装 テスト

設計 実装 テスト

フレームワーク

設計 実装 テスト

フレームワーク

コンポーネント コンポーネント

組立 テスト

組立て

配備 管理

運用管理

Page 41: JavaWorld Day 2009 Scala

まとめJavaプログラマにとってのScala

まず最初は便利なJavaとして使っても十分に有益

浅海の体感では3倍の生産性

最初はScala特有の難しい(そして便利な)機能は使わなくてもよい

これから興隆する新しい技術はScalaで攻めるのが得策

新技術分野のための機能が満載

マルチコア、クラウド・コンピューティング、DSL