SlideShare a Scribd company logo
JDK 10 へようこそ
ローカル変数の型推論
その他
David Buck
JVM Sustaining Engineering
Oracle
Hello JJUG!
バック デイビッド
• Java SE サステイニング エンジニアリング
• JVM のバグを直す人
• OpenJDK Updates
Project Maintainer
• 趣味:プログラミング
• @DavidBuckJP
アジェンダ
• 現在地
• ローカル変数の型推論
• その他
• 最後に
現在地
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
JDK 10(2018年3月20日)
• Short Term Release (サポートは今年の9月で終了)
• 今夜はいっぱい喋る!
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
新しい GC の研究・開発
• ZGC
• 4TBまでのスケーラビリティ
• ヒープサイズ問わずに
• Live-set のサイズ問わずに
• 10ミリ秒以下の STW
• 64ビット専用の GC
• Shenandoah
• Red Hat 社のプロジェクト
• コンカレントメモリコンパクション
プロジェクト 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
プロジェクト 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
プロジェクト Loom
• Fibers (ファイバー)
• Delimited continuations
(限定継続)
• Explicit tail calls (末尾再帰)
By en:Yanagawa Shigenobu - Public Domain, https://commons.wikimedia.org/w/index.php?curid=3505580
ローカル変数の型推論
ローカル変数の型推論
って何?
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
ローカル変数の型推論
って何?
ArrayList<String> list = new ArrayList<String>();
Stream<String> stream = list.stream();
ローカル変数の型推論
って何?
ArrayList<String> list = new ArrayList<String>();
Stream<String> stream = list.stream();
ローカル変数の型推論
って何?
var list = new ArrayList<String>();
var stream = list.stream();
ローカル変数と言えば
• ローカル変巣 var x = foo();
• for ループ for (var i=0; i<10; i++)
• For-each ループ for (var x : foos())
• try-with-resources try (var r=m())
ローカル変数の型推論
って何?
型推論 != 動的型付け
ローカル変数の型推論
なぜ?
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--;
}
}
}
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--;
}
}
}
try (InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is,
charsetName);
BufferedReader buf = new BufferedReader(isr)) {
return buf.readLine();
}
try (var inputStream = socket.getInputStream();
var reader = new InputStreamReader(inputStream,
charsetName);
var bufReader = new BufferedReader(reader)) {
return bufReader.readLine();
}
他の言語も同じ結論
C++ auto
C# var
Scala var/val
Go := 宣言
他の言語も同じ結論
C++ auto
C# var
Scala var/val
Go := 宣言
なぜローカル変数だけ?
Field やメソッドの引数などの影響は複数のファイルを跨る
ClassA.java ClassB.java影響
なぜローカル変数だけ?
Field やメソッドの引数などの影響は複数のファイルを跨る
ClassA.java ClassB.java影響
ローカル変数の型推論
をどうやって使う?
制限
• 初期化は必須
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;
制限
• 初期化は必須
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;
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
var とは何?
• 予約語?
• キーワード?
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
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
予約語とキーワード
キーワード
言語で何かの意味する表現
int
final
try
など
予約語
識別子として利用出来ない
var とは?
• タイプの名前(クラス・インタフェース)として利用出来ない
• 変数名やフィールド名としては利用出来る
予約語
キーワード
予約語
キーワード
var とは?
int var = 42;
var とは?
class var {
int x = 1;
int y = 2;
}
var とは?
class var {
int x = 1;
int y = 2;
}
var とは?
var var = var();
ローカル変数の型推論
をどうやって使うべきか?
スタイル ガイド
原理
原理
• P1 書きやすさより読みやすさ
原理
• P1 書きやすさより読みやすさ
• P2 ローカルコードで理解できるはず
原理
• P1 書きやすさより読みやすさ
• P2 ローカルコードで理解できるはず
• P3 IDE などのツールに依存すべきではない
原理
• P1 書きやすさより読みやすさ
• P2 ローカルコードで理解できるはず
• P3 IDE などのツールに依存すべきではない
• P4 明示にタイプを宣言するのはトレードオフ
ガイドライン
ガイドライン
• G1 役に立つ情報を表す変数名を使うこと
役に立つ情報を表す変数名を使うこと
// 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();
役に立つ情報を表す変数名を使うこと
// ORIGINAL
List<Customer> x = dbconn.executeQuery(query);
// GOOD
var custList = dbconn.executeQuery(query);
ガイドライン
• G1 役に立つ情報を表す変数名を使うこと
• G2 ローカル変数のスコープを制限すること
ガイドライン
• G1 役に立つ情報を表す変数名を使うこと
• G2 ローカル変数のスコープを制限すること
• G3 初期化の文だけから型が分かる場合、var の利用を検討する
こと
初期化の文だけから型を分かる場合、var
の利用を検討すること
// ORIGINAL
ByteArrayOutputStream outputStream = new
ByteArrayOutputStream();
// GOOD
var outputStream = new ByteArrayOutputStream();
初期化の文だけから型を分かる場合、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");
ガイドライン
• G1 役に立つ情報を表す変数名を使うこと
• G2 ローカル変数のスコープを制限すること
• G3 初期化の文だけから型が分かる場合、var の利用を検討する
こと
• G4 連続の呼び出しを分解するために var を利用すること
連続の呼び出しを分解するために var を
利用すること
return strings.stream()
.collect(groupingBy(s -> s,
counting()))
.entrySet()
.stream()
.max(Map.Entry.comparingByValue())
.map(Map.Entry::getKey);
連続の呼び出しを分解するために 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);
連続の呼び出しを分解するために 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);
ガイドライン
• G1 役に立つ情報を表す変数名を使うこと
• G2 ローカル変数のスコープを制限すること
• G3 初期化の文だけから型が分かる場合、var の利用を検討する
こと
• G4 連続の呼び出しを分解するために var を利用すること
• G5 ローカル変数の場合、インタフェースへのプログラミング
(”programming to the interface”) は気にしなくてもいい
ローカル変数の場合、インタフェースへのプ
ログラミング (”programming to the
interface”) は気にしなくてもいい
// ORIGINAL
List<String> list = new ArrayList<>();
// Inferred type of list is ArrayList<String>.
var list = new ArrayList<String>();
ガイドライン
• G1 役に立つ情報を表す変数名を使うこと
• G2 ローカル変数のスコープを制限すること
• G3 初期化の文だけから型が分かる場合、var の利用を検討する
こと
• G4 連続の呼び出しを分解するために var を利用すること
• G5 ローカル変数の場合、インタフェースへのプログラミング
(”programming to the interface”) は気にしなくてもいい
• G6 var をダイアモンドか generic メソッドと一緒に利用する時、
気を付けるこ
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<>();
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);
ガイドライン
• G1 役に立つ情報を表す変数名を使うこと
• G2 ローカル変数のスコープを制限すること
• G3 初期化の文だけから型が分かる場合、var の利用を検討する
こと
• G4 連続の呼び出しを分解するために var を利用すること
• G5 ローカル変数の場合、インタフェースへのプログラミング
(”programming to the interface”) は気にしなくてもいい
• G6 var をダイアモンドか generic メソッドと一緒に利用する時、
気を付けること
• G7 var をリテラルと一緒に利用する時、気を付けること
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";
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;
var をリテラルと一緒に利用する時、気
を付けること
// ORIGINAL
float f = 1.0f;
double d = 2.0;
// GOOD
var f = 1.0f;
var d = 2.0;
var をリテラルと一緒に利用する時、気
を付けること
// ORIGINAL
static final float INITIAL = 3.0f;
...
double temp = INITIAL;
// DANGEROUS: now infers as float
var temp = INITIAL;
その他
JEP 296
Consolidate the JDK Forest into a Single
• JDK 8
Jdk8u-dev
corba
hotspot
jaxp
jaxws
jdk
langtools
nashorn
JEP 296
Consolidate the JDK Forest into a Single
• JDK 8 • JDK 10
Jdk8u-dev
corba
hotspot
jaxp
jaxws
jdk
langtools
nashorn
jdk10
JEP 304
Garbage Collector Interface
HotSpot Runtime
JIT GC
JEP 304
Garbage Collector Interface
HotSpot Runtime
C1 GC
JEP 304
Garbage Collector Interface
HotSpot Runtime
C2 GC
JEP 304
Garbage Collector Interface
HotSpot Runtime
Tiered
(C1 と C2)
GC
JEP 304
Garbage Collector Interface
HotSpot Runtime
JIT Serial
JEP 304
Garbage Collector Interface
HotSpot Runtime
JIT Parallel
JEP 304
Garbage Collector Interface
HotSpot Runtime
JIT CMS
JEP 304
Garbage Collector Interface
HotSpot Runtime
JIT G1
JEP 304
Garbage Collector Interface
HotSpot Runtime
C2 G1
G1
G1
G1
G1
JEP 304
Garbage Collector Interface
HotSpot Runtime
JIT G1
JEP 307
Parallel Full GC for G1
従来のG1 FullGC JDK 10 以降の G1 FullGC
FullGC
FullGC
FullGC
FullGC
FullGC
JEP 310
Application Class-Data Sharing
java
(JVM)
クラスデータ
(メモリ上)
java
(JVM)
クラスデータ
(メモリ上) java
(JVM)
クラスデータ
(メモリ上)
java
(JVM)
クラスデータ
(メモリ上)
JEP 310
Application Class-Data Sharing
java
(JVM)
java
(JVM)
java
(JVM)
java
(JVM)
クラスデータ
classes.jsa
JEP 312
Thread-Local Handshakes
従来の safepoint (STW) • TLH の実装
JEP 312
Thread-Local Handshakes
従来の safepoint (STW) • TLH の実装
JEP 312
Thread-Local Handshakes
従来の safepoint (STW) • TLH の実装
JEP 312
Thread-Local Handshakes
デフォルトは有効
無効にするには
-XX:-ThreadLocalHandshakes
JEP 313
Remove the Native-Header Generation Tool
(javah)
Javac HelloWorld
javah -jni HelloWorld
javac -h header_files HelloWorld.java
JEP 314
Additional Unicode Language-Tag Extensions
Locale
言語コード 国コード バリアントコード
JEP 314
Additional Unicode Language-Tag Extensions
Locale
言語コード 国コード バリアントコード
例
de_DE_EURO (ドイツ語・ドイツ・ユーロ)
JEP 314
Additional Unicode Language-Tag Extensions
Locale
言語コード 国コード バリアントコード
例
de_DE_EURO (ドイツ語・ドイツ・ユーロ)
ja_JP_JP (日本語・日本・元号)
JEP 314
Additional Unicode Language-Tag Extensions
Locale
言語コード 国コード バリアントコード
例
de_DE_EURO (ドイツ語・ドイツ・ユーロ)
ja_JP_JP (日本語・日本・元号)
th_TH_TH (タイ語・タイ王国・タイ数字)
JEP 314
Additional Unicode Language-Tag Extensions
Locale
言語コード 国コード バリアントコード
例
de_DE_EURO (ドイツ語・ドイツ・ユーロ)
ja_JP_JP (日本語・日本・元号)
th_TH_TH (タイ語・タイ王国・タイ数字)
JEP 314
Additional Unicode Language-Tag Extensions
BCP 47 (JDK 7 で導入)
ca:カレンダー 例: -u-ca-Japanese
nu : 数字 例: -u-nu-thai
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
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
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)
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)
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);
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)
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
JEP 319
Root Certificates
• Oracle JDK • OpenJDK
cacertscacerts
Secom Trust Systems
Let's Encrypt
Digicert Inc.
DocuSign
その他
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
その他
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)
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)
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)
最後に
• JDK 10 の開発環境での利用
• var を利用すべき箇所の検討
• JDK 11 EA リリースの検証
リンク集
• 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/
Thank You!

