42
0 JAVAの方向性 2011/12/06 外山

java-feature-on-scala

Embed Size (px)

Citation preview

Page 1: java-feature-on-scala

0

JAVAの方向性

2011/12/06外山 寛

Page 2: java-feature-on-scala

2

JJUGカンファレンス2011

Page 3: java-feature-on-scala

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年夏にリリース予定

Page 4: java-feature-on-scala

2

マルチコア時代

Page 5: java-feature-on-scala

2

ここで登場LAMBDA

Page 6: java-feature-on-scala

2

JAVA PROJECT

■PROJECT LAMBDA

・市場変化への適用・マルチコアCPU

・開発容易性・並列処理の必要性・並列ライブラリの必要性

Page 7: java-feature-on-scala

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で並列処理

Page 8: java-feature-on-scala

2

並列処理の実装方式

max = students

.parallel()

.filter(s -> s.gradYear == 2011)

.map(s -> s.score)

.reduce(0.0, Math#max); パラレル処理

JAVA8で並列処理

たったこれだけ。

Page 9: java-feature-on-scala

2

JAVA SE 8 PROJECT

PROJECT JIGSAW

・JAVAのモジュール化・クラスパスの排除・パフォーマンス向上・小型機器への適用

Page 10: java-feature-on-scala

2

2年周期で提供される予定

Page 11: java-feature-on-scala

2

JAVA のそれ以降

•巨大データのサポート (JDK 9)

–巨大配列 (64ビットサポート)

•ユニファイド型システム (JDK 10+)

–primitive 型の排除、完全にオブジェクトだけで実装•型の具体化 (JDK 10+)

–関数型•データ構造の最適化 (JDK 10+)

Page 12: java-feature-on-scala

2

JAVA SE 8 2013年夏リリース予定

ただ、ちょっと待ってください。JAVAの進化を2年も待たなければいけないのでしょうか?

Page 13: java-feature-on-scala

個人的に感じたカンファレンスの盛況具合

SCALA 超満員

NODE.JS 超満員

HADOOP 満員

JAVA 普通

GROOVY(GRAILS) 空席多い

JRUBY 空席多い

Page 14: java-feature-on-scala

0

SCALA

2011/12/06外山 寛

Page 15: java-feature-on-scala

2

Java VM上で動作するプログラミング言語

Javaの資産はほぼ完全に利用可能

Glue Code不要

静的型を持ったオブジェクト指向言語

クラス、オブジェクトと言ったJavaの概念はそのまま利用可能

高速な処理系

「Javaらしい」コードはJavaとほぼ同じ速度

「Scalaらしい」コードも十分に高速

型推論による冗長な記述の排除

静的型による安全性はそのままに

不変オブジェクトを中心とした安全で強力なコレクションライブラリ

XMLリテラルの言語・標準ライブラリによるサポート

簡潔なXML処理

標準ライブラリでActorをサポート

明示的なロック不要の並行処理記述ライブラリ

Scalaの概要

Page 16: java-feature-on-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提案者の一人

Page 17: java-feature-on-scala

4

公開されている事例のみ紹介TwitterLinkedInFoursquareAmazon.comVMWareNovellXeroxNASABank of AmericaUBSRemember the MilkSiemensGridGainOPOWERThe Guardianその他多数

Scala採用事例(海外)

Page 18: java-feature-on-scala

5

※ 公開されている事例のみ紹介

株式会社パテントビューロ

Webサービス開発などの主力言語としてScalaを採用

知財判例データベース、astamuse(特許情報閲覧・検索サービス)等

有限会社ITプランニング

Scalaによるシステム構築事例

GMOメディア株式会社

リワード広告システム等

株式会社ドワンゴ

導入予定

参考: ドワンゴ社内 scala勉強会(ニコニコ生放送)

http://live.nicovideo.jp/watch/lv71111927

Scala採用事例(国内)

Page 19: java-feature-on-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)

Page 20: java-feature-on-scala

さようなら, 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)

Page 21: java-feature-on-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)

