kagamihogeの日記

kagamihogeの日記です。

JEP 247: Compile for Older Platform Versionsをテキトーに訳した

http://openjdk.java.net/jeps/247 をテキトーに訳した

JEP 247: Compile for Older Platform Versions

Owner    Jan Lahoda
Created 2014/09/10 16:56
Updated 2015/07/01 07:44
Type    Feature
Status  Targeted
Component   tools/javac
Scope   JDK
Discussion  compiler dash dev at openjdk dot java dot net
Effort  M
Duration    L
Priority    3
Reviewed by Alex Buckley, Brian Goetz, Jonathan Gibbons
Endorsed by Brian Goetz
Release 9
Issue   8058150

Summary

プラットフォームの旧バージョンで動かすためのJavaプログラムをコンパイル可能なようにjavacを拡張する。

Motivation

javacにある二つのコマンドラインオプション、-source-targetは、それぞれ、-sourceコンパイラが受け取るJava言語のバージョンを選択するために使われ、-targetコンパイラが生成するクラスファイルのバージョンです。デフォルトでは、javacはプラットフォームAPIの最新バージョンでコンパイルを行います。そのため、コンパイル後のプログラムはプラットフォームのカレントバージョンでだけ利用可能なAPIを使ってしまうことも可能です。こうしたプログラムはプラットフォームの旧バージョンでは、-source-targetオプションの値に関わらず、動作不可能です。ユーザはこれらのオプションを指定することで特定のプラットフォームバージョンで動作可能なクラスファイルを取得できるものだ、と想定するため、この事象は長い目で見るとユーザビリティにダメージを与えています。

Description

新しいコマンドラインオプション-platformを定義し、このオプションは、指定のプラットフォームバージョン実装にリンクするクラスファイルを生成するようコンパイラを自動的に設定します。javacに事前定義済みのプラットフォームにおいては、-platform N-source N -target N -bootclasspath <bootclasspath-from-N>と同等です。

バージョンNのbootclasspathを得るには、プラットフォームの過去リリースのシグネチャデータが必要です。そのデータは$JDK_ROOT/lib/ct.symファイルに格納されており、他バージョンでも同様ですが、しかし、JDk 8には同名のファイルはありません。ct.symファイルはターゲットプラットフォームバージョンのクラスファイルに相当する必要最小限のクラスファイルを含むZIPファイルです。

-platform実装の限界として、指定ターゲットプラットフォームのUnicodeバージョンはコンパイル中に使われず、代わりにカレントプラットフォームのUnicodeバージョンが使われます。

-platformコマンドラインオプションは-source, -target, -bootclasspath, -endorseddirsを含む複数javacオプションと互換性がありません。

一般的なプラットフォームは内部APIを使用してプラグイン可能と想定しており、また、プラグインされるプラットフォーム定義は-source-targetに加えて他のjavac設定プロパティに、アノテーションプロセッサの追加やjavac Pluginなどの、影響を及ぼすことになると思われます。

現在二つの未解決問題があります。

  • プラットフォームの指定ターゲットバージョンのct.symの全API-platformオプションで選択可能、と想定しています。それとは別のJARファイルを扱う方法が未解決の問題です。そのJARファイルをbootstrapクラスパスに自動的に追加し、パスにそのJARファイルも引き続き追加するかどうか、が未解決の問題です*1
  • リリースの中間バージョンで行われるスタンドアローンなテクノロジのAPI変更を扱う方法についてが未解決です(例。JDK 6 updatesにおけるJAX-WSの2.0から2.1へのアップデート)。我々はAPI旧バージョンに対するコンパイルの決定を単純化するかもしれません。

Risks and Assumptions

JDKソースコードリポジトリは過去リリースのプラットフォームAPIのディスクリプションを含む必要があります。ディスクリプションのサイズは相当な量となり、結果としてJDKのビルドは大規模なものとなります。可能な限り容量オーバーヘッドを削除するよう注意する必要があります。

*1:How to handle other JAR files that are automatically added to the bootstrap class path, and even whether to continue adding them to that path, is an open question.が原文。訳に自信が無い