Java(プログラミング言語)

ページは半保護されています

ジャワ
パラダイムマルチパラダイム:ジェネリックオブジェクト指向クラスベース)、関数型命令型リフレクション型並行型
デザイン:ジェームズ・ゴスリング
開発者オラクル社
初登場1995年5月23日[ 1 ] (1995年5月23日
安定版リリース
Java SE 25 [ 2 ] ウィキデータで編集する / 2025 年 9 月 16 日 (2025年9月16日
タイピングの規律静的、強い、安全主格明示的
メモリ管理ガベージコレクション
ファイル名拡張子.java、.class.jar、.jmod、.war
Webサイト
影響を受けた
CLU[ 3 ] Simula67[ 3 ] Lisp[ 3 ] Smalltalk[ 3 ] Ada 83C++[ 4 ] C#[ 5 ] Eiffel[ 6 ] Mesa[ 7 ] Modula-3[ 8 ] Oberon[ 9 ] Objective-C[ 10 ] UCSD Pascal[ 11 ] [ 12 ] Object Pascal [ 13 ]
影響を受けた
Ada 2005ArkTSBeanShellC#Chapel[ 14 ] ClojureECMAScriptFantomGambas[ 15 ] GroovyHack[ 16 ] HaxeJ#JavaScriptJS++KotlinPHPPythonScalaVala

Java高水準汎用メモリセーフオブジェクト指向プログラミング言語である。Javaはプログラマが一度書けばどこでも実行できるWORA )ことを目的としており、[ 17 ]コンパイルされたJavaコードはJavaをサポートするすべてのプラットフォームで再コンパイルすることなく実行できる。[ 18 ] Javaアプリケーションは通常、基盤となるコンピュータアーキテクチャに関係なく、どのJava仮想マシン(JVM)でも実行できるバイトコードにコンパイルされる。Javaの構文はCC++に似ているが、どちらよりも低水準の機能が少ない。Javaランタイムは、従来のコンパイル言語では通常利用できない 動的機能(リフレクションや実行時コード変更など)を提供する。

Javaはリリース後すぐに人気を博し、それ以来人気のあるプログラミング言語となっています。[ 19 ] GitHubによると、Javaは2022年に3番目に人気のあるプログラミング言語でした。[ 20 ]依然として広く人気があるものの、近年ではJVMを使用する他の言語の人気が高まっているため、Javaの使用は徐々に減少しています。[ 21 ]

Javaは、サン・マイクロシステムズジェームズ・ゴスリング氏によって設計されました。1995年5月にサンのJavaプラットフォームの中核コンポーネントとしてリリースされました。オリジナルおよびリファレンス実装のJavaコンパイラ、仮想マシン、クラスライブラリは、サンによって独自のライセンスの下でリリースされました。2007年5月現在、 Javaコミュニティプロセスの仕様に従い、サンはJavaテクノロジーのほとんどをGPL-2.0のみのライセンスの下で再ライセンスしています。 2010年にサンを買収したオラクルは、独自のHotSpot Java仮想マシンを提供しています。ただし、公式のリファレンス実装はOpenJDK JVMです。これはほとんどの開発者が使用するオープンソースソフトウェアであり、ほぼすべてのLinuxディストリビューションのデフォルトのJVMとなっています。

Java 25 は、2025 年 9 月現在のバージョンです。Java 8、11、17、21、25 は、現在もメンテナンスが行われている長期サポートバージョンです。

歴史

Javaのマスコット、デューク
Javaの生みの親、ジェームズ・ゴスリング氏(2008年)

ジェームズ・ゴスリング、マイク・シェリダン、パトリック・ノートンは1991年6月にJava言語プロジェクトを立ち上げた。[ 22 ] Javaはもともと双方向テレビ向けに設計されたが、当時のデジタルケーブルテレビ業界には先進的すぎた。[ 23 ]この言語は当初、ゴスリングのオフィスの外に立っていたオークの木にちなんでOakと名付けられた。後にこのプロジェクトはGreenという名前で呼ばれ、最終的にインドネシア産のコーヒーの一種であるJavaコーヒーにちなんでJavaと改名された。[ 24 ]ゴスリングはシステムおよびアプリケーションプログラマーが馴染みのあるC / C++スタイルの構文でJavaを設計した。 [ 25 ]

サン・マイクロシステムズは、1996年に最初の公開実装をJava 1.0としてリリースした。[ 26 ]これは、一度書けばどこでも実行できる(WORA)機能を約束し、一般的なプラットフォーム上で無償のランタイムを提供した。かなり安全で、構成可能なセキュリティを備え、ネットワークおよびファイルへのアクセス制限が可能だった。主要なWebブラウザはすぐにWebページ内でJavaアプレットを実行する機能を組み込み、Javaは急速に普及した。Java 1.0コンパイラは、Java 1.0言語仕様に厳密に準拠するように、アーサー・ヴァン・ホフによってJavaで書き直された。 [ 27 ] Java 2(1998年12月~1999年に最初にJ2SE 1.2としてリリース)の出現により、新しいバージョンは異なるタイプのプラットフォーム用に構築された複数の構成を持つようになった。J2EEは、通常サーバー環境で実行されるエンタープライズ・アプリケーション向けのテクノロジとAPIが含まれ、J2MEはモバイル・アプリケーション向けに最適化されたAPIを備えていた。 2006 年、マーケティング上の理由から、 Sun は新しい J2 バージョンの名前をそれぞれJava EEJava MEJava SEに変更しました。

1997年、サン・マイクロシステムズはISO/IEC JTC 1標準化団体、その後はEcma InternationalにJavaの正式化を申し出たが、すぐにそのプロセスから撤退した。[ 28 ] [ 29 ] [ 30 ] Javaは事実上の標準であり続け、Java Community Processを通じて管理されている。[ 31 ]サンはかつて、プロプライエタリソフトウェアであるにもかかわらず、Java実装のほとんどを無償で提供していた。サンはJava Enterprise Systemなどの専用製品のライセンス販売を通じてJavaから収益を得ていた。

2006年11月13日、サンはJava仮想マシン(JVM)の大部分をGPL-2.0のみのライセンスに基づき、フリーソフトウェア/オープンソースソフトウェア(FOSS)として公開しました。2007年5月8日、サンはこのプロセスを完了し、サンが著作権を保有していない一部のコードを除き、JVMのコアコード全体をフリーソフトウェア/オープンソースの配布条件の下で公開しました。[ 32 ]

サンの副社長リッチ・グリーンは、Javaに関するサンの理想的な役割は伝道師であると語った。[ 33 ] 2009年から2010年にかけてオラクル社がサン・マイクロシステムズ社を買収した後、オラクル社は参加と透明性のあるコミュニティの育成に絶え間なく尽力するJava技術の管理者であると自らを位置付けている。[ 34 ]しかし、オラクル社はその後まもなく、 Android SDK内でのJavaの使用を理由にグーグル社を提訴した(Androidのセクションを参照)。

2010年4月2日、ジェームズ・ゴスリングはオラクル社を辞任した。[ 35 ]

2016年1月、オラクルはJDK 9をベースとしたJavaランタイム環境でブラウザプラグインを廃止すると発表した。[ 36 ]

Javaソフトウェアは、ラップトップからデータセンターゲーム機から科学用スーパーコンピュータまで、ほとんどのデバイスで動作します。[ 37 ]

Oracle(およびその他)は、古いバージョンのJavaに未解決のセキュリティ問題があるため、古くてサポートされていないバージョンのJavaをアンインストールすることを強く推奨しています。[ 38 ]

原則

Java言語を作成するにあたっては、5つの主要な目標がありました。[ 18 ]

  1. シンプルで、オブジェクト指向的であり、使い慣れたものでなければなりません。
  2. 堅牢かつ安全でなければなりません。
  3. アーキテクチャに中立で移植可能である必要があります。
  4. 高いパフォーマンスで実行する必要があります。
  5. 解釈されスレッド化され動的である必要があります。

バージョン

2025年9月現在、Java 8、11、17、21、25が長期サポート(LTS)バージョンとしてサポートされています。[ 39 ]

オラクルは、2019年1月に商用利用向けにバージョンのJava 8 LTSの最後の無償パブリックアップデートをリリースしましたが、個人利用向けにはJava 8のパブリックアップデートを無期限にサポートします。Adoptiumなどの他のベンダーは、OpenJDKの長期サポート(LTS)バージョンの無償ビルドを引き続き提供しています。これらのビルドには、追加のセキュリティパッチやバグ修正が含まれる場合があります。[ 40 ]

Java のメジャーリリースバージョンとそのリリース日:

バージョン日付
JDKベータ版1995
JDK 1.01996年1月23日[ 41 ]
JDK 1.11997年2月19日
J2SE 1.21998年12月8日
J2SE 1.32000年5月8日
J2SE 1.42002年2月6日
J2SE 5.02004年9月30日
Java SE 62006年12月11日
Java SE 72011年7月28日
Java SE 8 (LTS)2014年3月18日
Java SE 92017年9月21日
Java SE 102018年3月20日
Java SE 11 (LTS)2018年9月25日[ 42 ]
Java SE 122019年3月19日
Java SE 132019年9月17日
Java SE 142020年3月17日
Java SE 152020年9月15日[ 43 ]
Java SE 162021年3月16日
Java SE 17 (LTS)2021年9月14日
Java SE 182022年3月22日
Java SE 192022年9月20日
Java SE 202023年3月21日
Java SE 21 (LTS)2023年9月19日[ 44 ]
Java SE 222024年3月19日
Java SE 232024年9月17日
Java SE 242025年3月18日[ 45 ]
Java SE 25 (LTS)2025年9月16日[ 46 ]

エディション

Sunは、異なるアプリケーション環境をターゲットとしたJavaの4つのエディションを定義・サポートしており、多くのAPIをいずれかのプラットフォームに分割しています。対象となるプラットフォームは以下のとおりです。

Java API のクラスは、パッケージと呼ばれる個別のグループに編成されています。パッケージには、関連するインターフェース、クラス、サブパッケージ、例外のセットが含まれています。

Sun はPersonal Javaと呼ばれるエディションも提供していましたが、これは後に標準ベースの Java ME 構成プロファイルの組み合わせに置き換えられました。

実行システム

Java JVMとバイトコード

Javaの設計目標の1つは移植性です。これは、Javaプラットフォーム用に作成されたプログラムは、適切なランタイムサポートがあれば、ハードウェアとオペレーティングシステムのどのような組み合わせでも同様に実行できることを意味します。これは、Java言語コードをアーキテクチャ固有のマシンコードに直接コンパイルするのではなく、 Javaバイトコードと呼ばれる中間表現にコンパイルすることで実現されます。Javaバイトコード命令はマシンコードに類似していますが、ホストハードウェア専用に記述された仮想マシン(VM)によって実行されることを目的としています。エンドユーザーは通常、スタンドアロンJavaアプリケーションを実行するためにデバイスにインストールされたJavaランタイム環境(JRE)を使用するか、 Javaアプレットを実行するためにWebブラウザを使用します。

標準ライブラリは、グラフィックス、スレッドネットワークなどのホスト固有の機能にアクセスするための一般的な方法を提供します。

ユニバーサルバイトコードの使用により移植は容易になります。しかし、バイトコードを機械語に解釈するオーバーヘッドのため、解釈型プログラムはネイティブ実行ファイルよりも実行速度が遅くなることがほとんどでした。実行時にバイトコードを機械語にコンパイルするジャストインタイム(JIT)コンパイラは早い段階から導入されていました。JavaのHotspotコンパイラは実際には2つのコンパイラを1つにまとめたもので、GraalVM(Java 11などには含まれていますが、Java 16以降は削除されています)によって階層型コンパイルが可能です。[ 51 ] Java自体はプラットフォームに依存せず、 Java仮想マシン(JVM)によって実行される特定のプラットフォームに適応され、 Javaバイトコードをプラットフォームの機械語に変換します。 [ 52 ]

パフォーマンス

Java で書かれたプログラムはC++で書かれたものよりも遅く、多くのメモリを必要とするという評判があります。[ 53 ] [ 54 ]しかし、1997/1998 年にJava 1.1でジャストインタイムコンパイルが導入され、[ 55 ]より優れたコード分析をサポートする言語機能の追加 (内部クラス、StringBuilder クラス、オプションのアサーションなど)、および2000 年に Sun のデフォルト JVM になったHotSpotなどの Java 仮想マシンの最適化により、Java プログラムの実行速度は大幅に向上しました。Java 1.5 では、 ConcurrentMapsやその他のマルチコア コレクションのロックフリー実装を含むパッケージの追加によりパフォーマンスが向上し、Java 1.6 ではさらに向上しました。 java.util.concurrent

非JVM

一部のプラットフォームでは、Javaを直接ハードウェアでサポートしています。ソフトウェアJava仮想マシンの代わりにハードウェアでJavaバイトコードを実行できるマイクロコントローラもあります。[ 56 ]また、一部のARMベースのプロセッサでは、 Jazelleオプションを通じてJavaバイトコードを実行するためのハードウェアサポートが可能ですが、現在のARMの実装ではほとんどサポートされていません。

自動メモリ管理

Javaは自動ガベージコレクタを使用して、オブジェクトのライフサイクルにおけるメモリ管理を行います。プログラマはオブジェクトの作成時期を決定し、オブジェクトが使用されなくなったらJavaランタイムがメモリを回復する役割を担います。オブジェクトへの参照がなくなると、そのアクセス不能なメモリはガベージコレクタによって自動的に解放されるようになります。プログラマのコードが不要になったオブジェクトへの参照を保持している場合、メモリリークに似た現象が発生する可能性があります。これは通常、不要になったオブジェクトがまだ使用されているコンテナに格納されている場合に発生します。[ 57 ]存在しないオブジェクトのメソッドが呼び出されると、ヌルポインタ例外がスローされます。[ 58 ] [ 59 ]

Javaの自動メモリ管理モデルの背後にある考え方の一つは、プログラマが手動でメモリ管理を行う負担から解放されるという点です。一部の言語では、オブジェクト生成用のメモリはスタック上に暗黙的に割り当てられるか、ヒープ上に明示的に割り当てられ、解放されます。後者の場合、メモリ管理の責任はプログラマにあります。プログラムがオブジェクトを解放しない場合、メモリリークが発生します。[ 57 ]プログラムが既に解放されたメモリにアクセスしたり解放しようとした場合、結果は未定義で予測が困難になり、プログラムが不安定になったりクラッシュしたりする可能性があります。これはスマートポインタを使用することで部分的に改善できますが、オーバーヘッドと複雑さが増します。ガベージコレクションは、メモリが参照されているにもかかわらず使用されない論理メモリリークを防ぐことはできません。 [ 57 ]

ガベージコレクションはいつでも発生する可能性があります。理想的には、プログラムがアイドル状態のときに発生します。ヒープ上に新しいオブジェクトを割り当てるのに十分な空きメモリがない場合、ガベージコレクションが必ず起動されます。これにより、プログラムが一時的に停止する可能性があります。Javaでは明示的なメモリ管理は不可能ですが、JVMに手動でガベージコレクションを実行させることは可能です[ 60 ]

JavaはC/C++スタイルのポインタ演算をサポートしていません。[ 61 ]オブジェクトのアドレスを算術的に操作する(例えば、オフセットの加算や減算など)ことができます。これにより、ガベージコレクタは参照されているオブジェクトを再配置することができ、型の安全性とセキュリティを確保できます。

C++や他のオブジェクト指向言語と同様に、Javaのプリミティブデータ型の変数は、非プリミティブデータ型で一般的に見られるヒープではなく、フィールド(オブジェクトの場合)またはスタックメソッドの場合)に直接格納されます(ただし、エスケープ解析を参照してください)。これは、パフォーマンス上の理由からJavaの設計者が意図的に決定したものです。

