Oracle Code One 2019速報レポート

第1回新しいリリースサイクルで進化を続けるJava[c1jp]

2019年9月16日から19日にかけての4日間、米サンフランシスコのMoscone CenterにおいてOracle主催の開発者向けイベントOracle Code One 2019が開催されています。Oracle Code Oneは、もともとは「JavaOne」という名称でJava開発者向けに開催されていたイベントの後継となるもので、対象となる技術の裾野を広げてエンジニア同士のコラボレーションを促進するという目的で、昨年、名称が変更されました。

Javaを中心として、各種プログラミング言語やクラウド技術などに関する170以上のセッションが用意されているほか、参加者同士が自由に議論に参加するスタイルの⁠アンカンファレンス⁠なども開催されるなど、世界中のエンジニアと技術談義ができるのがこのイベントの魅力です。

数ある技術セッションのうち、今回は「The Future of Java Is Now」というタイトルで行われた初日のキーノートセッションの様子をレポートします。

進行役を務めたOracleのVice Precident、Georges Saab氏。Code Oneの顔とも言える存在
進行役を務めたOracleのVice Precident、Georges Saab氏。Code Oneの顔とも言える存在

「量子コンピュータ Is Now」

キーノートの前半に登場したのは、スタンフォード大学で量子コンピューティングを研究するJessica Pointing氏です。

量子コンピューティングの研究者、Jessica Pointing氏
量子コンピューティングの研究者、Jessica Pointing氏

未来の技術と言われ実用化が待ち望まれている量子コンピュータですが、実際にどのような分野に応用でき、ソフトウェア・エンジニアの仕事がどのように変わっていくのかについては、詳しく知らない人も多いのではないでしょうか。Pointing氏はこの量子コンピュータについて、以下の3つの観点から分かりやすく説明しました。

  1. どのような問題を素早く解決できるようになるのか?
  2. 核となる要素は何か?
  3. 現在はどんな状況にあるのか?

その内容について詳しく記述するのは避けますが、同氏の発表の中で特に興味深かったのは、量子コンピュータのプログラムをJavaで記述するためのライブラリの存在です。⁠Quantum Computing API for Java」という名称でオープンソースで開発されており、GitHub上でリポジトリが公開されています。

従来の一般的なコンピュータでは、0か1のいずれかの状態を持つ「ビット」を基準として情報を扱います。それに対して量子コンピュータでは、量子力学の重ね合わせを利用した「qubit」⁠量子ビット)によって情報を扱います。1qubitは0と1のすべての組み合わせ(00,01,10,11)を同時に表現できます。

基盤となるアーキテクチャがまったく異なるためアルゴリズムも変わってきます。広く研究されているのは、量子ゲートを組み合わせて量子回路を構成する方式です。Quantum Computing API for Javaでは、量子回路をJavaプログラムで記述して実行するシミュレーションを行うことができます。

Javaで記述した量子回路の例
publbic static void quantumCircuit() {
    QuantumExecutionEnvironment sumulator = new SimpleQuantumExecutionEnvironment();
    Program program = new Program();
    Step step = new Step();
    step.addGate(new Hadamard(0));
    program.addStep(step);
    Result result = simulator.runProgram(program);
}

現時点では、最大で50個から100個ほどのqubitを持つ量子コンピュータが実現できているそうです。しかし、この規模では十分な高速性を得ることはできません。しかし将来的に数千から数万、数百万といった規模のqubitを持つ量子コンピュータを実現し、古典的なコンピュータでは解決できなかった問題に取り組むことができるようになります。そのときにはプログラマの意識も量子プログラミングに対応するよう変えていく必要があります。

まだまだ未来の話のように思えますが、Quantum Computing API for Javaなどを使って、今のうちから未来に意識を向けておくのは大切なことかもしれません。

Javaの進化をどのように支えていくか

