Java (言語)について詳しく解説

導入

ジャワ
Java ロゴ.svg


に登場1995 年 5 月 23 日
著者サン・マイクロシステムズ
パラダイムオブジェクト指向、構造化された命令型プログラミング
タイピング静的、強い、確かな、主格
影響を受けたObjective-C 、C++、 Smalltalk 、Eiffel
影響を与えたC#、D、J#、エイダ 2005、ガンバス
実装JVMのリスト
オペレーティング·システムマルチプラットフォーム
ライセンスGNU GPL
Webサイトwww.java.com

Java言語は、ビル ジョイ(1982 年サンマイクロシステムズの共同創設者) の支援を受けて、サン マイクロシステムズの従業員であるジェームス ゴズリングとパトリック ノートンによって作成されたオブジェクト指向コンピュータ プログラミング言語であり、1995 年 5 月 23 日にSunWorldで正式に発表されました。

プレビュー

Java 言語の主な特徴は、Java 言語で作成されたソフトウェアは、ほとんどまたはまったく変更を加えずに、 UNIXWindowsMac OSまたは GNU/Linux などの複数のオペレーティング システム間で非常に簡単に移植できることです。 Java で開発されたアプリケーションの移植性を保証するプラットフォームです。

この言語は主に、コンピューター科学者によって広く使用されている C++ 言語の構文を使用します。ただし、Java では、ポインタや参照などの C++ の最も微妙でわかりにくい概念が取り除かれ、多重継承がインターフェイスの実装に置き換えられました。設計者はオブジェクト指向のアプローチを好んだため、Java ではプリミティブ型 (整数、浮動小数点数など) を除くすべてがオブジェクトになります。

Java を使用すると、クライアント/サーバーアプリケーションを開発できます。クライアント側では、アプレットがこの言語の悪名のもとです。アプレットのサーバー版であるサーブレット、そして最近ではPHP 、ASP、および ASP.NET を置き換えることができる JSP (JavaServer Pages) のおかげで、Java がビジネス環境での地位を確立したのは特にサーバー側です。

Java は、オペレーティング システム (JavaOS)、 開発環境(eclipse/JDK)、仮想マシン (MSJVM、JRE)、マルチプラットフォーム アプリケーション (JVM)、インターフェースグラフィックス (AWT/Swing) を備えた Java ライブラリ (J2ME) を生み出しました。 Java アプリケーション (ソフトウェア、サーブレット、アプレット)。 Java コードの移植性は、仮想マシンによって保証されます。 JRE – バイトコードのネイティブ コードへの変換と実行を実行する仮想マシン – は、複数のコンパイル プロセス (オンザフライ/バイトコード、ネイティブ) をサポートします。移植性は、各 OS への JVM の移植の品質に依存します。

今日、Java ( JavaFxの形式) は、インターネットと携帯電話の両方で、より高度な機能、特にインターフェイスを提供するアプリケーションである RIA (リッチインターネットアプリケーション) アプリケーションの作成に新たな分野を見出しています。 JavaFx 言語は、Sun Microsystems の管理下にある Java から派生したアジャイル言語で、Java の移植性と、Java 言語ですでに利用可能な膨大なライブラリを利用しています。

哲学

Java 言語が作成されたとき、この言語は次の 5 つの目標を満たさなければならないと決定されました。

  1. シンプルでオブジェクト指向で親しみやすい。
  2. 丈夫で安全。
  3. 実行に使用されるマシンから独立しています。
  4. 非常に効率的です。
  5. インタープリタ型、マルチタスク型、動的型

オブジェクト指向で使い慣れた言語

最初の特徴であるオブジェクト指向 (「OO」) と親しみやすさは、プログラミングと言語設計の方法、および Java で書かれたプログラムが C++ で書かれたプログラムによく似ているという事実を指します。

オブジェクト指向 という表現にはいくつかの解釈がありますが、このタイプの開発における重要な考え方は、さまざまなタイプのデータが、このデータに対して実行できるさまざまな操作に直接関連付けられている必要があるということです。その結果、データ ( Propertiesと呼ばれる) とそれを操作するコード ( Methodsと呼ばれる) は、 Object Classと呼ばれる単一のエンティティに結合されます。コードは論理的に小さな一貫したエンティティに分割されるため、本質的にモジュール化されており、保守が簡単になり、再利用も容易になります。

