Javaとは、プログラミング言語の一つである。Java VMなどの実行環境全体を指す場合もあるが、当記事では前者について扱う。後者についてはJava仮想マシンを参照。
※人によってはJavaScriptと混同している場合があるが、両者に関係はない。
1990年末から開発が始まり、サン・マイクロシステムズ(後にオラクルが吸収)によって1995年に公表されたオブジェクト指向プログラミング言語。 現在はオープンソース化されているが、ライセンスなどはオラクルが管理している。
当初は、Javaで動作する専用のハードウェアも開発し、インターネット家電機器への進出も計画されたが頓挫し、現在はJava VMを介した実行環境がメインとなっている。
他にもいろいろ挫折のあった言語だが、それでも使用プログラマの人口は1,2を争うくらいに多い。また、使用人口が多いため検索するだけで比較的容易に情報が入手できるという言語仕様とは関係ない強みがある。
名称の由来はコーヒー豆の種類であるJavaから。コンピュータを知らない人にとっては風呂釜洗浄剤だったり原人だったり島の名前だったりカレールウだったりする。缶紅茶とかゴダイゴとかが出てきたら立派なおっs(ry
携帯電話(いわゆるガラケー)の開発言語として、2010年あたりからは、Androidスマホの開発言語として注目を集めているが、地味にサーバー用途などの利用も多い。
普通のデスクトップアプリ開発もできるが、実行にJavaのインストールや起動が必要になる。アプレット? ああ、そういうのもあったっけ。
Java仮想マシンを参照。
過去は非常に互換性を重視しようという意図があり、その関係で長らくGenericsが要望されながら搭載が見送られてきた経緯があるが、C#の存在を意識してかJava5(1.5)を境にむしろ互換性を犠牲にしてまで様々仕様を搭載しようとする姿勢に変化している。
文法外の特色としては中間言語+仮想マシン方式であること、ガベージコレクションがあること、ドキュメンテーションコメントの書法を定義していること(JavaDoc)、などがある。
Javaは直接機械語にコンパイルされず、中間言語(バイトコード)にコンパイルされ、バイトコードをJava仮想マシンが各ハードウェアの機械語(ネイティブコード)に変換して実行するという方式をとる。
基本的に「Java仮想マシンさえあればどこでも動く」という移植性の高さから「Write once, run anywhere」と言われる[1]。
ハードウェアに依存しない反面、デバイスドライバなどハードウェアに依存した処理には弱く、C言語との組み合わせが必須となる。もっとも、使用人口が多いおかげで、主だったハードウェアには何らかのサードパーティ製ライブラリが存在してC言語を使わずに何とかなることも多い。
C++に見られる多くの機能を改良して吸収し言語仕様も大幅に改編、さらにC++では標準機能として持てなかった機能を大幅に追加していった。これにより高い汎用性と生産性をアピールすることになった。
シンタックスシュガーが少ないのが特徴でJavaの省略しない文化が表れている。他にもgetter, setterなどのお約束もあいまってコードの長さには定評がある[2]。だが、省略できるということは省略された部分を補うために覚えておくことが増えるということでもあり、学習コストやコードの可読性の観点から省略しないほうが有利な場合もある。また、省略されていないメソッド名を眺めているだけでなんとなく使い方がわかる場合もあるので、省略しないことは必ずしも悪いことではない。[3]
演算子のユーザー定義が認められていないので、BigDecimal(精密十進演算)などで込み入った四則演算をしようとするとaddやmultiplyなどのメソッドが入り乱れて大変なことになる。演算子のユーザー定義を認めた結果ソースコードがよくわからない記号だらけになった言語もあるので、これも悪いことばかりとはいいきれない。
型はプリミティブ型、列挙型(Java 5から導入)、オブジェクト(参照型)に分かれ、プリミティブ型にはboolean, char, int, short, long, float, doubleがある。オブジェクト指向であるにもかかわらずオブジェクトの性質を持たないプリミティブ型があることは、パフォーマンス面でC言語やC++に対抗するため必要なことであったとはいえ、Javaがオブジェクト指向言語として不完全であるといわれる原因にもなっている[4]。修正の予定もないことはない(後述のProject Valhalla)が、実現の目処はたっていない。
よく使われるような機能はJava SE自体に標準ライブラリとして一通り揃っている。
ブラウザでリッチクライアントを実現することが初期の開発理由の一つにあったためか、プログラミング言語としては珍しく発表当初からGUIライブラリが標準ライブラリに含まれている。もっとも、「標準」自体はAWT、Swing(Java 2〜)、JavaFX(Java 8〜)と2回の交代を経験した後、Java11からはJavaFXが標準から外されるなど迷走気味である。
一方で複素数などは標準ライブラリに含まれておらず、前述の演算子のユーザー定義禁止の問題もあわせて、数学や科学分野の計算に向いているとは言いがたい面もある。
Javaの統合開発環境(IDE)としてはEclipseとNetBeansがよく知られている。
EclipseはIBMが、NetBeansはサン・マイクロシステムズ(現オラクル)が開発の主体となって開発したソフトウェアで、どちらもフリーかつオープンソースである。
これらは開発の支援機能を多く備え、生産性向上にも役立つIDEとして有名である。
特にEclipseはJavaに限らずクロスプラットフォームな開発環境においては標準的なIDEとなっていることが多い。
基本的にJavaの開発時にどちらを利用するか迷ったら書籍など情報量の多いEclipseをおすすめする。
ただし、マシン環境が貧弱な場合、NetBeansのほうがより軽いため、こちらを使うほうがいいかもしれない。
標準以外でも、オープンソースの強力なライブラリやフレームワーク群があるのがJavaの特長である。Apache Software Foundationのライブラリ群などがよく知られている。定番とされているものだとApache Ant, Apache Tomcat, Apache Struts, Apache Mavenが挙げられる。
先述のように互換性を重視するため、新しい文法の導入は遅れがちであるが、1.5におけるジェネリクス以外には以下のような変更が実施・予定されている。
本当はJava7に導入される予定だったが、作業が難航しJava6の後に5年ほどあいてしまった(Javaは2年ごとに新しいリリースを出す方針になっている)ため、Java7から外されて2014年3月にJava8で導入された。
これによりラムダ式を用いて関数(メソッド)を引数や戻り値に指定できるようになり、オブジェクト指向言語Javaも晴れて関数型言語の仲間入りを果たした。
これも本当はJava7に導入される予定があったが、Project Lambdaと共にJava8へと延期され、さらにこちらだけはJava9に延期された。なお、Java9のリリースは2016年9月予定だったが、2015年12月に延期が発表され2017年3月となり、2016年10月に再延期されて2017年7月27日予定となり、2017年6月1日にさらに延期されて2017年9月21日のリリースとなった。
文法の変更と言うよりも、ビルドに際してのパッケージ依存関係などの記述方法が変わってモジュール化が促進されるという触れ込みである。ソースコードの互換性は保たれるが、ビルド方法については完全には互換性が保てないため開発者への影響が大きく、根強い反対意見があった。
なお、このバージョンからリファレンス実装とされるOpenJDK等から32ビット版がなくなり64ビット版のみとなった。「Write once, run anywhere」はどこに行ったのだろうか。32ビットOSはnowhereだ(どこでもない)ということなのかもしれない。
2018年3月リリースのJava 10 からローカル変数宣言で左辺の型記述を省略できるようになった。
→ var(Java)参照のこと。
オブジェクト指向言語なのにオブジェクトの規則に従わないプリミティブ型は、特にジェネリクスの導入以降、型引数にプリミティブ型を使えないことによる様々な弊害をもたらしてきた[5]。
Project ValhallaではこのJava誕生時から存在する問題に手をつけようという事のようだ。
次期Javaの目玉機能と噂されているが、Javaの根幹にかかわる問題だけに互換性が犠牲になる可能性[6]が高く、難航が予想される。2018年3月の時点で導入の目処に関する噂が全くないので、Java17のリリースにはやっぱり間に合わなかったので、長期サポート版に導入されるのは早くても20212023年9月以降と思われる。
ちなみにValhallaは北欧神話の主神オーディンの宮殿の一つ。死んだ戦士の魂が集まる場所。果たしてプリミティブ型との戦いで散っていったIT戦士たちの魂は救済されるのか?
2017年9月にOracleからJavaの新しいリリーススケジュールが発表された。
これまで2年毎のリリースという建前(実際には3年以上開くことがほとんど)だったのを、OpenJDKから半年ごとにリリースする方針に切り替えるとのこと。進捗が遅れても毎年3月と9月にリリースし、未完成の部分はリリース延期の理由とならず、リリース内容から除外される。バージョン番号も新規則が導入され、たとえば2018年3月にリリースされたものは、Java18.3となる。
あまり意識されることがなかったが、Javaのリファレンス実装はJava7の時代にOracle JDK(Java Development Kit)からオープンソースのOpenJDKに変更されている。これまでOpenJDKは「本家のJDKから、他社の特許などの大人の事情によりオープンソースに出来ない部分を取り除いたもの」といった位置づけだったが、今回のリリーススケジュールの変更でOracle版とOpenJDK版の違いがはっきりしてきた。
半年ごとのアップデートが大変という人には、5年間のサポート期間があるLTS(Long Term Support)がOracle版のJava仮想マシンで3年毎に提供される(なお、Oracleと契約すればさらに3年間の延長サポートを受けることが可能)。Java 8 はLTS扱いになるが、その次のLTSはJava 11である。
3年以上(Project Jigsawの構想時から数えるなら10年以上)の苦労を重ねてリリースされたJava9はLTSにならず、2018年3月にはJava 10に取って代わられ、わずか半年でその命を終えた。
OpenJDKからのリリースはOracle側がLTSで出すバージョンについても半年のサポート期間しかない。この問題については、Oracleの有償化以降にいくつかのベンダーが無料で使用できるLTSをリリースするようになったため、概ね回避可能になった。
Oracle自身もJava 17から無償で使えるLTSをGPLで提供するようになった。一方で、LTSのリリース間隔を短縮する方針で、3年毎が2年毎になる予定。
これまでJava仮想マシンといえばOracleのJava仮想マシンがデファクトスタンダードで、OpenJDKをわざわざ使用する理由は存在しなかった。しかし今後は、OracleのLTS版で開発したが実行環境がOpenJDKの最新版だったというようなJava仮想マシンのバージョン違いによる障害の増加が懸念される。
この問題については、今後は予めインストールしたJava仮想マシンを使用するのではなく、アプリケーションを構成するときに適合したバージョンのJava仮想マシンを同梱するよう推奨する予定とのこと(Project JigsawによりJava仮想マシンからアプリケーションが使用する部分だけを分離することが容易になったらしい)。JavaのHello Worldは100MB以上あると揶揄される日が来るかもしれない。
上記のようにLTSのJavaでサポートを受けようとするとOracleに支払いをしなければならない(2018年6月のOracle発表によると、個人利用は年30ドル、サーバーでの利用は年300ドル)。つまり、Javaに後方互換性を破壊する変更があればあるほど上記支払いを行う必要がある企業が増えてOracleが儲かる仕組みになっている。
Javaはこれまで互換性を重要視する文化があったが、多大な影響力を持つOracleが自社の利益のためにJavaの互換性を破壊する動機があるということは、オープンソース化されているとはいえ後方互換性の今後に大きな懸念を抱かざるを得ない。
2018年3月にOracleはJavaFXをJava SE 11から削除する方針を発表した。JavaFXはユーザーが伸びなかったことが原因であると思われるので、上記と関係あるかどうかは定かではないが、互換性を維持する文化に変化が出始めているのかもしれない。
2018年6月7日、OpenJDKからJVMに内蔵されていたJavascriptエンジンであるNashornを非推奨にする方針が発表された。OpenJDKからの発表だが、記事はOracle社員によるものなので、実質的にはOracleの方針とも言える。JavaとJavascript両方を動かせるGraalVMに誘導するためとみられるが、やはり後方互換性に対するOracleとJavaの姿勢の変化を感じずにはいられない。
掲示板
131 ななしのよっしん
2024/04/28(日) 18:55:15 ID: 7MisSQjZy3
JavaってクライアントサイドのJavaScriptにそっくりよね、js書ける人なら大満足じゃない?ライブラリーも汎用性もjsより強いしね💪
132 ななしのよっしん
2024/04/28(日) 19:00:29 ID: y9E2gQEqao
ガワだけ似てるけど方向性が違いすぎて
133 ななしのよっしん
2024/04/28(日) 23:40:22 ID: VoTMHrow4h
⚠︎JSはまったく似ていません!⚠︎
サーバーサイドにありがちなVMだけ鍛えてる肝い言語です
提供: 花祭真夏
提供: ふりい
提供: 城猫
提供: まるこお(D)
提供: 連太郎
急上昇ワード改
最終更新:2025/04/13(日) 22:00
最終更新:2025/04/13(日) 21:00
ウォッチリストに追加しました!
すでにウォッチリストに
入っています。
追加に失敗しました。
ほめた!
ほめるを取消しました。
ほめるに失敗しました。
ほめるの取消しに失敗しました。