Javaには複数の種類のガベージコレクターが含まれています。Java 9以降、HotSpotはGarbage First Garbage Collector(G1GC)をデフォルトとして使用します。[ 62 ]ただし、Java 11で導入されたZ Garbage Collector(ZGC)や、Java 12で導入されたがOracle製のOpenJDKビルドで使用できないShenandoah GCなど、ヒープの管理に使用できる他のガベージコレクターもいくつかあります。Shenandoahは、Eclipse Temurinなどのサードパーティ製のOpenJDKビルドで使用できます。Javaのほとんどのアプリケーションでは、G1GCで十分です。Java 8などの以前のバージョンのJavaでは、Parallel Garbage Collectorがデフォルトのガベージコレクターとして使用されていました。

メモリ管理の問題を解決しても、特に例外が発生した場合に、ネットワークやデータベース接続、ファイル ハンドルなど、他の種類のリソースを適切に処理するというプログラマの負担が軽減されるわけではありません。

構文

この Java Core クラスの依存関係グラフは、 jdeps とGephiを使用して作成されました。

Javaの構文はC++Cに大きく影響を受けています。構造化プログラミング、ジェネリックプログラミング、オブジェクト指向プログラミングの構文を組み合わせたC++とは異なり、Javaはほぼ完全にオブジェクト指向言語として構築されました。[ 18 ]すべてのコードはクラス内に記述され、すべてのデータ項目はオブジェクトです。ただし、整数、浮動小数点数、ブール値、文字などのプリミティブデータ型はパフォーマンス上の理由からオブジェクトではありません。