More Related Content

PPT
Start!! Ruby
PDF
講座Java入門
PDF
Ruby 3のキーワード引数について考える
PDF
Unity2015_No10_~UGUI&Audio~
PDF
Javaクラスファイルの読み方
PDF
Shibuya.lisp #28: 仮題: R について
PDF
Lisp tutorial for Pythonista : Day 2
PDF
クロージャデザインパターン
Start!! Ruby
講座Java入門
Ruby 3のキーワード引数について考える
Unity2015_No10_~UGUI&Audio~
Javaクラスファイルの読み方
Shibuya.lisp #28: 仮題: R について
Lisp tutorial for Pythonista : Day 2
クロージャデザインパターン

What's hot (20)

PDF
ATN No.2 Scala事始め
PPTX
Perlと出会い、Perlを作る
PDF
PHPとJavaScriptにおけるオブジェクト指向を比較する
PDF
はてなブックマーク in Scala
PDF
正規表現リテラルは本当に必要なのか?
PPTX
C# 8.0 Preview in Visual Studio 2019 (16.0)
PDF
BOF1-Scala02.pdf
PPTX
【java8 勉強会】 怖くない!ラムダ式, Stream API
PDF
不遇の標準ライブラリ - valarray
PDF
Thinking in Cats
PDF
Boost.Flyweight
PDF
Material
PDF
第2回勉強会スライド
PDF
たのしい関数型
PPTX
C# 7.2 with .NET Core 2.1
PDF
Emcpp item31
PDF
Pfi Seminar 2010 1 7
PDF
あなたのScalaを爆速にする7つの方法(日本語版)
PDF
組み込みでこそC++を使う10の理由
PPTX
Javaプログラミング入門【第2回】
ATN No.2 Scala事始め
Perlと出会い、Perlを作る
PHPとJavaScriptにおけるオブジェクト指向を比較する
はてなブックマーク in Scala
正規表現リテラルは本当に必要なのか?
C# 8.0 Preview in Visual Studio 2019 (16.0)
BOF1-Scala02.pdf
【java8 勉強会】 怖くない!ラムダ式, Stream API
不遇の標準ライブラリ - valarray
Thinking in Cats
Boost.Flyweight
Material
第2回勉強会スライド
たのしい関数型
C# 7.2 with .NET Core 2.1
Emcpp item31
Pfi Seminar 2010 1 7
あなたのScalaを爆速にする7つの方法(日本語版)
組み込みでこそC++を使う10の理由
Javaプログラミング入門【第2回】
Ad