継承などの他のメカニズムを使用すると、内部機能を知らなくても、以前に独自のプログラムで作成したクラスのすべての特性を活用できます。インターフェイスのみが表示されます (インターフェイスは、関連するコードを提供せずにプロパティとメソッドを記述します)。 Java では、インターフェイスでない限り、いくつかの親クラスからの継承の概念を禁止しています。

この言語のバージョン 1.5 では、C++ 言語テンプレートや Objective Caml ファンクターと似た (ただし異なる) ポリモーフィズム メカニズムであるジェネリックが追加されました。ジェネリックを使用すると、コンテナ (リスト、ツリーなど) などのオブジェクトのプロパティをより簡単かつ安全な方法で表現できます。リストのタイプは、リストに含まれるオブジェクトのタイプに関連して一般的に考慮されます。

ガベージコレクターの仕組み

この要素はプログラムの堅牢性とパフォーマンスに貢献し、ガベージ コレクターはプログラムの実行中に定期的かつ自動的に呼び出されます。マルチプロセッサおよび/またはマルチコア システムでは、プログラムの実行の中断を最小限に抑えるために、複数の低優先度のスレッドも使用されます。さらに、プログラマは必要に応じて、 System.gc()メソッドを使用してガベージ コレクターを開始することを提案できます。

C++ などの言語に対する繰り返しの不満は、メモリ管理を手動でプログラムしなければならないという面倒な作業です。 C++ では、オブジェクトを作成するためにプログラムによって割り当てられたメモリは、オブジェクトが破棄されると (ほとんどの場合、 delete演算子の明示的な呼び出しによって) 割り当てが解除されます。プログラマが割り当て解除のコーディングを忘れると、「メモリ リーク」が発生し、プログラムの消費量が増加します。さらに悪いことに、プログラムが誤って割り当て解除を数回要求したり、割り当て解除を要求した後にメモリ領域を使用したりすると、プログラムが不安定になってクラッシュする可能性が高くなります。

Java では、こうした問題の多くはガベージ コレクションによって回避されます。作成された各オブジェクトに必要なメモリ空間は、この用途のために予約されたメモリヒープに割り当てられます。その後、プログラムはヒープ内の参照を使用して各オブジェクトにアクセスできるようになります。オブジェクトに到達するための参照がなくなると、オブジェクトはアクセス不能になったため、ガベージ コレクターによって自動的に破棄され、メモリが解放され、メモリ リークが防止されます。

ガベージ コレクターはマーク アンド スイープアルゴリズムを使用し、相互参照オブジェクトまたは参照ループの複雑なケース (二重リンク リストのケースなど) を管理できるようにします。実際には、プログラムがオブジェクトにアクセスしなくなったにもかかわらず、ガベージ コレクターがそのオブジェクトがまだ有用であると判断するプログラミング エラーのケースが依然として存在しますが、全体として、ガベージ コレクターは Java でのオブジェクトの破棄をより簡単かつ安全にします (コード内の適切な場所に削除演算子の呼び出しを配置する必要があります)。

プラットフォームの独立性

プラットフォームに依存しないということは、Java で書かれたプログラムが異なるハードウェア アーキテクチャでもまったく同じように動作することを意味します。特定のアーキテクチャ上で開発を実行し、他のすべてのアーキテクチャ上でアプリケーションを実行できます。

この結果は、バイトコード(より正確にはJava バイトコード、Java プラットフォーム固有の機械語) を取得するためにソース コードを「半分」コンパイルする Java コンパイラーによって得られます。次に、コードは Java 仮想マシン (JVM) 上で解釈されます。JVM は、Java バイトコードを解釈して実行する、ターゲット マシン専用に作成されたプログラムです。さらに、ホスト マシンの特定の要素 (グラフィックス、マルチスレッド、ネットワーク プログラミングなど) に、すべてのアーキテクチャでまったく同じ方法でアクセスできるようにするための標準ライブラリが提供されています。コンパイルの最初の初期段階が明示的に存在する場合でも、Java バイトコードは、ジャストインタイム(JIT)コンパイラーによってオンザフライで解釈または変換されます。

Java をターゲット マシンのネイティブオブジェクト コードに直接コンパイルする Java コンパイラもあります (GCJ など)。中間バイトコード フェーズは削除されますが、これらのコンパイラによって生成される最終コードは単一のアーキテクチャ上でのみ実行できます。