C++とは異なり、Javaは演算子のオーバーロード[ 63 ]やクラスの多重継承をサポートしていませんが、インターフェースの多重継承はサポートされています。[ 64 ]

Javaでは、C++と同様のコメントが使用されます。コメントには3つの異なるスタイルがあります。2つのスラッシュ( )で始まる1行スタイル、 で始まって で終わる//複数行スタイル、そしてで始まって で終わるJavadocコメントスタイルです。Javadocスタイルのコメントでは、ユーザーはJavadoc実行ファイルを実行してプログラムのドキュメントを作成できます。また、Eclipseなどの一部の統合開発環境(IDE)で読み取ることができるため、開発者はIDE内でドキュメントにアクセスできます。 /**//***/

こんにちは世界

以下は、従来の Java 構文による 「Hello, World!」プログラムの例です。

パブリッククラスHelloWorld {パブリック静的void main 文字列[]引数{システム.out.println ( " Hello World! " ) ;}}

Java 25では、メインクラスとメインメソッドの簡略化された構文が導入され、ユーザーは小さなJavaプログラムを簡潔に記述できるようになりました。[ 65 ] [ 66 ]

void main () {IO . println ( "Hello World!" );}

特別クラス

アプレット

Javaアプレットは、主にウェブブラウザに表示されるウェブページ内の他のアプリケーションに埋め込まれたプログラムでした。JavaアプレットAPIは、2017年のJava 9のリリースで廃止されました。[ 67 ] [ 68 ]

