Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

JDK 10 へようこそ

3月20日にリリース予定のJDK10では12のJEPが提案され、実装/実現される見通しです。今回注目の新機能はJEP286: Local-Variable Type Inference- ローカル変数の型省略(var記法)です。このセッションではこのJEPの解説を中心に、その他主なJEPの紹介を行います。

  • Login to see the comments

JDK 10 へようこそ

  1. 1. JDK 10 へようこそ ローカル変数の型推論 その他 David Buck JVM Sustaining Engineering Oracle
  2. 2. Hello JJUG! バック デイビッド • Java SE サステイニング エンジニアリング • JVM のバグを直す人 • OpenJDK Updates Project Maintainer • 趣味:プログラミング • @DavidBuckJP
  3. 3. アジェンダ • 現在地 • ローカル変数の型推論 • その他 • 最後に
  4. 4. 現在地
  5. 5. JDK 9(2017年9月21日) • Short Term Release (サポートは今月で終了) • JEP 193: Variable Handles • JEP 222: jshell: The Java Shell (Read-Eval-Print Loop) • JEP 237: Linux/AArch64 Port • JEP 254: Compact Strings • JEP 282: jlink: The Java Linker • JEP 295: Ahead-of-Time Compilation
  6. 6. JDK 10(2018年3月20日) • Short Term Release (サポートは今年の9月で終了) • 今夜はいっぱい喋る!
  7. 7. JDK 11(2018年9月) • Long Term Support (LTS) のリリース • 309: Dynamic Class-File Constants • 318: Epsilon: An Arbitrarily Low-Overhead Garbage Collector • 320: Remove the Java EE and CORBA Modules • 323: Local-Variable Syntax for Lambda Parameters
  8. 8. 新しい GC の研究・開発 • ZGC • 4TBまでのスケーラビリティ • ヒープサイズ問わずに • Live-set のサイズ問わずに • 10ミリ秒以下の STW • 64ビット専用の GC • Shenandoah • Red Hat 社のプロジェクト • コンカレントメモリコンパクション
  9. 9. プロジェクト Panama • Foreign Function Interface • メモリレイアウト(struct など) By US DOT - https://www.transportation.gov/fastlane/expanded-canal-means-an-expanded-economy, Public Domain, https://commons.wikimedia.org/w/index.php?curid=54989250
  10. 10. プロジェクト Valhalla • Value Types (値型) • Generic Specialization (ジェネリックの特殊化) By Emil Doepler - Doepler, Emil. ca. 1905. Walhall, die Götterwelt der Germanen. Martin Oldenbourg, Berlin. Photographed by Haukurth (talk · contribs) and cropped by Bloodofox (talk · contribs)., Public Domain
  11. 11. プロジェクト Loom • Fibers (ファイバー) • Delimited continuations (限定継続) • Explicit tail calls (末尾再帰) By en:Yanagawa Shigenobu - Public Domain, https://commons.wikimedia.org/w/index.php?curid=3505580
  12. 12. ローカル変数の型推論
  13. 13. ローカル変数の型推論 って何?
  14. 14. JEP 286 と言えば By Konstantin Lanzet (with permission) - CPU collection Konstantin Lanzet, received per EMailCamera: Canon EOS 400D, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=4213086
  15. 15. ローカル変数の型推論 って何? ArrayList<String> list = new ArrayList<String>(); Stream<String> stream = list.stream();
  16. 16. ローカル変数の型推論 って何? ArrayList<String> list = new ArrayList<String>(); Stream<String> stream = list.stream();
  17. 17. ローカル変数の型推論 って何? var list = new ArrayList<String>(); var stream = list.stream();
  18. 18. ローカル変数と言えば • ローカル変巣 var x = foo(); • for ループ for (var i=0; i<10; i++) • For-each ループ for (var x : foos()) • try-with-resources try (var r=m())
  19. 19. ローカル変数の型推論 って何? 型推論 != 動的型付け
  20. 20. ローカル変数の型推論 なぜ?
  21. 21. void removeMatches(Map<? extends String, ? extends Number> map, int max) { for (Iterator<? extends Map.Entry<? extends String, ? extends Number>> iterator = map.entrySet().iterator(); iterator.hasNext();) { Map.Entry<? extends String, ? extends Number> entry = iterator.next(); if (max > 0 && matches(entry)) { iterator.remove(); max--; } } }
  22. 22. void removeMatches(Map<? extends String, ? extends Number> map, int max) { for (var iterator = map.entrySet().iterator(); iterator.hasNext();) { var entry = iterator.next(); if (max > 0 && matches(entry)) { iterator.remove(); max--; } } }
  23. 23. try (InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is, charsetName); BufferedReader buf = new BufferedReader(isr)) { return buf.readLine(); }
  24. 24. try (var inputStream = socket.getInputStream(); var reader = new InputStreamReader(inputStream, charsetName); var bufReader = new BufferedReader(reader)) { return bufReader.readLine(); }
  25. 25. 他の言語も同じ結論 C++ auto C# var Scala var/val Go := 宣言
  26. 26. 他の言語も同じ結論 C++ auto C# var Scala var/val Go := 宣言
  27. 27. なぜローカル変数だけ? Field やメソッドの引数などの影響は複数のファイルを跨る ClassA.java ClassB.java影響
  28. 28. なぜローカル変数だけ? Field やメソッドの引数などの影響は複数のファイルを跨る ClassA.java ClassB.java影響
  29. 29. ローカル変数の型推論 をどうやって使う?
  30. 30. 制限 • 初期化は必須 var x; • 配列のカッコは利用できない var x[] = new int[42]; • 複数の宣言は禁止 var x = 1, y = 2; • 配列のリテラルは禁止 var x = { 8, 6, 7, 5, 3, 0, 9 }; • 初期化の表現は変数を参照す ることは禁止 var x = (x = 7); • Nullの初期化は禁止 var x = null; • 解決できない poly 表現 var x = f = (x, y) -> x+y;
  31. 31. 制限 • 初期化は必須 var x; • 配列のカッコは利用できない var x[] = new int[42]; • 複数の宣言は禁止 var x = 1, y = 2; • 配列のリテラルは禁止 var x = { 8, 6, 7, 5, 3, 0, 9 }; • 初期化の表現は変数を参照す ることは禁止 var x = (x = 7); • Nullの初期化は禁止 var x = null; • 解決できない poly 表現 var x = f = (x, y) -> x+y;
  32. 32. Denotable types var hogehoge = new Object() { public void sayHi() { System.out.println(“Hello JJUG!”); } }; hogehoge.sayHi(); Class<?> c = hogehoge.getClass(); System.out.println(c.getName()); // Test$1
  33. 33. var とは何? • 予約語? • キーワード?
  34. 34. Java の予約語 abstract continue for new switch assert default goto package synchronized boolean do if private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while
  35. 35. Java の予約語 abstract continue for new switch assert default goto package synchronized boolean do if private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while
  36. 36. 予約語とキーワード キーワード 言語で何かの意味する表現 int final try など 予約語 識別子として利用出来ない
  37. 37. var とは? • タイプの名前(クラス・インタフェース)として利用出来ない • 変数名やフィールド名としては利用出来る
  38. 38. 予約語 キーワード
  39. 39. 予約語 キーワード
  40. 40. var とは? int var = 42;
  41. 41. var とは? class var { int x = 1; int y = 2; }
  42. 42. var とは? class var { int x = 1; int y = 2; }
  43. 43. var とは? var var = var();
  44. 44. ローカル変数の型推論 をどうやって使うべきか?
  45. 45. スタイル ガイド
  46. 46. 原理
  47. 47. 原理 • P1 書きやすさより読みやすさ
  48. 48. 原理 • P1 書きやすさより読みやすさ • P2 ローカルコードで理解できるはず
  49. 49. 原理 • P1 書きやすさより読みやすさ • P2 ローカルコードで理解できるはず • P3 IDE などのツールに依存すべきではない
  50. 50. 原理 • P1 書きやすさより読みやすさ • P2 ローカルコードで理解できるはず • P3 IDE などのツールに依存すべきではない • P4 明示にタイプを宣言するのはトレードオフ
  51. 51. ガイドライン
  52. 52. ガイドライン • G1 役に立つ情報を表す変数名を使うこと
  53. 53. 役に立つ情報を表す変数名を使うこと // ORIGINAL try (Stream<Customer> result = dbconn.executeQuery(query)) { return result.map(...) .filter(...) .findAny(); } // GOOD try (var customers = dbconn.executeQuery(query)) { return customers.map(...) .filter(...) .findAny();
  54. 54. 役に立つ情報を表す変数名を使うこと // ORIGINAL List<Customer> x = dbconn.executeQuery(query); // GOOD var custList = dbconn.executeQuery(query);
  55. 55. ガイドライン • G1 役に立つ情報を表す変数名を使うこと • G2 ローカル変数のスコープを制限すること
  56. 56. ガイドライン • G1 役に立つ情報を表す変数名を使うこと • G2 ローカル変数のスコープを制限すること • G3 初期化の文だけから型が分かる場合、var の利用を検討する こと
  57. 57. 初期化の文だけから型を分かる場合、var の利用を検討すること // ORIGINAL ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); // GOOD var outputStream = new ByteArrayOutputStream();
  58. 58. 初期化の文だけから型を分かる場合、var の利用を検討すること // ORIGINAL BufferedReader reader = Files.newBufferedReader(...); List<String> stringList = List.of("a", "b", "c"); // GOOD var reader = Files.newBufferedReader(...); var stringList = List.of("a", "b", "c");
  59. 59. ガイドライン • G1 役に立つ情報を表す変数名を使うこと • G2 ローカル変数のスコープを制限すること • G3 初期化の文だけから型が分かる場合、var の利用を検討する こと • G4 連続の呼び出しを分解するために var を利用すること
  60. 60. 連続の呼び出しを分解するために var を 利用すること return strings.stream() .collect(groupingBy(s -> s, counting())) .entrySet() .stream() .max(Map.Entry.comparingByValue()) .map(Map.Entry::getKey);
  61. 61. 連続の呼び出しを分解するために var を 利用すること Map<String, Long> freqMap = strings.stream() .collect(groupingBy(s -> s, counting())); Optional<Map.Entry<String, Long>> maxEntryOpt = freqMap.entrySet() .stream() .max(Map.Entry.comparingByValue()); return maxEntryOpt.map(Map.Entry::getKey);
  62. 62. 連続の呼び出しを分解するために var を 利用すること var freqMap = strings.stream() .collect(groupingBy(s -> s, counting())); var maxEntryOpt = freqMap.entrySet() .stream() .max(Map.Entry.comparingByValue()); return maxEntryOpt.map(Map.Entry::getKey);
  63. 63. ガイドライン • G1 役に立つ情報を表す変数名を使うこと • G2 ローカル変数のスコープを制限すること • G3 初期化の文だけから型が分かる場合、var の利用を検討する こと • G4 連続の呼び出しを分解するために var を利用すること • G5 ローカル変数の場合、インタフェースへのプログラミング (”programming to the interface”) は気にしなくてもいい
  64. 64. ローカル変数の場合、インタフェースへのプ ログラミング (”programming to the interface”) は気にしなくてもいい // ORIGINAL List<String> list = new ArrayList<>(); // Inferred type of list is ArrayList<String>. var list = new ArrayList<String>();
  65. 65. ガイドライン • G1 役に立つ情報を表す変数名を使うこと • G2 ローカル変数のスコープを制限すること • G3 初期化の文だけから型が分かる場合、var の利用を検討する こと • G4 連続の呼び出しを分解するために var を利用すること • G5 ローカル変数の場合、インタフェースへのプログラミング (”programming to the interface”) は気にしなくてもいい • G6 var をダイアモンドか generic メソッドと一緒に利用する時、 気を付けるこ
  66. 66. var をダイアモンドか generic メソッドと 一緒に利用する時、気を付けるこ PriorityQueue<Item> itemQueue = new PriorityQueue<Item>(); // OK: both declare variables of type PriorityQueue<Item> PriorityQueue<Item> itemQueue = new PriorityQueue<>(); var itemQueue = new PriorityQueue<Item>(); // DANGEROUS: infers as PriorityQueue<Object> var itemQueue = new PriorityQueue<>();
  67. 67. var をダイアモンドか generic メソッドと 一緒に利用する時、気を付けるこ // DANGEROUS: infers as List<Object> var list = List.of(); // OK: itemQueue infers as PriorityQueue<String> Comparator<String> comp = ... ; var itemQueue = new PriorityQueue<>(comp); // OK: infers as List<BigInteger> var list = List.of(BigInteger.ZERO);
  68. 68. ガイドライン • G1 役に立つ情報を表す変数名を使うこと • G2 ローカル変数のスコープを制限すること • G3 初期化の文だけから型が分かる場合、var の利用を検討する こと • G4 連続の呼び出しを分解するために var を利用すること • G5 ローカル変数の場合、インタフェースへのプログラミング (”programming to the interface”) は気にしなくてもいい • G6 var をダイアモンドか generic メソッドと一緒に利用する時、 気を付けること • G7 var をリテラルと一緒に利用する時、気を付けること
  69. 69. var をリテラルと一緒に利用する時、気 を付けること // ORIGINAL boolean ready = true; char ch = '¥ufffd'; long sum = 0L; String label = "wombat"; // GOOD var ready = true; var ch = '¥ufffd'; var sum = 0L; var label = "wombat";
  70. 70. var をリテラルと一緒に利用する時、気 を付けること // ORIGINAL byte flags = 0; short mask = 0x7fff; long base = 17; // DANGEROUS: all infer as int var flags = 0; var mask = 0x7fff; var base = 17;
  71. 71. var をリテラルと一緒に利用する時、気 を付けること // ORIGINAL float f = 1.0f; double d = 2.0; // GOOD var f = 1.0f; var d = 2.0;
  72. 72. var をリテラルと一緒に利用する時、気 を付けること // ORIGINAL static final float INITIAL = 3.0f; ... double temp = INITIAL; // DANGEROUS: now infers as float var temp = INITIAL;
  73. 73. その他
  74. 74. JEP 296 Consolidate the JDK Forest into a Single • JDK 8 Jdk8u-dev corba hotspot jaxp jaxws jdk langtools nashorn
  75. 75. JEP 296 Consolidate the JDK Forest into a Single • JDK 8 • JDK 10 Jdk8u-dev corba hotspot jaxp jaxws jdk langtools nashorn jdk10
  76. 76. JEP 304 Garbage Collector Interface HotSpot Runtime JIT GC
  77. 77. JEP 304 Garbage Collector Interface HotSpot Runtime C1 GC
  78. 78. JEP 304 Garbage Collector Interface HotSpot Runtime C2 GC
  79. 79. JEP 304 Garbage Collector Interface HotSpot Runtime Tiered (C1 と C2) GC
  80. 80. JEP 304 Garbage Collector Interface HotSpot Runtime JIT Serial
  81. 81. JEP 304 Garbage Collector Interface HotSpot Runtime JIT Parallel
  82. 82. JEP 304 Garbage Collector Interface HotSpot Runtime JIT CMS
  83. 83. JEP 304 Garbage Collector Interface HotSpot Runtime JIT G1
  84. 84. JEP 304 Garbage Collector Interface HotSpot Runtime C2 G1 G1 G1 G1 G1
  85. 85. JEP 304 Garbage Collector Interface HotSpot Runtime JIT G1
  86. 86. JEP 307 Parallel Full GC for G1 従来のG1 FullGC JDK 10 以降の G1 FullGC FullGC FullGC FullGC FullGC FullGC
  87. 87. JEP 310 Application Class-Data Sharing java (JVM) クラスデータ (メモリ上) java (JVM) クラスデータ (メモリ上) java (JVM) クラスデータ (メモリ上) java (JVM) クラスデータ (メモリ上)
  88. 88. JEP 310 Application Class-Data Sharing java (JVM) java (JVM) java (JVM) java (JVM) クラスデータ classes.jsa
  89. 89. JEP 312 Thread-Local Handshakes 従来の safepoint (STW) • TLH の実装
  90. 90. JEP 312 Thread-Local Handshakes 従来の safepoint (STW) • TLH の実装
  91. 91. JEP 312 Thread-Local Handshakes 従来の safepoint (STW) • TLH の実装
  92. 92. JEP 312 Thread-Local Handshakes デフォルトは有効 無効にするには -XX:-ThreadLocalHandshakes
  93. 93. JEP 313 Remove the Native-Header Generation Tool (javah) Javac HelloWorld javah -jni HelloWorld javac -h header_files HelloWorld.java
  94. 94. JEP 314 Additional Unicode Language-Tag Extensions Locale 言語コード 国コード バリアントコード
  95. 95. JEP 314 Additional Unicode Language-Tag Extensions Locale 言語コード 国コード バリアントコード 例 de_DE_EURO (ドイツ語・ドイツ・ユーロ)
  96. 96. JEP 314 Additional Unicode Language-Tag Extensions Locale 言語コード 国コード バリアントコード 例 de_DE_EURO (ドイツ語・ドイツ・ユーロ) ja_JP_JP (日本語・日本・元号)
  97. 97. JEP 314 Additional Unicode Language-Tag Extensions Locale 言語コード 国コード バリアントコード 例 de_DE_EURO (ドイツ語・ドイツ・ユーロ) ja_JP_JP (日本語・日本・元号) th_TH_TH (タイ語・タイ王国・タイ数字)
  98. 98. JEP 314 Additional Unicode Language-Tag Extensions Locale 言語コード 国コード バリアントコード 例 de_DE_EURO (ドイツ語・ドイツ・ユーロ) ja_JP_JP (日本語・日本・元号) th_TH_TH (タイ語・タイ王国・タイ数字)
  99. 99. JEP 314 Additional Unicode Language-Tag Extensions BCP 47 (JDK 7 で導入) ca:カレンダー 例: -u-ca-Japanese nu : 数字 例: -u-nu-thai
  100. 100. JEP 314 Additional Unicode Language-Tag Extensions BCP 47 (JDK 10 で追加) cu: 通貨 例: -u-cu-jpy fw: 週の最初の曜日 例: -u-fw-wed rg: 領域 例: -u-rg-gbzzzz tz: 時間帯 例: -u-tz-jptyo
  101. 101. JEP 316 Heap Allocation on Alternative Memory Devices picture by Trolomite - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=45277623 DAX ファイルシステム経由の NVDIMMメモリアクセス -XX:AllocateHeapAt=path
  102. 102. JEP 316 Heap Allocation on Alternative Memory Devices picture by Trolomite - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=45277623 DAX ファイルシステム経由の NVDIMMメモリアクセス -XX:AllocateHeapAt=path 1.mkstemp(filename)
  103. 103. JEP 316 Heap Allocation on Alternative Memory Devices picture by Trolomite - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=45277623 DAX ファイルシステム経由の NVDIMMメモリアクセス -XX:AllocateHeapAt=path 1.mkstemp(filename) 2.unlink(filename)
  104. 104. JEP 316 Heap Allocation on Alternative Memory Devices picture by Trolomite - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=45277623 DAX ファイルシステム経由の NVDIMMメモリアクセス -XX:AllocateHeapAt=path 1.mkstemp(filename) 2.unlink(filename) 3.posix_fallocate(fd, ofset, size);
  105. 105. JEP 316 Heap Allocation on Alternative Memory Devices picture by Trolomite - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=45277623 DAX ファイルシステム経由の NVDIMMメモリアクセス -XX:AllocateHeapAt=path 1.mkstemp(filename) 2.unlink(filename) 3.posix_fallocate(fd, ofset, size); 4.mmap(base, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, 0)
  106. 106. JEP 317 Experimental Java-Based JIT Compiler -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler HotSpot Runtime Graal GC By anonymous medieval illuminator; Public Domain, https://commons.wikimedia.org/w/index.php?curid=2856329
  107. 107. JEP 319 Root Certificates • Oracle JDK • OpenJDK cacertscacerts Secom Trust Systems Let's Encrypt Digicert Inc. DocuSign その他
  108. 108. JEP 319 Root Certificates • Oracle JDK • OpenJDK cacerts Secom Trust Systems Let's Encrypt Digicert Inc. DocuSign その他 cacerts Secom Trust Systems Let's Encrypt Digicert Inc. DocuSign その他
  109. 109. JEP 322 Time-Based Release Versioning java version "9.0.4" Java(TM) SE Runtime Environment (build 9.0.4+11) Java HotSpot(TM) Server VM (build 9.0.4+11, mixed mode) java version "10" 2018-03-20 Java(TM) SE Runtime Environment 18.3 (build 10+45) Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+45, mixed mode)
  110. 110. JEP 322 Time-Based Release Versioning java version "9.0.4" Java(TM) SE Runtime Environment (build 9.0.4+11) Java HotSpot(TM) Server VM (build 9.0.4+11, mixed mode) java version "10" 2018-03-20 Java(TM) SE Runtime Environment 18.3 (build 10+45) Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+45, mixed mode)
  111. 111. JEP 322 Time-Based Release Versioning java version "9.0.4" Java(TM) SE Runtime Environment (build 9.0.4+11) Java HotSpot(TM) Server VM (build 9.0.4+11, mixed mode) java version "10" 2018-03-20 Java(TM) SE Runtime Environment 18.3 (build 10+45) Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+45, mixed mode)
  112. 112. 最後に
  113. 113. • JDK 10 の開発環境での利用 • var を利用すべき箇所の検討 • JDK 11 EA リリースの検証
  114. 114. リンク集 • JDK 10 ダウンロード http://www.oracle.com/technetwork/java/javase/downloads/index.html ドキュメント https://docs.oracle.com/javase/10/ スタイル ガイド http://openjdk.java.net/projects/amber/LVTIstyle.html • JDK 11 EA ビルド http://jdk.java.net/11/ プロジェクト http://openjdk.java.net/projects/jdk/11/
  115. 115. Thank You!

×