目次
Java®プログラミング言語は、汎用的な同時オブジェクト指向言語です。 その構文はCとC++に似ていますが、CとC++を複雑にし、混乱させ、安全でない機能も多く省略されています。 Javaプラットフォームは当初、ネットワーク化されたコンシューマ・デバイス用のソフトウェアを構築する際の問題に対処するために開発されました。 これは、複数のホスト・アーキテクチャをサポートし、ソフトウェア・コンポーネントを安全に配信できるように設計されています。 これらの要件を満たすために、コンパイルされたコードは、ネットワーク間のトランスポートを存続させ、任意のクライアント上で動作させ、実行が安全であることをクライアントに保証する必要がありました。
World Wide Webの普及により、これらの属性はさらに興味深いものになりました。 Webブラウザにより、何百万人もの人々がネットを閲覧し、メディアの豊富なコンテンツに簡単にアクセスできるようになりました。 ついに、使用しているマシンや高速ネットワークに接続されているか、低速モデムに接続されているかに関係なく、見たものと聞いたものが基本的に同じメディアがありました。
Webファンはすぐに、WebのHTML文書形式がサポートするコンテンツが限られすぎていることを発見しました。 フォームなどのHTML拡張では、これらの制限のみが強調され、ユーザーが求めるすべての機能をブラウザに含めることができないことが明らかになりました。 拡張性が答えでした。
HotJavaブラウザは、HTMLページにプログラムを埋め込むことができるようにすることで、Javaプログラミング言語とプラットフォームの興味深い特性を最初に紹介しました。 プログラムは、表示されるHTMLページとともにブラウザに透過的にダウンロードされます。 ブラウザに受け入れられる前に、プログラムが安全であることを確認するために慎重にチェックされます。 HTMLページと同様に、コンパイルされたプログラムはネットワークに依存せず、ホストに依存しません。 プログラムは、どこから来たか、どのようなマシンにロードおよび実行されているかにかかわらず、同じように動作します。
Javaプラットフォームを組み込んだWebブラウザは、あらかじめ決められた一連の機能に制限されなくなりました。 動的コンテンツを組み込んだWebページへの訪問者は、そのコンテンツによってマシンが損傷しないように保証できます。 プログラマはプログラムを1回記述でき、Javaランタイム環境を提供する任意のマシンで実行されます。
Java Virtual Machineは、Javaプラットフォームの基盤です。 これは、ハードウェアとオペレーティング・システムの独立性、コンパイルされたコードの小規模サイズ、およびユーザーを悪意のあるプログラムから保護する能力を担うテクノロジのコンポーネントです。
Java Virtual Machineは抽象的なコンピューティング・マシンです。 実際のコンピューティング・マシンと同様に、命令セットがあり、実行時に様々なメモリー領域を操作します。 仮想マシンを使用してプログラミング言語を実装することは合理的に一般的です。最もよく知られている仮想マシンは、UCSD PascalのPコード・マシンです。
Sun Microsystems社で行われたJava Virtual Machineの最初のプロトタイプ実装は、現代のパーソナル・デジタル・アシスタント(PDA)に似たハンドヘルド・デバイスによってホストされるソフトウェアでJava Virtual Machine命令セットをエミュレートしました。 Oracleの現在の実装では、モバイル・デバイス、デスクトップ・デバイスおよびサーバー・デバイスでJava Virtual Machineをエミュレートしますが、Java Virtual Machineでは、特定の実装テクノロジ、ホスト・ハードウェアまたはホスト・オペレーティング・システムが想定されていません。 これは本質的に解釈されるのではなく、その命令セットをシリコンCPUの命令セットにコンパイルすることによっても実装できます。 また、マイクロコードまたは直接シリコンで実装することもできます。
Java Virtual Machineは、特定のバイナリ形式のみのJavaプログラミング言語を認識せず、classファイル形式を認識します。 classファイルには、Java Virtual Machine命令(またはバイトコード)とシンボル表、およびその他の付随情報が含まれます。
セキュリティのために、Java Virtual Machineでは、classファイルのコードに強力な構文および構造上の制約が課されます。 ただし、有効なclassファイルに関して表現できる機能を持つ言語は、Java Virtual Machineでホストできます。 一般的に利用可能なマシンに依存しないプラットフォームによって引き付けられる他の言語の実装者は、その言語のデリバリ手段としてJava Virtual Machineを利用できます。
classファイル形式はバージョニングされます。すべてのclassファイルは、majorという形式のバージョン番号を宣言します。minorは、Java SEの特定のリリースに対するファイルの依存関係を示し、Java Virtual Machineによるファイルの解釈に影響します。
ここで指定するJava Virtual Machineは、Java SE 26と互換性があり、Java言語仕様、Java SE 26エディションで指定されているJavaプログラミング言語をサポートしています。 メジャー・バージョン番号が45から70までのclassファイルをサポートします。
classファイルを生成するツールは、通常、最新機能を利用するために最新のメジャー・バージョン番号を採用しますが、古いメジャー・バージョン番号を持つclassファイルは、通常、将来のJava Virtual Machineリリースでサポートされると予想されます。
次の表に、Java SEの各リリースでサポートされるclassファイルのメジャー・バージョン番号(最大Java SE 26)を示します。 3番目の列「最早」は、そのリリースのJava Virtual Machineでサポートされている最も早いclassファイルのメジャー・バージョン番号を示しています。 4番目の列「最新」は、そのリリースのJava Virtual Machineでサポートされている最新のclassファイルのメジャー・バージョン番号を示しています。 (非常に初期のリリースでは、Java SEリリースのかわりにJDKバージョンが表示されます。)
表1.2-A. Java SEリリースおよびclassファイルのメジャー・バージョン
| Java SE | リリース | 最早 | 最新 |
|---|---|---|---|
| 1.0.2 | 1996年5月 | 45 | 45 |
| 1.1 | 1997年2月 | 45 | 45 |
| 1.2 | 1998年12月 | 45 | 46 |
| 1.3 | 2000年5月 | 45 | 47 |
| 1.4 | 2002年2月 | 45 | 48 |
| 5.0 | 2004年9月 | 45 | 49 |
| 6 | 2006年12月 | 45 | 50 |
| 7 | 2011年7月 | 45 | 51 |
| 8 | 2014年3月 | 45 | 52 |
| 9 | 2017年9月 | 45 | 53 |
| 10 | 2018年3月 | 45 | 54 |
| 11 | 2018年9月 | 45 | 55 |
| 12 | 2019年3月 | 45 | 56 |
| 13 | 2019年9月 | 45 | 57 |
| 14 | 2020年3月 | 45 | 58 |
| 15 | 2020年9月 | 45 | 59 |
| 16 | 2021年3月 | 45 | 60 |
| 17 | 2021年9月 | 45 | 61 |
| 18 | 2022年3月 | 45 | 62 |
| 19 | 2022年9月 | 45 | 63 |
| 20 | 2023年3月 | 45 | 64 |
| 21 | 2023年9月 | 45 | 65 |
| 22 | 2024年3月 | 45 | 66 |
| 23 | 2024年9月 | 45 | 67 |
| 24 | 2025年3月 | 45 | 68 |
| 25 | 2025年9月 | 45 | 69 |
| 26 | 2026年3月 | 45 | 70 |
第2章に、Java Virtual Machineアーキテクチャの概要を示します。
第3章では、Javaプログラミング言語で記述されたコードをJava Virtual Machineの命令セットにコンパイルします。
第4章は、コンパイルされたクラスおよびインタフェースを表すために使用される、ハードウェアおよびオペレーティング・システムに依存しないバイナリ形式であるclassファイル形式を指定します。
第5章では、Java Virtual Machineの起動、およびクラスとインタフェースのロード、リンクおよび初期化を指定します。
第6章は、Java Virtual Machineの命令セットを指定し、命令をopcodeニーモニックのアルファベット順で示します。
第7章に、opcode値で索引付けされたJava Virtual Machineのopcodeニーモニックの表を示します。
Java®仮想マシン仕様の第2版では、第2章で、Java Virtual Machineの仕様をサポートすることを目的としたJavaプログラミング言語の概要を説明しましたが、それ自体は仕様の一部ではありませんでした。 The Java Virtual Machine Specification、 Java SE 26 Editionでは、Javaプログラミング言語の詳細は、The Java Language Specification、 Java SE 26 Editionを参照してください。
第2版のJava®仮想マシン仕様では、第8章に、Java Virtual Machineスレッドと共有メイン・メモリーとの相互作用について説明した低レベルのアクションの詳細を示します。 The Java Virtual Machine Specification、 Java SE 26 Editionでは、スレッドおよびロックの詳細は、The Java Language Specification、 Java SE 26 Editionの第17章を参照してください。 第17章には、JSR 133エキスパート・グループによって作成されたJavaメモリー・モデルおよびスレッド仕様が反映されています。
この仕様全体を通して、Java SE Platform APIから作成されたクラスおよびインタフェースを参照します。 単一の識別子Nを使用してクラスまたはインタフェース(例で宣言されているもの以外)を参照する場合、意図した参照は、パッケージjava.langのNという名前のクラスまたはインタフェースです。 java.lang以外のパッケージのクラスまたはインタフェースには、完全修飾名を使用します。
パッケージjavaまたはそのサブパッケージで宣言されているクラスまたはインタフェースを参照する場合、意図した参照は、ブートストラップ・クラス・ローダー(§5.3.1)によってロードされたクラスまたはインタフェースです。
javaという名前のパッケージのサブパッケージを参照する場合は常に、ブートストラップ・クラス・ローダーによって決定されるそのサブパッケージを参照します。
この仕様内の相互参照は(§x.y)と表示されます。 フォーム(JLS§x.y)の相互参照を介して、The Java Language Specification、 Java SE 26 Editionの概念を参照する場合があります。
この仕様でのフォントの使用は、次のとおりです。
fixed widthフォントは、Java Virtual Machineのデータ型、例外、エラー、classファイル構造、PrologコードおよびJavaコード・フラグメントに使用されます。
Italicは、Java Virtual Machineの「アセンブリ言語」、そのopcodesおよびoperands、およびJava Virtual Machineのランタイム・データ領域のアイテムに使用されます。 また、新しい用語を導入し、単に強調するためにも使用されます。
この仕様の規範的なテキストを明確にするために設計された非規範的なテキストは、より小さくインデントされたテキストで示されます。
これは非正規テキストです。 それは直感、論理、助言、例、等を提供します。
プレビュー機能は次のとおりです:
Javaプログラミング言語の新機能(「プレビュー言語機能」)
Java Virtual Machineの新機能(「VMのプレビュー機能」)
java.*またはjavax.*ネームスペースの新しいモジュール、パッケージ、クラス、インタフェース、フィールド、メソッド、コンストラクタまたはenum定数(「プレビューAPI」)
これは完全に指定され、完全に実装され、かつ不完全です。 これは、Java SEプラットフォームの特定のリリースの実装で使用でき、実際の使用に基づいた開発者のフィードバックを求めています。これにより、Java SEプラットフォームの将来のリリースで永続的になる可能性があります。
特定のリリースのJava SEプラットフォームで定義されたプレビュー機能は、そのリリースのJava SEプラットフォーム仕様に列挙されています。 プレビュー機能は次のように指定します:
プレビュー言語機能は、そのリリースのThe Java®Language Specificationへの変更(diffs)を示すスタンドアロン・ドキュメントで指定されます。 プレビュー言語機能の仕様は、The Java®Language Specificationに組み込まれており、コンパイル時にプレビュー機能が有効化されている場合のみ、その一部を構成します。
プレビューVM機能は、そのリリースのThe Java®Virtual Machine Specificationへの変更(「diffs」)を示すスタンドアロン・ドキュメントで指定されます。 プレビューVM機能の仕様は、参照によりJava®仮想マシン仕様に組み込まれており、実行時にプレビュー機能が有効化されている場合のみ、その一部を構成します。
プレビューAPIは、そのリリースのJava SE API仕様内に指定されています。
Java SEプラットフォームの実装では、コンパイル時と実行時の両方で、特定のリリースで定義されたプレビュー機能は無効になります。ただし、ユーザーがホスト・システムを介して指定した場合は、コンパイル時と実行時の両方で、そのプレビュー機能が有効になります。 実装では、特定のリリースのプレビュー機能の一部のみを有効にする方法は提供されません。
classファイルは、次の場合にJava SE Nのプレビュー機能に依存します(N ≥ 12)。
classファイルのメジャー・バージョン番号は、表1.2-AのJava SE Nでサポートされている最新のメジャー・バージョン番号です。
classファイルのマイナー・バージョン番号は65535です。
たとえば、バージョン番号が66.65535のclassファイルは、Java SE 22でサポートされている最新のメジャー・バージョン番号が66であるため、Java SE 22のプレビュー機能に依存します。
コンパイラは、classファイルでプレビューVM機能が使用されていない場合でも、特定のリリースのプレビュー機能に依存するclassファイルを発行する必要がある場合があります。 たとえば、リリースのプレビュー言語機能を使用するJavaソース・ファイルは、リリースのプレビュー機能に依存するclassファイルにコンパイルする必要があります。
実行時に、特定のJava SE Platformリリースのプレビュー機能に依存するclassファイルをロードするためのルールは、§4.1で指定されています。 このようなclassファイルは、そのリリースのJava SEプラットフォームに関連付けられており、他のリリース(プレビュー機能が有効になっている場合でも)ではロードできません。これは、依存するプレビュー機能が他のリリースで異なるか欠落している可能性があるためです。
Java SE 26では、プレビューVM機能は定義されません。
リーダーは、Java®仮想マシン仕様の技術的なエラーおよびあいまいさをjls-jvms-spec-comments@openjdk.orgに報告するよう招待されています。
javacによるclassファイルの生成および操作に関する質問(Javaプログラミング言語の参照コンパイラ)は、compiler-dev@openjdk.orgに送信できます。