Sun の Java ライセンスでは、すべての実装に互換性がなければならないと規定されています。これは、Microsoft の実装が RMI および JNI インターフェイスをサポートしておらず、Sun の初期プラットフォームと比較してプラットフォーム固有の要素があることを Sun が発見した後、 Microsoftに対する訴訟につながりました。 Sun には損害賠償 (2,000 万ドル) が認められ、裁判所命令により Sun のライセンス条件はさらに強化されました。これに応じて、Microsoft は自社プラットフォームでの Java サポートを停止し、Windows の最新バージョンでは、プラグインを追加しない限りInternet Explorer はJava アプレットをサポートしません。ただし、Sun は、さまざまな Microsoft プラットフォームで Java ランタイム環境を無料で利用できるようにしています。

言語の初期の実装では、移植性を実現するためにインタープリタ型仮想マシンを使用していました。これらの実装では、 Cまたは C++ で書かれたプログラムよりも実行速度が遅いプログラムが生成されたため、この言語はパフォーマンスが悪いという評判を受けました。 Java 仮想マシン (JVM) の新しい実装では、さまざまな手法を使用して、以前よりもはるかに高速にプログラムを生成します。

1 つ目の手法は、従来のコンパイラーのようにネイティブ コードに直接コンパイルし、バイトコード フェーズを完全に削除することです。これにより、優れたパフォーマンスが得られますが、移植性が犠牲になります。ジャスト イン タイム (JIT) コンパイルと呼ばれる別の手法では、プログラムの起動段階でバイト コードをネイティブ コードに変換します。より高度な仮想マシンの中には、動的再コンパイルを使用するものもあります。この際、仮想マシンはプログラムの動作を分析し、プログラムの特定の部分を選択的に再コンパイルします。動的再コンパイルは、ターゲット環境と使用されるクラスの知識に基づいて最適化できるため、静的コンパイルよりも優れた結果が得られます。 JIT コンパイルと動的再コンパイルにより、Java は移植性を損なうことなくネイティブ コードの速度を活用できるようになります。

移植性は技術的に達成するのが難しい目標であり、この分野における Java の成功には賛否両論があります。確かに、多くのターゲット マシンで正しく実行される Java プラットフォーム用のプログラムを作成することは可能ですが、多数のプラットフォームで小さなエラーや不一致が発生するため、Sun のスローガン「一度書けば、どこでも実行できる」が一度書けば、どこでも実行できる」に誤用されてしまいましたどこでもデバッグ」!

ただし、Java のプラットフォーム独立性は、組み込み Java環境を使用するOSGi上の組み込みシステムだけでなく、Web サービス、サーブレット、Java Bean などのサーバー側アプリケーションでも成功します。

安全なリモートコード実行

Java プラットフォームは、リモート ソースからのコード実行のサポートを提供した最初のシステムの 1 つです。アプレットはユーザーのWeb ブラウザで実行でき、HTTP サーバーからダウンロードされたコードを実行します。アプレットのコードは非常に制限された領域で動作し、ユーザーを誤ったコードや悪意のあるコードから保護します。このスペースは、 security managerと呼ばれるオブジェクトによって区切られます。このようなオブジェクトはローカル コードにも存在しますが、デフォルトでは非アクティブになります。

セキュリティ マネージャー ( SecurityManagerクラス) を使用すると、ローカル システム リソース (ファイル システム、ネットワーク、システム プロパティなど) を使用するための特定の数の承認を定義できます。認可は以下を定義します

  1. アクセサー コード (通常、Web サーバーから送信されるアプレット (おそらく署名付き))。
  2. 関連するローカル リソース (ディレクトリなど)。
  3. 一連の権限 (読み取り/書き込みなど)。

アプレット発行者は、安全なものとしてアプレットにデジタル署名できるように証明書を要求することができ、制限された領域から出てローカル システム リソースにアクセスするための許可を (適切な承認を得て) 与える可能性があります。

  1. Java – aceh
  2. Java (programmeertaal) – afrikaans
  3. ጃቫ – amharique
  4. Luengache de programación Java – aragonais
  5. جافا (لغة برمجة) – arabe
  6. جاڤا – arabe marocain

Java (言語)について詳しく解説・関連動画

サイエンス・ハブ

知識の扉を開け、世界を変える。