サーブレット

Javaサーブレット技術は、Web開発者にWebサーバーの機能を拡張し、既存のビジネスシステムにアクセスするためのシンプルで一貫性のあるメカニズムを提供します。サーブレットは、クライアントからのリクエストへのレスポンスを生成するサーバーサイドJava EEコンポーネントです。多くの場合、これはHTTPリクエストへのレスポンスとしてHTMLページを生成することを意味しますが、 WebSocket通信用など、他にも多くの標準的なサーブレットクラスが利用可能です。

Java サーブレット API は、Web サービス用の 2 つの標準 Java テクノロジによってある程度置き換えられています (ただし、内部的には引き続き使用されています)。

アプリケーション サーバーまたはサーブレット コンテナー上のこれらの API の一般的な実装では、実際のビジネス ロジックの Web サービス メソッドに委任されたHTTP要求および応答とのすべてのやり取りを処理するために標準サーブレットが使用されます。

JavaServer Pages

JavaServer Pages(JSP)は、クライアントからのHTTPリクエストに対するレスポンス(通常はHTMLページ)を生成するサーバーサイドJava EEコンポーネントです。JSPは、特殊な区切り文字とを使用して、HTMLページにJavaコードを埋め込みます。JSPは、最初にアクセスされた際に、Javaサーブレット(それ自体がJavaアプリケーション)にコンパイルされます。その後、生成されたサーブレットがレスポンスを作成します。[ 69 ]<%%>

スイングアプリケーション

Swingは、Java SEプラットフォーム用のグラフィカル・ユーザー・インターフェース・ライブラリです。Swingのプラグイン可能なルック・アンド・フィール・システムを通じて、異なるルック・アンド・フィールを指定することが可能です。Windows 、GTK+MotifのクローンはSunから提供されています。ApplemacOS向けにAquaルック・アンド・フィールも提供しています。これらのルック・アンド・フィールの以前の実装では不十分だと考えられていた部分がありましたが、Java SE 6のSwingでは、基盤となるプラットフォームのネイティブなGUIウィジェット描画ルーチンをより多く使用することで、この問題に対処しています。[ 70 ]

JavaFXアプリケーション

JavaFXは、デスクトップアプリケーションや、様々なデバイスで実行できるリッチWebアプリケーションを作成・配信するためのソフトウェアプラットフォームです。JavaFXは、 Java SEの標準グラフィカルユーザーインターフェース(GUI)ライブラリとしてSwingに代わるものとして設計されていますが、JDK 11以降、JavaFXはコアJDKには含まれず、独立したモジュールとして提供されています。[ 71 ] JavaFXは、 Microsoft WindowsLinuxmacOS上のデスクトップコンピュータWebブラウザをサポートしています。JavaFXは、ネイティブOSのルックアンドフィールをサポートしていません。[ 72 ]

ジェネリック医薬品

2004 年に、ジェネリックは J2SE 5.0 の一部として Java 言語に追加されました。ジェネリックの導入前は、各変数宣言は特定の型でなければなりませんでした。たとえばコンテナ クラスの場合、特定の型のオブジェクトだけを受け入れるコンテナを作成する簡単な方法がないため、これは問題になります。コンテナは、通常Object、クラスまたはインタフェースのすべてのサブタイプで動作しますが、含まれるクラスごとに異なるコンテナ クラスを作成する必要があります。ジェネリックを使用すると、ほぼ同じコードを持つコンテナ クラスを多数作成しなくても、コンパイル時に型チェックを行うことができます。より効率的なコードを作成できることに加えて、コンパイル時エラーを発行することで、特定の実行時例外の発生を防ぐことができます。Java ですべての実行時型エラー ( ) が発生しないようにすれば、型安全ClassCastExceptionになります。

2016年、Javaの型システムは、ジェネリクスを用いてクラスやメソッドを構築することで、あるクラスのインスタンスを無関係な別のクラスの変数に代入することが可能であるという点で、不健全であることが証明されました。このようなコードはコンパイラには受け入れられますが、実行時にはクラスキャスト例外によって失敗します。[ 73 ]

批判

Javaに対する批判としては、ジェネリックの実装、[ 74 ]速度、[ 53 ]符号なし数値の扱い、[ 75 ]浮動小数点演算の実装、[ 76 ]主要なJava VM実装HotSpotにおけるセキュリティ上の脆弱性の歴史などが挙げられる。[ 77 ] 開発者は、Java EEの標準部分であるJava Persistence API (JPA)の複雑さと冗長性を批判してきた。この批判を受けて、データベース操作を簡素化し、定型コードを削減することを目的としたSpring Data JPAなどの高レベルの抽象化の採用が増えている。このようなフレームワークの人気の高まりは、現代のJava開発において標準のJPA実装の使いやすさに限界があることを示唆している。

クラスライブラリ

Javaクラスライブラリは、Javaでのアプリケーション開発を支援するために開発された標準ライブラリです。OracleがJava Community Processプログラムを通じて他の組織と協力して管理しています[ 78 ]このプロセス参加する企業や個人は、APIの設計と開発に影響を与える可能性があります。このプロセスは2010年代に論争の的となりました。[ 79 ]このクラスライブラリには、次のような機能が含まれています。

ドキュメント

Javadocは、サン・マイクロシステムズによって作成された包括的なドキュメントシステムです。開発者にコードを文書化するための体系的なシステムを提供します。Javadocのコメントは先頭にアスタリスクが追加され、区切り文字は と です/***/一方、Javaの通常の複数行コメントは と で区切られ/**/単一行コメントは で始まります//[ 87 ]

実装

Oracle Corporationは、 2010年1月27日のSun Microsystemsの買収により、Java SEプラットフォームの公式実装を所有しています。この実装は、SunによるJavaのオリジナル実装に基づいています。Oracleの実装は、WindowsmacOSLinux、およびSolarisで利用できます。Javaには、 Ecma International、ISO/IEC、ANSI、またはその他のサードパーティ標準化団体によって認められた正式な標準化がないため、Oracleの実装が事実上の標準となっています。