Similar to JDK 10 へようこそ (20)

PDF
Java8から17へ
PDF
JavaScript経験者のためのGo言語入門
PDF
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
PDF
Kink: invokedynamic on a prototype-based language
PDF
Clojure
PPT
Scala on Hadoop
PPT
G*workshop sendai 20100424(v2)
KEY
Aizu lt tokyo_luxion
PPTX
Xtend の紹介
PDF
JavaScriptユーティリティライブラリの紹介
PPTX
PDF
JVMの中身を可視化してみた
PDF
JavaScript 講習会 #1
PPTX
PHP AST 徹底解説
PDF
第三回ありえる社内勉強会 「いわががのLombok」
PDF
Programming camp 2008, Codereading
PDF
Spock's world
PDF
Flutterを体験してみませんか
PPTX
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
PDF
GNU awk (gawk) を用いた Apache ログ解析方法
Java8から17へ
JavaScript経験者のためのGo言語入門
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Kink: invokedynamic on a prototype-based language
Clojure
Scala on Hadoop
G*workshop sendai 20100424(v2)
Aizu lt tokyo_luxion
Xtend の紹介
JavaScriptユーティリティライブラリの紹介
JVMの中身を可視化してみた
JavaScript 講習会 #1
PHP AST 徹底解説
第三回ありえる社内勉強会 「いわががのLombok」
Programming camp 2008, Codereading
Spock's world
Flutterを体験してみませんか
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
GNU awk (gawk) を用いた Apache ログ解析方法
Ad

