Upload
hiroshi-toyama
View
254
Download
6
Embed Size (px)
Citation preview
0
JAVAの方向性
2011/12/06外山 寛
2
JJUGカンファレンス2011
2
JAVA SE 8 2013年夏リリース予定
■JAVASCRIPT
・Rhino -> Nashorn
・Nashorn (JavaScript Engine in JDK)
・ECMAScript-262 5th
・Node.jsをサポート■HotRockit
・JrokitとHotSpotのいいとこ取り■JAVAFX
・モバイル開発
JAVA SE 8 2013年夏にリリース予定
2
マルチコア時代
2
ここで登場LAMBDA
2
JAVA PROJECT
■PROJECT LAMBDA
・市場変化への適用・マルチコアCPU
・開発容易性・並列処理の必要性・並列ライブラリの必要性
2
並列処理の実装方式
Collection<Student> students = ...;
max = students.filter(new Predicate<Student>() {
public boolean op(Student s) {
return s.gradYear == 2011; }
}).map(new Extractor<Student, Double>() {
public Double extract(Student s) {
return s.score; }
}).reduce(0.0, new Reducer<Double, Double>() {
public Double reduce(Double max, Double score){
return Math.max(max, score); }
})
; 並列処理は可能だが可読性が低下
JAVA7で並列処理
2
並列処理の実装方式
max = students
.parallel()
.filter(s -> s.gradYear == 2011)
.map(s -> s.score)
.reduce(0.0, Math#max); パラレル処理
JAVA8で並列処理
たったこれだけ。
2
JAVA SE 8 PROJECT
PROJECT JIGSAW
・JAVAのモジュール化・クラスパスの排除・パフォーマンス向上・小型機器への適用
2
2年周期で提供される予定
2
JAVA のそれ以降
•巨大データのサポート (JDK 9)
–巨大配列 (64ビットサポート)
•ユニファイド型システム (JDK 10+)
–primitive 型の排除、完全にオブジェクトだけで実装•型の具体化 (JDK 10+)
–関数型•データ構造の最適化 (JDK 10+)
2
JAVA SE 8 2013年夏リリース予定
ただ、ちょっと待ってください。JAVAの進化を2年も待たなければいけないのでしょうか?
個人的に感じたカンファレンスの盛況具合
SCALA 超満員
NODE.JS 超満員
HADOOP 満員
JAVA 普通
GROOVY(GRAILS) 空席多い
JRUBY 空席多い
0
SCALA
2011/12/06外山 寛
2
Java VM上で動作するプログラミング言語
Javaの資産はほぼ完全に利用可能
Glue Code不要
静的型を持ったオブジェクト指向言語
クラス、オブジェクトと言ったJavaの概念はそのまま利用可能
高速な処理系
「Javaらしい」コードはJavaとほぼ同じ速度
「Scalaらしい」コードも十分に高速
型推論による冗長な記述の排除
静的型による安全性はそのままに
不変オブジェクトを中心とした安全で強力なコレクションライブラリ
XMLリテラルの言語・標準ライブラリによるサポート
簡潔なXML処理
標準ライブラリでActorをサポート
明示的なロック不要の並行処理記述ライブラリ
Scalaの概要
2003:
2005:
2006:
2007:
2008:
最初の公開版リリース
~Scala 1.X
Scala 2.0リリース~Scala 2.5リリース
Scala 2.6リリース
Scala 2.7リリース
Java Genericsと互換に
2008:
2010:
2011:
2011:
TwitterによるScalaの採用(バックエンド処理の置き換え)
Scala 2.8リリース
Scala 2.9リリース
Typesafe社設立
CEO: Martin Odersky, CTO: Jonas Bonér(Scala製ミドルウェアAkkaの開発者)
Scalaの商用サポート、コンサルティング、IDEプラグイン開発等
"Typesafe Stack"の提供
2011: Typesafe社、Play 2.0 Frameworkの商用サポート発表
3
Scala年表
2002: スイス連邦工科大学ローザンヌ校(EPFL)で開発開始 主要開発者:Martin Odersky
javac (Java 5以降)オリジナル開発者 && Java Generics提案者の一人
4
※
公開されている事例のみ紹介TwitterLinkedInFoursquareAmazon.comVMWareNovellXeroxNASABank of AmericaUBSRemember the MilkSiemensGridGainOPOWERThe Guardianその他多数
Scala採用事例(海外)
5
※ 公開されている事例のみ紹介
株式会社パテントビューロ
Webサービス開発などの主力言語としてScalaを採用
知財判例データベース、astamuse(特許情報閲覧・検索サービス)等
有限会社ITプランニング
Scalaによるシステム構築事例
GMOメディア株式会社
リワード広告システム等
株式会社ドワンゴ
導入予定
参考: ドワンゴ社内 scala勉強会(ニコニコ生放送)
http://live.nicovideo.jp/watch/lv71111927
等
Scala採用事例(国内)
Hello, Scala
object Hello {
def main(args: Array[String]): Unit = {
println("Hello, World!")
}
}
class Hello {
public static void main(String[] args){
System.out.println("Hello, World!")
}
}
Hello, Worldプログラム (Scala)
Hello, Worldプログラム (Java)
さようなら, null. こんにちは, Option[T].
「null参照の概念は10億ドル単位の過ち 」 by アントニー・ホーア
Option型によって、「nullを取り得る型」を区別
// nullを取りうるか型から判別できない
String x = map.get("key");
// String y = x; // コンパイルできる
String y = x == null ? x : "default";
nullを使ったプログラム片 (Java)
// 「失敗する」可能性が型から判別できる
val x: Option[String] = map.get("key")
// val y: String = x // コンパイルエラー
val y: String = x.getOrElse("default")
Optionを使ったプログラム断片 (Scala)
お手軽型推論
自明な型をコンパイラが推論(型推論)
自明でない型(メソッドの引数等)は書く
// 自明な型でも書かなければいけない
Map<String, List<String>> map =
new HashMap<String, List<String>>();
Map型の変数宣言 (Java)
val map = new HashMap[String, List[String]]()
// 型を書いても良い
val map: Map[String, List[String]] = ...
Map型の変数宣言(Scala)
無名クラスのシンタックスシュガー
JSでいう「関数リテラル」と呼ばれているもの
実体は単なる無名クラスのシンタックスシュガー変更可能な外部変数も参照可能
val multiply = new Function2[Int, Int] {
def apply(x: Int, y: Int): Int = x * y
}
println(multiply.apply(5, 10))
val multiply = (x: Int, y: Int) => x * y
println(multiply(5, 10))
ケースクラス(case classes)
よくある「値オブジェクト」のクラス定義を簡潔に記述できる
case class Person(name: String, age: Int)
// ...
val person = Person("hoge", 18)
値オブジェクトのクラス定義と生成(Scala)
class Person {private final String name;private final int age;public Person(String name, int age) {this.name = name;this.age = age;
}public String getName() {return name;
}public String getAge() {return age;
}
}//...new Person("hoge", 18)
値オブジェクトのクラス定義と生成(Java)
Loanパターン (VS. Java 7 ARM(Automatic Resource Management)) (1)
Loanパターン: リソースの自動closeを「ライブラリとして」提供
Java 7 ARM: リソースの自動closeを「構文として」提供
// 一度「ライブラリとして」定義すれば
def using[T <: Closeable](resource: T)(block: T => Unit): Unit = try {block(resource)
} finally { resource.close() }// 組み込みの構文のように使える
using(new FileInputStream("input.txt")){in =>for(b <- Stream.continually(in.read()).takeWhile(_ != -1))Console.out.write(b ^ 0xFF)
}
Loanパターン(Scala)
try (FileInputStream in = new FileInputStream("input.txt");
){int b;for (int b; (b = in.read()) != -1 ) {
System.out.write(b ^ 0xFF);}
}
ARM(Java 7)
強力なコレクションライブラリ (1) 簡潔な記述
より重要なロジックに集中できる
List<Person> persons = new ArrayList<Person>();
/* ... */
List<String> namesAged18 = new ArrayList<String>();
for (Person p: persons) {
if (p.getAge() >= 18) namesAged18.add(p.getName());
}
if (namesAged18.size() > 0) {
System.out.print(namesAged18.get(0));
namesAged18 = namesAged18.subList(1, namesAged18.size());
}
for(String name: namesAged18) System.out.print(", " + name);
フィルタリング処理 (Java)
val persons = List[Person](...)
// 年齢が18歳以上の人の名前のリストを抽出
val namesAged18 = persons.collect{ case p
if p.age >= 18 => p.name }
//カンマで区切って出力
print(namesAged18.mkString(", "))
フィルタリング処理(Scala)
強力なコレクションライブラリ (2) 不変と可変
「不変」コレクションと「可変」コレクションを別の型として管理※イミュータブルとミュータブル 可読性の向上 + コレクションの取り扱いミスを防御
// Listは可変
// (a) 防御的なコピー
// (b) Collections.unmodifiableList()
// 引数にそのまま渡すのは危険
String concatWithLn1 (List<String> namesIn) { ... }
リストの文字列を連結するメソッドのシグニチャ(Java)
// Listは不変なので安全に引数として渡せる
def concatWithLn1(names: List[String]): String = ...
// ArrayBufferは可変なので、中で変更され得る事がわかる
def concatWithLn2(names: ArrayBuffer[String]): String = ...
リストの文字列を連結するメソッドのシグニチャ(Scala)
サンプルプログラム:XMLリテラル
XMLをプログラムの中に直接書ける
val x2 =
<sample>
<zzz>test</zzz>
<foo/>
</sample>
println(x2 \ "zzz")
値の取り出しも簡単!
サンプルプログラム:簡潔な表記
二重FOR文
値の取り出しも簡単
for (i <- 1 to 2; j <- 1 to 3) print("[" + i +"," + j + "]")
For文のネスト(Scala)
for (int i = 1; i < 2; i++) {
for (int j = 1; j < 3; j++) {
System.out.println(i + j);
}
}
For文のネスト(JAVA)
18
scalacコマンド
javacに相当(クラスファイルへのコンパイラ)
オプションもjavacと類似した部分が多い(-classpath等)
fscコマンド
scalaコンパイラをサーバとして常駐させて、コンパイルを高速化するコマンド
デーモンとしてコンパイラが常駐するので二回目以降は高速。
scalaコマンド
1.scalacで生成されたクラスファイルを簡単に実行
2.scalaスクリプト(テキスト)をそのままコンパイル・実行
3.対話環境(REPL)※rubyでいうIRB
Scala/Java APIの動作を調べたい時に便利
scaladocコマンド
javadocコマンド相当
sbazコマンド
scalaアプリケーション/ライブラリ用のパッケージマネージャ※rubyでいうgem
基本ツール(標準添付)
19
sbt Scalaのデファクトスタンダードなビルドツール
ビルド設定ファイルをScala DSLとして記述
Apache Ivyベース
Mavenリポジトリをそのまま利用できる
Mavenと同じディレクトリ構成を採用
簡単な記述で、Scalaの各種ライブラリに対する依存関係を記述可能
ScalaTest/Specs Scalaにおける2大ユニットテスティングライブラリ
ScalaTestの方が保守的、Specsは新機能を積極的に取り込む傾向
ScalaCheck (半)自動テスティングライブラリ
テスト対象の型からテストケースを自動生成
ScalaTest/Specsを補完
準標準ライブラリ/フレームワーク
sbtのビルド設定ファイル例
単純なプロジェクトなら、これだけでOK
No more XML hell(XML地獄は要りません!)
必要であれば、Scalaのプログラムを設定ファイルに書ける
// プロジェクト名name := "Simple Project"
// バージョン
version := "1.0"
// 組織organization := "hoge"
// ビルドに使うScalaのバージョンscalaVersion := "2.9.1"
// ライブラリの依存性記述
libraryDependencies ++= Seq("org.specs2" %% "specs2" % "1.6.1","org.specs2" %% "specs2-scalaz-core" % "6.0.1" % "test"
)
Build.sbt
21
Lift
Scala用WebアプリケーションフレームワークXMLリテラルなどScalaの機能を活用企業における採用実績一定以上あり (Foursquareなど)Ajax/Cometアプリケーション開発のための便利なAPI
Play!
Java/Scala用WebアプリケーションフレームワークRuby on Rails(RoR)ライクな開発サイクル2.0からコードベースをScalaに移行(Java用 APIは引き続き提供)
Scalatra
RubyのSinatraフレームワークに影響を受けたフレームワーク小規模Webアプリケーションの開発に適しているフレームワークの仕組みを理解するのが簡単
Unfiltered
httpサービスを提供するためのライブラリ/ツールキット(≠Webアプリケーションフレームワーク)JavaでいうJax-WSのようなもん簡潔な記述で、URLに対応するサービスをつなげられるタスク管理ツールで有名なRemember the Milk等で採用
Finagle
Twitter製Scala用RPCライブラリJBoss Nettyベース
Casbah
MongoDBのScala用APIMongoDB開発元の10gen謹製
その他多数
主要Webアプリケーションフレームワーク/ツールキット
IDE開発が公式に提供しているプラグイン最も高機能・安定性が高いJava -> Scala変換のような、マイグレーションのための機能自動リファクタリング Java/Scala混在プロジェクトもうまく扱える
コード補完
Scala IDE for Eclipse
Typesafe社に管理が移行急速に品質が改善自動リファクタリング(名前変更・メソッド抽出など、現時点では限定的)コード補完
NetBeans Scalaプラグイン 個人での開発 コード補完など、基本機能は揃っている インストールするのがやや面倒
22
主要IDEプラグイン
IntelliJ IDEA Scalaプラグイン
23
簡潔なコード 実用的にはJavaの1/3~1/4程度のコード量 冗長なJavaコードを「書く」のはIDEがサポート 冗長なJavaコードを「読む」のは労力が必要
より安全なコード 不変オブジェクトを作りやすい言語設計
Javaでライブラリ化(できない/現実的でない)部分をライブラリ化可能 Don't Repeat Yourself(DRY)原則 リソースの自動クローズ(Loanパターン)
Java 7では「言語仕様の拡張」が必要だった Scalaでは、単なるライブラリとして提供できる 一般化: 前処理 -> 本処理 -> 必ず実行される後処理 をライブラリ化可能
ロック不要の並行処理記述ライブラリ(Actor) マルチスレッドプログラムのバグ削減に有効
コレクションライブラリ Java:
標準では「可変」コレクションのみ提供(「読み込み専用」に変換するメソッドはある) 型から「可変」、「読み込み専用」、「不変」のどれを意図しているかがわからない
Scala: 標準で、不変コレクション/可変コレクションの両方を提供 型から「可変」、「読み込み専用」、「不変」コレクションのどれかが判別できる 不変コレクションは安全に複数スレッド間で共有可能
Scalaの採用メリット
24
学習のための良いドキュメント(日本語)不足
「読んですぐScalaを使える」 ドキュメント(チートシート)があまり無い
「コップ本」は速習には向いていない
国内におけるScala開発者の尐なさ 新しい言語には付き物の問題
誮がコードをメンテナンスする?
商用サポート
Typesafe社による公式商用サポートは英語前提
日本語の商用サポートは未定
Scalaライブラリにバグがあった場合どうするか
Scalaの採用リスク
25
言語仕様はJavaよりも複雑
「言語の全てを把握していないと使えない」なら学習コストは高い
言語仕様の複雑さ≠言語の学習コスト(難しさ)
Perl, Ruby, PHP等の言語も言語仕様から言えば複雑
全てを最初から覚える必要は無い
「Better Java」から始める
構文を除いて、Javaとの高い互換性を持っている
「JavaプログラムのようなScalaプログラム」はすぐ作れる
要: Java構文 -> Scala構文 のチートシート
Java -> Scala自動変換器(IntelliJ IDEA Scalaプラグイン)が存在
型推論・ライブラリの恩恵はすぐに受けられる
「Scalaらしいプログラム」への緩やかな移行が可能
リスク回避策(1): Better Javaから始める
26
JavaソースとScalaソースが混在したプロジェクトをビルド可能
尐しずつScalaを導入できる実態はすべてclassファイル
ユニットテスト用DSL(領域特化言語)としてScalaを導入
ScalaTest/Specs
scalaコマンド(対話環境)の活用(REPL)
Java APIの挙動をすぐに確かめるのに便利
Scalaの習得のためにも使える
実行結果がすぐ返ってくる
リスク回避策(2): 部分的に使い始める
case classによる簡潔なValue Objectの定義無名クラスのシンタックスシュガー
ジェネリックス
強力なコレクションライブラリ
型推論
Option型
オブジェクト指向と関数型のハイブリッド? アカデミックで難しそう
実用的ではない
色々な機能をごちゃまぜ?
学習コストが高い
IDEサポートが貧弱?
IDEが無いとちょっと…
27
Scalaに関するFAQ(1) – 関数型プログラミング
Scalaは関数型プログラミングを覚えないと使えない? NO 関数型プログラミングを知っていた方が「より良い」
知らなくても、「新しい静的型付けオブジェクト指向言語」として使える
28
Scalaは複雑なので、習得が難しい? NO
言語仕様の複雑さ ≠ 習得難易度
いわゆるLL(Perl, Ruby, PHP)も言語仕様は「複雑」
言語仕様の全てを知らなくてもプログラムは書ける
ただし 汎用Scalaライブラリを開発するなら、ある程度の仕様理解は必要
「汎用ライブラリ設計者」にとっては習得が難しい かもしれない
「ライブラリユーザ」にとっては習得はそれほど難しくない
Scalaに関するFAQ(2) – 複雑さと学習曲線
29
Scalaはオブジェクト指向と関数型のハイブリッド? No Javaの仕様をリファクタリングして、型推論やDSL、関数型プログラミング
サポート等を統合した静的型付けオブジェクト指向言語
(Java – staticメンバ – プリミティブ型 - …) + 型システムの拡張 + 型
安全なコレクションライブラリ + ... = Scala
Scalaはごった煮言語? No, but ... Scalaの設計哲学は「統合」
比較的尐ない概念でより様々な事を表現できるように進化
1つの概念で様々な面を表現可能
概念の数が多いと誤解しがち
Scalaは「実用」言語
コミュニティの成長によって、「統合」哲学にそぐわない機能の要望も
結果として、ad hocに見える仕様が追加/維持される事がある
Scalaに関するFAQ(3) – 設計思想
30
IDEサポートが貧弱で使い物にならない? No, but ...
主要IDEに関しては「使える」レベルに達している
Eclipse Scalaプラグイン
IntelliJ IDEA Scalaプラグイン
NetBeans Scalaプラグイン
IntelliJ IDEA + Scalaプラグインが最も高機能・安定性が高い
しかし
各種IDEのJavaサポートの完成度にはまだ及ばない
自動リファクタリング、補完、コード生成などの面
IDEのサポートをどこまで期待するか
Scalaに関するFAQ – IDEサポート
30
終わり
ありがとうございました。
質問は五十嵐さんにどうぞ