Oracleの実装は、2つの異なるディストリビューションにパッケージ化されています。Javaプログラムの実行に必要なJava SEプラットフォームの要素を含み、エンドユーザー向けのJava Runtime Environment(JRE)と、ソフトウェア開発者向けのJava Development Kit (JDK)です。JDKには、 JavaコンパイラJavadocJarデバッガなどの開発ツールが含まれています。Oracleは、高性能なJava動的コンパイラおよびインタープリタである GraalVMもリリースしています。

OpenJDKは、GNU GPLライセンスに基づくJava SE実装の1つです。この実装は、SunがJavaソースコードをGPLで公開し始めたことに始まります。Java SE 7以降、OpenJDKは公式のJavaリファレンス実装となっています。

Javaの目標は、Javaのすべての実装に互換性を持たせることです。歴史的に、SunのJavaブランド使用に関する商標ライセンスは、すべての実装に互換性を持たせることを要求しています。これは、Microsoftの実装がJavaリモートメソッド呼び出し(RMI)やJavaネイティブインターフェース(JNI)をサポートしておらず、独自のプラットフォーム固有の機能を追加しているとしてSunが主張したため、 Microsoftとの法廷闘争に発展しました。Sunは1997年に訴訟を起こし、2001年に2000万ドルの和解金と、Sunからライセンス条件を強制執行する裁判所命令を勝ち取りました。[ 88 ]その結果、MicrosoftはWindowsにJavaを同梱しなくなりました。

プラットフォームに依存しないJavaはJava EEに不可欠であり、実装の認定にはさらに厳格な検証が必要です。この環境により、移植性の高いサーバーサイドアプリケーションが実現します。

Javaプラットフォーム外での使用

Java プログラミング言語では、コンパイルされたプログラムを実行するためにソフトウェア プラットフォームが必要です。

OracleはJavaで使用するためのJavaプラットフォームを提供しています。Android SDKは代替ソフトウェアプラットフォームであり、主に独自のGUIシステムを備えた Androidアプリケーションの開発に使用されます。

アンドロイド

Java言語はオープンソースのモバイルオペレーティングシステムであるAndroidの重要な柱である。Linuxカーネル上に構築されたAndroidは主にC言語で書かれているが、Android SDKはAndroidアプリケーションのベースとしてJava言語を使用しているが、標準のGUI、SE、ME、またはその他の確立されたJava標準は使用していない。[ 89 ] Android SDKがサポートするバイトコード言語はJavaバイトコードと互換性がなく、スマートフォンタブレットコンピュータなどの低メモリデバイス向けに最適化された独自の仮想マシン上で実行される。Androidのバージョンに応じて、バイトコードはDalvik仮想マシンによって解釈されるか、 Androidランタイムによってネイティブコードにコンパイルされる。

AndroidはJava SE標準ライブラリを完全には提供していませんが、Android SDKにはその大部分のサブセットの独立した実装が含まれています。Android SDKはJava 6と一部のJava 7機能をサポートしており、標準ライブラリ(Apache Harmony)と互換性のある実装を提供しています。

論争

AndroidにおけるJava関連技術の使用は、OracleとGoogleの間の法廷闘争につながった。2012年5月7日、サンフランシスコの陪審は、APIが著作権で保護され得るならば、GoogleはAndroidデバイスでJavaを使用することでOracleの著作権を侵害したとの評決を下した。[ 90 ]ウィリアム・アルサップ地方判事は2012年5月31日、APIは著作権で保護されないとの判決を下したが、[ 91 ]これは2014年5月に連邦巡回控訴裁判所によって覆された。[ 92 ] 2016年5月26日、地方裁判所はGoogleに有利な判決を下し、AndroidにおけるJava APIの著作権侵害はフェアユースを構成するとの判決を下した。[ 93 ] 2018年3月、この判決は控訴裁判所によって覆され、損害賠償を決定する訴訟はサンフランシスコの連邦裁判所に差し戻された。[ 94 ]グーグルは2019年1月、控訴裁判所がオラクルに有利な判決を下した2つの判決に異議を唱えるため、米国最高裁判所上告状 請求を申し立てた。 [ 95 ] 2021年4月5日、最高裁判所は6対2でグーグルに有利な判決を下し、Java APIの使用はフェアユースとみなされるべきだとした。しかし、最高裁判所はAPIの著作権保護の適格性について判断することを拒否し、代わりに「議論のために」JavaのAPIが著作権保護の適格性があると判断することで判決を下すことを選択した。[ 96 ]

参照

