Java11、JavaFX11リリース!Java12EAにはRSLが入った

Java11リリース!

Java11がリリースされました!こちらでダウンロードできます。
http://jdk.java.net/11/


ビルドは28で、8/23にでたRC1そのままになっています。
Mark Reinhold氏の言ったとおり、最後のビルドになりましたね。
JDK 11: First Release Candidate


Oracle JDKも開発・評価・テスト用にこちらでダウンロードできます。ただし、本番運用には使えないライセンスになっているのでご注意を。
https://www.oracle.com/technetwork/java/javase/downloads/index.html


主な変更点としては、Java EE・CORBAモジュールが削除されたこと、HTTP Client APIが標準になったこと、単一ソースファイルのJavaコードをjavaコマンドで実行できるようになったこと、GCとしてZGC・Epsillon GCが入ったこと、などがあげられます。
JDK 11


APIの変更についてはこちらを。
Java11でのAPI変更を雑に列挙 - きしだのはてな

OpenJFX11リリース

JavaFXのオープン実装であるOpenJFXも数日前に11がリリースされています。
JavaFX

Java12 ea12にRaw String Literalsが実装された

Java12 ea12にはRaw String Literals(RSL)が実装されました。
http://jdk.java.net/12/


indentやalignといったメソッドもStringクラスに追加されています。
ただし、Raw String Literalsを使うには--enable-previewをつける必要があります。

メソッドボディに関するJEP

メソッドボディをラムダのように書けるJEPが提案されています。
JEP draft: Concise Method Bodies

int twice(int x) -> x * 2;

のように書けるようにするものです。
メソッド参照の場合は

String toString(Foo f) = f::toString;

のような感じ。
移譲を書きやすくなりそうです。

JDK12は3/19リリース。あとOpenJDKのGithubリポジトリができた

9/25のJDK11リリースまで1週間となりました。

JDK12のスケジュール提案

そんな中、JDK12のスケジュールの提案が出てますね。2019/3/19リリースの予定です。

  2018/12/13  Rampdown Phase One
  2019/01/17  Rampdown Phase Two
  2019/01/31  Release-Candidate Phase
  2019/03/19  General Availability

Proposed schedule for JDK 12

OpenJDKのGithubリポジトリができた

ところで、OpenJDKのソース管理はMercurialで行われ、レビューはメーリングリストで行われています。
これをGitに移行してGithubを使ってみようという流れが起きています。
OpenJDK Commiter's Workshopでも長い時間をとって議論が行われていましたが、Mercurialリポジトリサイズが大きな問題になっていたように思います。


このプロジェクトはSkaraという名前になってます。
Call for Discussion: New Project: Skara -- investigating source code management options for the JDK sources
メーリングリストもできていますね。
skara-dev Info Page


ということで、まずはGithubリポジトリができました。
openjdk/jdk: Read-only mirror of http://hg.openjdk.java.net/jdk/jdk

Raw String Literalsが正式にJEPに入った

Raw String Literalsは正式にJEPに入りました。まだコードは取り込まれてないけど。
JEP proposed to target JDK 12: 326: Raw String Literals (Preview)

ランダムな向きのベクトルを生成する

ちょっと、ランダムな向きのベクトルを生成する必要があったので調べてみた。
さすがStackOverFlow。すぐあった。
正規分布で各要素を得て正規化すればいいということらしい。
distribution - random unit vector in multi-dimensional space - Stack Overflow


詳しい説明は ここを見ろってあったけど、よくわからない・・・
Hypersphere Point Picking -- from Wolfram MathWorld


とりあえずJavaのコードのように書くとこう。

var r = new Random();
return new Vector3D(r.nextGaussian(),
                    r.nextGaussian(),
                    r.nextGaussian()).normalize();

Raw String LiteralsがJDK12のJEPに

Raw String Literals(RSL)がJDK12のJEPにProposalとして入りました。RSLはバッククオートで囲って改行やダブルクオートなどを含む文字列を表記する仕様です。
Amberで検討されているJava構文の変更 - Qiita


必要なAPIコンパイラでの対応はすでにレビュー中なので、早ければもしかしたら今週末のEAで試せるかもしれません。


先にJEPに入ったSwitch Expressionは、まずはcaseの拡張がEA9に入りました。
しかし、利用するには--enable-previewオプションが必要になります。


まだExpressionには なってないようですね。