More from David Buck (20)

PDF
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
PDF
JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...
PDF
Java Bytecode Crash Course [Code One 2019]
PDF
CSI (Crash Scene Investigation) HotSpot: Common JVM Crash Causes and Solution...
PDF
invokedynamic for Mere Mortals [Code One 2019]
PDF
Hangs, Slowdowns, Starvation—Oh My! A Deep Dive into the Life of a Java Threa...
PDF
JDK Mission Control: Where We Are, Where We Are Going [Code One 2019]
PDF
Java Concurrency, A(nother) Peek Under the Hood [Code One 2019]
PDF
Z Garbage Collector
PDF
Valhalla Update JJUG CCC Spring 2019
PDF
Var handles jjug_ccc_spring_2018
PDF
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
PDF
HotSpot のロック: A Peek Under the Hood [JJUG ナイトセミナ JVM 特集 2015年8月]
PDF
Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]
PDF
Bytecode Verification, the Hero That Java Needs [JavaOne 2016 CON1500]
PDF
Java Debuggers: A Peek Under the Hood [JavaOne 2016 CON1503]
PDF
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
PDF
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
PDF
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
PDF
InvokeDynamic for Mere Mortals [JavaOne 2015 CON7682]
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...
Java Bytecode Crash Course [Code One 2019]
CSI (Crash Scene Investigation) HotSpot: Common JVM Crash Causes and Solution...
invokedynamic for Mere Mortals [Code One 2019]
Hangs, Slowdowns, Starvation—Oh My! A Deep Dive into the Life of a Java Threa...
JDK Mission Control: Where We Are, Where We Are Going [Code One 2019]
Java Concurrency, A(nother) Peek Under the Hood [Code One 2019]
Z Garbage Collector
Valhalla Update JJUG CCC Spring 2019
Var handles jjug_ccc_spring_2018
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
HotSpot のロック: A Peek Under the Hood [JJUG ナイトセミナ JVM 特集 2015年8月]
Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]
Bytecode Verification, the Hero That Java Needs [JavaOne 2016 CON1500]
Java Debuggers: A Peek Under the Hood [JavaOne 2016 CON1503]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
InvokeDynamic for Mere Mortals [JavaOne 2015 CON7682]

JDK 10 へようこそ