参考文献

  1. ^ Binstock, Andrew (2015年5月20日). 「Javaの20年間のイノベーション」 . Forbes . 2016年3月14日時点のオリジナルよりアーカイブ。2016年3月18日閲覧。
  2. ^ 「JDK 25」
  3. ^ a b c dバーバラ・リスコフ、ジョン・ガッタッグ共著(2000). 『Javaによるプログラム開発 ― 抽象化、仕様記述、そしてオブジェクト指向設計』 米国、アディソン・ウェスレー社. ISBN 978-0-201-65768-5
  4. ^ Chaudhary, Harry H. (2014年7月28日). 「Cracking The Java Programming Interview :: 2000+ Java Interview Que/Ans」 . 2023年9月29日時点のオリジナルよりアーカイブ2016年5月29日閲覧。
  5. ^ Java 5.0では、類似の(そして競合する) C#言語で導入されたいくつかの新しい言語機能(拡張forループオートボクシング可変引数アノテーション)が追加されました。 [1] 2011年3月19日アーカイブ、 Wayback Machine [2] 2006年1月7日アーカイブ、 Wayback Machine
  6. ^ Gosling, James; McGilton, Henry (1996年5月). 「Java言語環境」 . 2014年5月6日時点のオリジナルよりアーカイブ2014年5月6日閲覧。
  7. ^ Gosling, James; Joy, Bill; Steele, Guy; Bracha, Gilad. 「Java言語仕様 第2版」2011年8月5日時点のオリジナルよりアーカイブ2008年2月8日閲覧。
  8. ^ 「プログラミング言語AZ集:Modula-3」 Computerworld. 2009年1月5日時点のオリジナルよりアーカイブ。 2010年6月9日閲覧
  9. ^ニクラウス・ヴィルトは、 2005年9月にモスクワの工科博物館で行われた講演など、数多くの公の場でこのように述べている(ロシア語による独立した直接の証言が複数存在し、例えば、音声録音があるものもある:エレナ・フィリッポワ(2005年9月22日)「モスクワの工科博物館でのニクラウス・ヴィルトの講演」)2020年12月1日時点のオリジナルよりアーカイブ2011年11月20日閲覧。)、Sun Java 設計チームが Java リリースの数年前に Oberon コンパイラーのソースのライセンスを取得し、それを調査したところ、(相対的に) コンパクトであること、型の安全性があること、ガベージ コレクションがあること、クラスの多重継承がないことがわかったことなど、これらの主要な全体的な設計特徴はすべて Java と Oberon で共有されています。
  10. ^パトリック・ノートンは、Objective-CがJavaプログラミング言語の設計に強い影響を与えたと述べ、注目すべき直接的な派生としてはJavaインターフェース(Objective-Cのプロトコルから派生)とプリミティブラッパークラスが挙げられると述べている。 [3] 2011年7月13日アーカイブ、 Wayback Machine
  11. ^ TechMetrix Research (1999). 「Javaの歴史」(PDF) . Javaアプリケーションサーバーレポート. 2010年12月29日時点のオリジナル(PDF)からのアーカイブ。このプロジェクトはgreenという名前で進められ、言語はUCSD Pascalの古いモデルに基づいており、解釈型コードの生成が可能であった。
  12. ^ 「ジェームズ・ゴスリングとの対話」 ACM Queue、第2巻、第5号、Association for Computing Machinery、2004年8月31日。2015年7月16日時点のオリジナルよりアーカイブ。 2010年6月9日閲覧
  13. ^ Java言語チーム。Microsoftの「デリゲート」について(ホワイトペーパー)。JavaSoft、Sun Microsystems, Inc.。2012年6月27日時点のオリジナルからのアーカイブ。1996年夏、Sunは現在のAWTのイベントモデルとJavaBeansコンポーネントアーキテクチャの前身となるものを設計していました。Borlandはこのプロセスに大きく貢献しました。私たちはDelphi Object Pascalを綿密に調査し、Javaプログラミング言語とそのAPIとの相互作用を理解するために、バインドメソッド参照の実用的なプロトタイプを構築しました。
  14. ^ 「Chapel spec (Acknowledgements)」(PDF) . Cray Inc. 2015年10月1日. 2016年2月5日時点のオリジナルよりアーカイブ(PDF) . 2016年1月14日閲覧
  15. ^ 「Gambasドキュメントの紹介」。Gambasウェブサイト。2017年10月9日時点のオリジナルよりアーカイブ2017年10月9日閲覧。
  16. ^ 「Facebook Q&A: Hack が PHP の世界に静的型付けをもたらす」 InfoWorld 2014年3月26日。2015年2月13日時点のオリジナルよりアーカイブ2015年1月11日閲覧。
  17. ^ “Write once, run everywhere?” . Computer Weekly . 2002年5月2日. 2021年8月13日時点のオリジナルよりアーカイブ2009年7月27日閲覧。
  18. ^ a b c「1.2 Javaプログラミング言語の設計目標」 Oracle、1999年1月1日。2013年1月23日時点のオリジナルよりアーカイブ2013年1月14日閲覧。
  19. ^ Melanson, Mike (2022年8月9日). 「Don't call it a comeback: Why Java is still champ」 . GitHub . 2023年8月25日時点のオリジナルよりアーカイブ。 2023年10月15日閲覧
  20. ^ 「トッププログラミング言語」 . The State of the Octoverse . GitHub . 2023年8月2日時点のオリジナルよりアーカイブ2023年10月15日閲覧。
  21. ^ McMillan, Robert (2013年8月1日). 「Javaは勢いを失いつつあるのか?」 . Wired . 2017年2月15日時点のオリジナルよりアーカイブ2023年10月15日閲覧。
  22. ^ Byous, Jon (1998年頃). 「Javaテクノロジー:初期」 . Sun Developer Network . Sun Microsystems . 2005年4月20日時点のオリジナルよりアーカイブ。 2005年4月22日閲覧
  23. ^オブジェクト指向プログラミング「Javaテクノロジーの歴史」。Sun Developer Network。1995年頃2010年2月10日時点のオリジナルよりアーカイブ2010年4月30日閲覧。
  24. ^ Murphy, Kieron (1996年10月4日). 「それで、なぜ彼らはJavaと呼ぶことにしたのか?」 . JavaWorld . 2020年7月13日時点のオリジナルよりアーカイブ。 2020年7月13日閲覧
  25. ^カブツ、ハインツ「 Once Upon an Oak」 2007年4月13日アーカイブ、 Wayback Machineにて。アルティマ。2007年4月29日閲覧。
  26. ^ 「JAVASOFT SHIPS JAVA 1.0」 。 2007年3月10日時点のオリジナルよりアーカイブ2018年5月13日閲覧。
  27. ^ 『Javaによるオブジェクト指向プログラミング:基礎と応用』 Tata McGraw-Hill Education、34ページ。
  28. ^ "JSG – Java Study Group" . open-std.org . 2006年8月25日時点のオリジナルよりアーカイブ。 2006年8月2日閲覧
  29. ^ 「なぜJavaは2度標準化されなかったのか」(PDF)2014年1月13日時点のオリジナルよりアーカイブ(PDF) 。 2018年6月3日閲覧
  30. ^ 「ECMAとは何か、そしてなぜMicrosoftが関心を持つのか」 ZDNet 2014年5月6日時点のオリジナルよりアーカイブ2014年5月6日閲覧
  31. ^ 「Java Community Processウェブサイト」 Jcp.org、2010年5月24日。2006年8月8日時点のオリジナルよりアーカイブ2010年6月9日閲覧。
  32. ^ 「JAVAONE: Sun – Javaの大部分はオープンソース化されている」 GrnLight.net。2014年5月27日時点のオリジナルよりアーカイブ。 2014年5月26日閲覧
  33. ^ 「SunのJavaエバンジェリストとしての進化する役割」 O'Reilly Media . 2010年9月15日時点のオリジナルよりアーカイブ2009年8月2日閲覧。
  34. ^ 「OracleとJava」 . oracle.com . Oracle Corporation. 2010年1月31日時点のオリジナルよりアーカイブ2010年8月23日閲覧。Oracleは1995年のJava登場以来、Javaの主要かつ実質的な支持者であり、参加と透明性のあるコミュニティの育成に絶え間なく尽力することで、Javaテクノロジーの管理者としての新たな役割を担っています。
  35. ^ Gosling, James (2010年4月9日). 「Time to move on...」On a New Road . 2010年11月5日時点のオリジナルよりアーカイブ。 2011年11月16日閲覧
  36. ^トピック、Dalibor。「プラグインフリーのWebへの移行」2016年3月16日時点のオリジナルよりアーカイブ。 2016年3月15日閲覧
  37. ^ 「Javaテクノロジーについて学ぶ」 Oracle。2011年11月24日時点のオリジナルよりアーカイブ2011年11月21日閲覧。
  38. ^ 「システムから古いバージョンのJavaをアンインストールする必要があるのはなぜですか?」 Oracle。2018年2月12日時点のオリジナルよりアーカイブ2021年9月24日閲覧。
  39. ^ 「Oracle Java SE サポートロードマップ」。Oracle。2021年9月13日。2021年9月19日時点のオリジナルよりアーカイブ2021年9月18日閲覧。
  40. ^ “Temurin™ Support; Adoptium” . adoptium.net . 2024年3月29日時点のオリジナルよりアーカイブ2024年3月29日閲覧。
  41. ^ "JAVASOFT SHIPS JAVA 1.0" . sun.com . 2007年3月10日時点のオリジナルよりアーカイブ2008年2月5日閲覧。
  42. ^ Chander, Sharat. 「Introducing Java SE 11」 . oracle.com . 2018年9月26日時点のオリジナルよりアーカイブ。 2018年9月26日閲覧
  43. ^ Chander, Sharat (2020年9月15日). 「Java 15の到来!」 . Oracle . 2020年9月16日時点のオリジナルよりアーカイブ2020年9月15日閲覧。
  44. ^ “JDK 21” . openjdk.org . 2023年9月20日時点のオリジナルよりアーカイブ2023年9月20日閲覧。
  45. ^ 「JDK 24」
  46. ^ 「JDK 25」
  47. ^ 「Java Cardの概要」 . Oracle Technology Network . Oracle. 2015年1月7日時点のオリジナルよりアーカイブ2014年12月18日閲覧。
  48. ^ 「Java Platform, Micro Edition (Java ME)」 . Oracle Technology Network . Oracle. 2015年1月4日時点のオリジナルよりアーカイブ2014年12月18日閲覧。
  49. ^ 「Java SE」 . Oracle Technology Network . Oracle. 2014年12月24日時点のオリジナルよりアーカイブ2014年12月18日閲覧。
  50. ^ 「Java Platform, Enterprise Edition (Java EE)」 . Oracle Technology Network . Oracle. 2014年12月17日時点のオリジナルよりアーカイブ2014年12月18日閲覧。
  51. ^ “Deep Dive Into the New Java JIT Compiler – Graal | Baeldung” . www.baeldung.com . 2021年8月6日. 2021年10月28日時点のオリジナルよりアーカイブ2021年10月13日閲覧。
  52. ^ 「JVM(Java仮想マシン)はプラットフォーム依存ですか、それともプラットフォーム非依存ですか? JVMを使用し、Javaを翻訳言語とすることの利点は何ですか?」プログラマーインタビュー。2015年1月19日時点のオリジナルよりアーカイブ。 2015年1月19日閲覧
  53. ^ a b Jelovic, Dejan. 「なぜJavaは常にC++より遅いのか」 。 2008年2月11日時点のオリジナルよりアーカイブ2008年2月15日閲覧。
  54. ^ Hundt, Robert. 「C++/Java/Go/Scalaにおけるループ認識」(PDF)2011年11月16日時点のオリジナルよりアーカイブ(PDF) 。 2012年7月12日閲覧
  55. ^ 「SymantecのJust-In-Time JavaコンパイラがSun JDK 1.1に統合される」 。 2010年6月28日時点のオリジナルよりアーカイブ2009年8月1日閲覧。
  56. ^ Salcic, Zoran; Park, Heejong; Teich, Jürgen; Malik, Avinash; Nadeem, Muhammad (2017年7月22日). 「Noc-HMP: SystemJで設計された組み込みシステム向けヘテロジニアスマルチコアプロセッサ」. ACM Transactions on Design Automation of Electronic Systems . 22 (4): 73. doi : 10.1145/3073416 . ISSN 1084-4309 . S2CID 11150290 .  
  57. ^ a b c Bloch 2018、p. 26-28、§項目7:廃止されたオブジェクト参照を削除する。
  58. ^ "NullPointerException" . Oracle. 2014年5月6日時点のオリジナルよりアーカイブ2014年5月6日閲覧。
  59. ^ 「Javaにおける例外」 Artima.com。2009年1月21日時点のオリジナルよりアーカイブ2010年8月10日閲覧。
  60. ^ 「システム(Java SE 25およびJDK 25)」 . Oracle . 2026年1月14日閲覧{{cite web}}: CS1 maint: url-status (リンク)
  61. ^ Walter, A. (2010). 安全性が重要なプロジェクトにおけるJavaアプリケーションの認証に向けて. Proceedings of Embedded Real-Time Software and Systems, ERTS2 , 1-7.
  62. ^ 「Java HotSpot™仮想マシンのパフォーマンス強化」 Oracle.com。2017年5月29日時点のオリジナルよりアーカイブ2017年4月26日閲覧。
  63. ^ 「演算子オーバーロード(C# vs Java)」 . C# for Java Developers . Microsoft. 2015年1月7日時点のオリジナルよりアーカイブ。 2014年12月10日閲覧
  64. ^ 「状態、実装、および型の多重継承」。Javaチュートリアル。Oracle。2014年11月9日時点のオリジナルよりアーカイブ。 2014年12月10日閲覧
  65. ^ Krill, Paul (2025年9月16日). 「JDK 25: Java 25の新機能」 . InfoWorld . 2025年10月9日閲覧
  66. ^ Pressler, Ron; Laskey, Jim; Bierman, Gavin (2025年7月11日). 「JEP 512: Compact Source Files and Instance Main Methods」 . OpenJDK . 2025年10月9日閲覧
  67. ^ 「非推奨のAPI、機能、およびオプション」。Oracle。2019年6月19日時点のオリジナルよりアーカイブ。 2019年5月31日閲覧
  68. ^ 「アプレット(Java Platform SE 7)」 .ドキュメント. Oracle. 2020年8月2日時点のオリジナルよりアーカイブ。 2020年5月1日閲覧
  69. ^ 「JSPページとは- Java EE 5チュートリアル」。docs.oracle.com 2020年8月2日時点のオリジナルよりアーカイブ。 2020年5月1日閲覧
  70. ^ 「Trail: JFC/Swingを使用したGUIの作成(Javaチュートリアル)」 . docs.oracle.com . 2020年4月29日時点のオリジナルよりアーカイブ。 2020年5月1日閲覧
  71. ^ 「JDK 11から削除されたJavaFX 11はスタンドアロンモジュールとして登場」 InfoWorld 2018年9月20日。2020年10月14日時点のオリジナルよりアーカイブ2020年10月13日閲覧。
  72. ^ 「JavaFX入門:Hello World、JavaFXスタイル」 . J​​avaFX 2チュートリアルおよびドキュメント. Oracle. 2020年8月2日時点のオリジナルよりアーカイブ2020年5月1日閲覧。
  73. ^ 「JavaとScalaの型システムは不健全だ」(PDF)2016年11月28日時点のオリジナルよりアーカイブ(PDF) 。 2017年2月20日閲覧
  74. ^ Arnold, Ken (2005年6月27日). 「ジェネリックは有害と考えられる」 . java.net. 2007年10月10日時点のオリジナルよりアーカイブ2015年9月10日閲覧。
  75. ^ Owens, Sean R. 「Javaとunsigned int、unsigned short、unsigned byte、unsigned longなど(あるいはむしろその欠如)」 。 2009年2月20日時点のオリジナルよりアーカイブ。 2011年7月4日閲覧
  76. ^ Kahan, William (1998年3月1日). 「Javaの浮動小数点演算があらゆる場所で誰に害を及ぼすのか – ACM 1998 Workshop on Java (スタンフォード)」(PDF) . カリフォルニア大学バークレー校 電気工学・コンピュータサイエンス学科. 2012年9月5日時点のオリジナルよりアーカイブ(PDF) . 2011年6月4日閲覧
  77. ^ “Have you checked the Java?” 2012年9月21日時点のオリジナルよりアーカイブ。 2011年12月23日閲覧
  78. ^ Cadenhead, Rogers (2017年11月20日)、「Javaプログラムの仕組みを理解する」、2021年8月13日時点のオリジナルよりアーカイブ、 2019年3月26日閲覧。
  79. ^ Woolf, Nicky (2016年5月26日). 「Google、Androidコードの著作権をめぐるOracleとの6年間の法廷闘争に勝利」 . The Guardian . ISSN 0261-3077 . 2019年3月26日時点のオリジナルよりアーカイブ。 2019年3月26日閲覧 
  80. ^ a b Bloch 2018、pp. 1–4、§ 1 はじめに。
  81. ^ "java.nio (Java プラットフォーム SE 8)" . docs.oracle.com
  82. ^ 「Java ネットワーク。docs.oracle.com
  83. ^ 「HttpClient (Java SE 11 & JDK 11)」 . docs.oracle.com .
  84. ^ 「Collections Frameworkの概要」 . Javaドキュメント. Oracle. 2014年12月31日時点のオリジナルよりアーカイブ2014年12月18日閲覧。
  85. ^ 「Java セキュリティ概要」 . Java ドキュメント. Oracle. 2015年1月3日時点のオリジナルよりアーカイブ2014年12月18日閲覧。
  86. ^ 「Trail: 国際化」 . Javaチュートリアル. Oracle. 2014年12月31日時点のオリジナルよりアーカイブ2014年12月18日閲覧。
  87. ^ 「JavadocツールのDocコメントの書き方」 Oracle Technology Network Oracle. 2014年12月18日時点のオリジナルよりアーカイブ。 2014年12月18日閲覧
  88. ^ Niccolai, James (2001年1月24日). 「SunとMicrosoft、Java訴訟で和解」 . JavaWorld . IDG News Service . 2020年7月14日時点のオリジナルよりアーカイブ2020年7月13日閲覧。
  89. ^ van Gurp, Jilles (2007年11月13日). 「Google Android: 第一印象と批判」 . Javalobby . 2008年8月28日時点のオリジナルよりアーカイブ. 2009年3月7日閲覧.率直に言って、Googleがなぜ既存の膨大な実装を無視しようとしているのか理解できません。これは「自社開発ではない」という悪質な例のように思えます。最終的には、普及を遅らせることになるでしょう。モバイルの世界には既にJavaプラットフォームが多すぎるのに、これはまた別の問題です。
  90. ^ Mullin, Joe (2012年5月7日). 「Google、Oracle裁判で著作権侵害で有罪、今後は法的に困難な事態も」 . Law & Disorder . Ars Technica. 2012年5月8日時点のオリジナルよりアーカイブ。 2012年5月8日閲覧
  91. ^ Mullin, Joe (2012年5月31日). 「GoogleがAPI訴訟で重要な判決を勝ち取る、Oracleの訴訟は壊滅的」 Ars Technica . 2017年3月12日時点のオリジナルよりアーカイブ。 2012年6月1日閲覧
  92. ^ Rosenblatt, Seth (2014年5月9日). 「Java特許控訴で、裁判所はAndroidを巡るOracleの主張を認める」 . CNET . 2014年5月10日時点のオリジナルよりアーカイブ2014年5月10日閲覧。
  93. ^ Mullin, Joe (2016年5月26日). 「GoogleがOracleに勝つ ― AndroidはJava APIを「公正に利用」」Ars Technica . 2017年1月20日時点のオリジナルよりアーカイブ2016年5月26日閲覧
  94. ^ Farivar, Cyrus (2018年3月27日) .「GoogleによるJava APIパッケージの使用は不公平だった」と控訴裁判所が判決。Ars Technica。2019年9月24日時点のオリジナルよりアーカイブ。2019年8月6日閲覧。
  95. ^ Lee, Timothy (2019年4月23日). 「Google、API著作権に関する破滅的な判決を最高裁に却下するよう求める」 Ars Technica . 2019年4月23日時点のオリジナルよりアーカイブ。 2019年4月23日閲覧
  96. ^ Google LLC v. Oracle America, Inc 593 US ____ (2021)」(PDF)2021年4月5日時点のオリジナルよりアーカイブ(PDF) 。 2021年4月6日閲覧

参考文献