RSLもPreviewとしてJEPに入っているので、--enable-previewが必要になるんだろうな。

JDK 11 RC1リリースと、Loomの継続は継続なの?疑惑

バグが2つ残っていて遅れたJDK 11 RC1が先週末にでてますね。「そして運がよければ最後の!」 by Mark Reihhold
JDK 11: First Release Candidate


昨日さくらばさんがLL2018でLoomの話をしてTwitterがにぎわってから、Loomで言ってる継続はほんとに継続なのか、という話題がでてます。


このAPIだと継続(=残りの計算)っぽくないけど、やろうとしてることや実態は継続(or 限定継続?)、ということなんですかね。

JDK12の最初のJEPはSwitch Expression(Preview)

JDK12に最初のJEPが入りました。
JDK 12


JEP325 Switch Expressions(Preview)です。
JEP 325: Switch Expressions (Preview)


拡張Switchについては、Qiitaでまとめていますが var a = switch(f){case 0->false;default->true;}のような書き方ができるような仕様変更です。
Amberで検討されているJava構文の変更 - Qiita


これで、Switchが便利に使えるようになります。


ところで、JDK11はRCが出るはずでしたが、2つほどP1のバグが残ってるのでまだのようです。
JDK 11: No Release Candidate, yet


IBMメインフレームで使われているs390x CPUでネイティブコールに失敗してるのと、SSLの挙動がおかしいみたいですね。
[JDK-8209637] [s390x] Interpreter doesn't call result handler after native calls - Java Bug System
[JDK-8207317] SSLEngine negotiation fail Exception behavior changed from fail-fast to fail-lazy - Java Bug System


それと、ツッコミ隊長であるStephen Colebourneさんが、OpenJDKでのLTSについて質問しています。そこにOracleのMark Reinholdさん、Red HatのAndrewさん、AdoptOpenJDKのMartijnさんが答えていて、だいたい肯定的な意見に見えますね。
What does LTS mean for OpenJDK?

Project LoomでJavaでの継続(Continuation)を試す

Project Loomは、Javaで継続(Continuation)やFiber(軽量スレッド)、末尾呼び出し最適化なんかを実現するプロジェクトです。
OpenJDK: Loom


そのLoom、ながいことどうやって動かすかもよくわからない感じだったのが、先日のJVMLSにあわせてプロトタイプが公開されてました。
http://mail.openjdk.java.net/pipermail/loom-dev/2018-July/000061.html


ビルド方法はこんな感じです。

$ hg clone http://hg.openjdk.java.net/loom/loom  
$ cd loom  
$ hg update -r fibers 
$ sh configure   
$ make images

たりないパッケージはconfigureのときに教えてくれるので、それに従って入れていけばいいです。


Continuationはプログラムを動かしたり止めたりの制御ができる仕組みです。

public class LoomSample {
  public static void main(String... args) {
    var scope = new ContinuationScope() {};
    var c = new Continuation(scope, () -> {
      System.out.println("c1");
      Continuation.yield(scope);
      System.out.println("c2");
      Continuation.yield(scope);
      System.out.println("c3");
    });
    System.out.println("out1");
    c.run();
    System.out.println("out2");
    c.run();
    System.out.println("out3");
    c.run();
    System.out.println("out4");
  }
}

Continuation#yieldで動きを止めて、run()で再開できる感じ。
実行するとこういう出力になります。

out1
c1
out2
c2
out3
c3
out4


Fiberは、このContinuationにスケジューラを組み合わせて並行実行する感じになります。


で、たとえばゲームなどで、異なる動きをするキャラクタを1/60ごとに1フレーム動かすみたいな処理は自分で状態機械を組んだり面倒なコードが必要になります。継続で書ければ、それぞれの動きを通常の処理として書けばいいことになります。


往復運動する青い四角と、円運動する赤い丸を1/20秒ごとに動かすというサンプルを書いてみました。
https://gist.github.com/kishida/3898fdc50757e8d66a2f1f79f6d378db


結構いい感じに動いてます。


Loomの資料は、wikiがここにあって、JVMLS2018の資料なども公開されています。
https://wiki.openjdk.java.net/display/loom/Main


目的みたいなことは、ここでまとまってます。
Loom Proposal.md


Fiberは、伊藤さんがechoサーバーつくってます
https://github.com/chiroito/sandbox/blob/master/sandbox-loom/src/main/java/FiberEchoServer.java