キーノートの後半はJavaの話題でした。2年前のJavaOneで、OracleはJavaのライフサイクルに関する大きな方向転換を発表しました。数年に一度大型のアップデートを行うこれまでのリリースモデルを改め、6ヵ月に1度のバージョンアップを継続して行っていくスタイルに変えたのです。それから2年が経ち、すでに新しいリリースモデルでJava 10/11/12の3つのバージョンがリリースされました。そしてこのキーノートが行われた翌日の9月17日(現地時間⁠⁠、最新版となるJava 13がリリースされましたstrong>※。

The arrival of Java 13!

キーノートの進行役を務めたOracleのGeorge Saab氏は、Javaは依然としてさまざまな分野で重要な位置にあることを強調した上で、このような素早い変化にどのように対応していくのかを、各分野の専門家とともに語りました。

Javaは依然として重要
Javaは依然として重要

たとえば、Javaには従来より「JCP(Java Community Process⁠⁠」という標準化プロセスがあります。Javaの標準仕様は、Oracleなどの特定の企業ではなく、このJCPによって策定されています。現在、Javaの開発自体はOpenJDKプロジェクトに完全に移管されましたが、これによってJCPの役割はどう変わったのでしょうか。

これについては、JCPのExecutive CommitteeであるGil Tene氏とBruno Souza氏が登壇して、今後の方針について紹介しました。両氏によると、JSPによる仕様の標準化プロセスは従来通りに機能しており、新しいJavaのリリースサイクルに対応できるようプロセス自体も調整されているとのことです。そのほかにも参照実装の決定などさまざまな役割がありますが、中でも重要なのはJavaが分裂してしまうリスクを最小限に抑えることだと言います。これまで通り標準化を適切にハンドリングすることで、Javaが細分化して互換性が失われるようなことにならないよう務めていくとのことです。

Bruno Souza氏(中央)とGil Tene氏(左)
Bruno Souza氏(中央)とGil Tene氏(左)

新しいリリースサイクルで進化を続けるJava

さて、前述のように間も無くJava 13がリリースされます。Java 10から12までの3つのバージョンで、すでに多くの新機能が追加されました(詳細はOpenJDKのプロジェクトサイトを参照してください⁠⁠。

Java 13には以下の5つのJEP(JDK Enhancement Proposals)が含まれます。JEPはOpenJDKに対する機能の追加や変更の提案で、OpenJDKの開発はこのJEPをもとにして実装が行われ、有効なものが将来のJDKに取り込まれていくという手続きになっています。

とくに多くの開発者に関係するのがJEP 354とJEP 355でしょう。JEP 354はswitchを式として記述できるようにするという提案です。すでにJEP 325としてJava 12にプレビュー版が導入されていましたが、そのフィードバックを受けていくつかの修正を加えられたものがJEP 354となります。

Switch式の記述例
class Switch {
    static int numLetters(Day day) {
        return switch (day) {
            case MONDAY, FRIDAY, SUNDAY -> 6;
            case TUESDAY -> 7;
            case THURSDAY -> 8;
            case WEDNESDAY -> 9;
        }
    }
}

JEP 355は、複数行のテキストブロックをシンプルに記述できるようにするという提案です。次の例のように、改行を含む文字列を、改行のエスケープ文字などを使うことなく記述することが可能になります。ブロックの開始と終了は、3つ連続したダブルクォーテーションで表します。

テキストブロックの記述例
String html = """
            <html>
                <body>
                    <p>Hello World.</p>
                </body>
            </html>
            """;

仕様の変更とは別に、JVM自体の性能についても、地道なチューニングによって大幅に向上しているそうです。OracleでJVMの開発を担当するMikael Vidstedt氏は、JDK 8からJDK 13にかけてのJVMの性能の変化について説明しました。まず起動時間については、JDK 9でモジュールが導入されたことによって大幅に悪化したものの、現在は最適化が進んでJDK 8の頃よりも高速になっているとのことです。

起動時間の向上
起動時間の向上

JDK 10で導入されたApplication CDS(AppCDS)を活用すれば、さらなる起動時間の高速化が可能です。

Micronautによる起動時間の向上
Micronautによる起動時間の向上

G1を使ったJVMについては、スループットはJDK 11以降ほぼ横ばいですが、応答性能については徐々に向上しています。

G1のパフォーマンスの向上
G1のパフォーマンスの向上

GCの停止時間はZGCが圧倒的です。ただし、ZGCはヒープサイズが巨大な環境を想定したGCであり、おもにエンタープラズ用途の大規模アプケーションでなければ十分な効果は得られないという特徴があります。

GCの停止時間の比較
GCの停止時間の比較

昨今では、GraalVMなどを利用したネイティブバイナリ化も大きな話題となっており、Javaアプリケーションの起動・実行性能についてはまだまだ向上の余地がありそうです。

キーノートの最後には、現在OpenJDKで進められている4つのサブプロジェクトについても紹介がありました。

  • Project Amber ― さまざまなJava言語の拡張
  • Project Loom ― 継続(Continuation)や軽量スレッド(Fiber)の導入
  • Project Panama ― JVMとネイティブコードとのインターフェースを最適化する
  • Project Valhalla ― Value Typeやジェネリクスの特殊化の導入

このうち、Amberについてはすでにいくつかの機能が実際に導入されています。たとえばJava 13のSwitch式やテキストブロックはAmberの一部です。残りの3つのプロジェクトは極めて大きな機能追加となるため、まだ具体的にどのバージョンのJavaに入るのかは決まっていません。しかし実現した際には大きなイノベーションとなる可能性を秘めているので、今のうちからチェックしておくことをおすすめします。

昨年のCode Oneに引き続いて、今回のキーノートでもこれといって新しい大きな発表はありませんでした。しかし実際には個々のアップデートで着実に進化を続けており、気を抜いたらあっという間に置いていかれてしまいます。まさに、リリースモデルを変えた当初の目論み通りになっているという印象を受けました。

おすすめ記事

記事・ニュース一覧