Page 22: java-feature-on-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))

Page 23: java-feature-on-scala

ケースクラス(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)

Page 24: java-feature-on-scala

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)

Page 25: java-feature-on-scala

強力なコレクションライブラリ (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)

Page 26: java-feature-on-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)

Page 27: java-feature-on-scala

サンプルプログラム:XMLリテラル

XMLをプログラムの中に直接書ける

val x2 =

<sample>

<zzz>test</zzz>

<foo/>

</sample>

println(x2 \ "zzz")

値の取り出しも簡単!

Page 28: java-feature-on-scala

サンプルプログラム:簡潔な表記

二重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)

Page 29: java-feature-on-scala

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

基本ツール(標準添付)

Page 30: java-feature-on-scala

19

sbt Scalaのデファクトスタンダードなビルドツール

ビルド設定ファイルをScala DSLとして記述

Apache Ivyベース

Mavenリポジトリをそのまま利用できる

Mavenと同じディレクトリ構成を採用

簡単な記述で、Scalaの各種ライブラリに対する依存関係を記述可能

ScalaTest/Specs Scalaにおける2大ユニットテスティングライブラリ

ScalaTestの方が保守的、Specsは新機能を積極的に取り込む傾向

ScalaCheck (半)自動テスティングライブラリ

テスト対象の型からテストケースを自動生成

ScalaTest/Specsを補完

準標準ライブラリ/フレームワーク

Page 31: java-feature-on-scala

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

Page 32: java-feature-on-scala

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アプリケーションフレームワーク/ツールキット

Page 33: java-feature-on-scala

IDE開発が公式に提供しているプラグイン最も高機能・安定性が高いJava -> Scala変換のような、マイグレーションのための機能自動リファクタリング Java/Scala混在プロジェクトもうまく扱える

コード補完

Scala IDE for Eclipse

Typesafe社に管理が移行急速に品質が改善自動リファクタリング(名前変更・メソッド抽出など、現時点では限定的)コード補完

NetBeans Scalaプラグイン 個人での開発 コード補完など、基本機能は揃っている インストールするのがやや面倒

22

主要IDEプラグイン

IntelliJ IDEA Scalaプラグイン

Page 34: java-feature-on-scala

23

簡潔なコード 実用的にはJavaの1/3~1/4程度のコード量 冗長なJavaコードを「書く」のはIDEがサポート 冗長なJavaコードを「読む」のは労力が必要

より安全なコード 不変オブジェクトを作りやすい言語設計

Javaでライブラリ化(できない/現実的でない)部分をライブラリ化可能 Don't Repeat Yourself(DRY)原則 リソースの自動クローズ(Loanパターン)

Java 7では「言語仕様の拡張」が必要だった Scalaでは、単なるライブラリとして提供できる 一般化: 前処理 -> 本処理 -> 必ず実行される後処理 をライブラリ化可能

ロック不要の並行処理記述ライブラリ(Actor) マルチスレッドプログラムのバグ削減に有効

コレクションライブラリ Java:

標準では「可変」コレクションのみ提供(「読み込み専用」に変換するメソッドはある) 型から「可変」、「読み込み専用」、「不変」のどれを意図しているかがわからない

Scala: 標準で、不変コレクション/可変コレクションの両方を提供 型から「可変」、「読み込み専用」、「不変」コレクションのどれかが判別できる 不変コレクションは安全に複数スレッド間で共有可能

Scalaの採用メリット

Page 35: java-feature-on-scala

24

学習のための良いドキュメント(日本語)不足

「読んですぐScalaを使える」 ドキュメント(チートシート)があまり無い

「コップ本」は速習には向いていない

国内におけるScala開発者の尐なさ 新しい言語には付き物の問題

誮がコードをメンテナンスする?

商用サポート

Typesafe社による公式商用サポートは英語前提

日本語の商用サポートは未定

Scalaライブラリにバグがあった場合どうするか

Scalaの採用リスク

Page 36: java-feature-on-scala

25

言語仕様はJavaよりも複雑

「言語の全てを把握していないと使えない」なら学習コストは高い

言語仕様の複雑さ≠言語の学習コスト(難しさ)

Perl, Ruby, PHP等の言語も言語仕様から言えば複雑

全てを最初から覚える必要は無い

「Better Java」から始める

構文を除いて、Javaとの高い互換性を持っている

「JavaプログラムのようなScalaプログラム」はすぐ作れる

要: Java構文 -> Scala構文 のチートシート

Java -> Scala自動変換器(IntelliJ IDEA Scalaプラグイン)が存在

型推論・ライブラリの恩恵はすぐに受けられる

「Scalaらしいプログラム」への緩やかな移行が可能

リスク回避策(1): Better Javaから始める

Page 37: java-feature-on-scala

26

JavaソースとScalaソースが混在したプロジェクトをビルド可能

尐しずつScalaを導入できる実態はすべてclassファイル

ユニットテスト用DSL(領域特化言語)としてScalaを導入

ScalaTest/Specs

scalaコマンド(対話環境)の活用(REPL)

Java APIの挙動をすぐに確かめるのに便利

Scalaの習得のためにも使える

実行結果がすぐ返ってくる

リスク回避策(2): 部分的に使い始める

Page 38: java-feature-on-scala

case classによる簡潔なValue Objectの定義無名クラスのシンタックスシュガー

ジェネリックス

強力なコレクションライブラリ

型推論

Option型

オブジェクト指向と関数型のハイブリッド? アカデミックで難しそう

実用的ではない

色々な機能をごちゃまぜ?

学習コストが高い

IDEサポートが貧弱?

IDEが無いとちょっと…

27

Scalaに関するFAQ(1) – 関数型プログラミング

Scalaは関数型プログラミングを覚えないと使えない? NO 関数型プログラミングを知っていた方が「より良い」

知らなくても、「新しい静的型付けオブジェクト指向言語」として使える

Page 39: java-feature-on-scala

28

Scalaは複雑なので、習得が難しい? NO

言語仕様の複雑さ ≠ 習得難易度

いわゆるLL(Perl, Ruby, PHP)も言語仕様は「複雑」

言語仕様の全てを知らなくてもプログラムは書ける

ただし 汎用Scalaライブラリを開発するなら、ある程度の仕様理解は必要

「汎用ライブラリ設計者」にとっては習得が難しい かもしれない

「ライブラリユーザ」にとっては習得はそれほど難しくない

Scalaに関するFAQ(2) – 複雑さと学習曲線

Page 40: java-feature-on-scala

29

Scalaはオブジェクト指向と関数型のハイブリッド? No Javaの仕様をリファクタリングして、型推論やDSL、関数型プログラミング

サポート等を統合した静的型付けオブジェクト指向言語

(Java – staticメンバ – プリミティブ型 - …) + 型システムの拡張 + 型

安全なコレクションライブラリ + ... = Scala

Scalaはごった煮言語? No, but ... Scalaの設計哲学は「統合」

比較的尐ない概念でより様々な事を表現できるように進化

1つの概念で様々な面を表現可能

概念の数が多いと誤解しがち

Scalaは「実用」言語

コミュニティの成長によって、「統合」哲学にそぐわない機能の要望も

結果として、ad hocに見える仕様が追加/維持される事がある

Scalaに関するFAQ(3) – 設計思想

Page 41: java-feature-on-scala

30

IDEサポートが貧弱で使い物にならない? No, but ...

主要IDEに関しては「使える」レベルに達している

Eclipse Scalaプラグイン

IntelliJ IDEA Scalaプラグイン

NetBeans Scalaプラグイン

IntelliJ IDEA + Scalaプラグインが最も高機能・安定性が高い

しかし

各種IDEのJavaサポートの完成度にはまだ及ばない

自動リファクタリング、補完、コード生成などの面

IDEのサポートをどこまで期待するか

Scalaに関するFAQ – IDEサポート

Page 42: java-feature-on-scala

30

終わり

ありがとうございました。

質問は五十嵐さんにどうぞ