Java単語

ジャバ
7.1千文字の記事
  • 9
  • 0pt
掲示板へ

Javaとは、プログラミング言語の一つである。Java VMなどの実行環境全体をす場合もあるが、当記事では前者について扱う。後者についてはJava仮想マシンを参照。

※人によってはJavaScriptと混同している場合があるが、両者に関係はない。

概要

https://dic.nicovideo.jp/oekaki/25489.png

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)としてはEclipseNetBeansがよく知られている。

EclipseIBMが、NetBeansはサン・マイクロシステムズ(現オラクル)が開発体となって開発したソフトウェアで、どちらもフリーかつオープンソースである。
これらは開発支援を多く備え、生産性向上にも役立つIDEとして有名である。

特にEclipseはJavaに限らずクロスプラットフォーム開発環境においては標準的なIDEとなっていることが多い。

基本的にJavaの開発時にどちらを利用するか迷ったら書籍など情報量の多いEclipseをおすすめする。
ただし、マシン環境が貧弱な場合、NetBeansのほうがより軽いため、こちらを使うほうがいいかもしれない。

他には有償のものとしてIntelliJ IDEAがある。

開発支援ツール・ライブラリ等

標準以外でも、オープンソースの強ライブラリフレームワーク群があるのがJavaの特長である。Apache Software Foundationのライブラリ群などがよく知られている。定番とされているものだとApache Ant, Apache Tomcat, Apache Struts, Apache Mavenが挙げられる。

バージョン

先述のように互換性を重視するため、新しい文法の導入は遅れがちであるが、1.5におけるジェネリクス以外には以下のような変更が実施・予定されている。

Project Lambda(Java 8)

本当はJava7に導入される予定だったが、作業が難航しJava6の後に5年ほどあいてしまった(Javaは2年ごとに新しいリリースを出す方針になっている)ため、Java7から外されて2014年3月にJava8で導入された。

これによりラムダ式を用いて関数(メソッド)を引数や戻り値に定できるようになり、オブジェクト指向Javaも晴れ関数型言語仲間入りを果たした。

Project Jigsaw(Java 9)

これも本当は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ビット版がなくなりexit64ビット版のみとなった。「Write once, run anywhere」はどこに行ったのだろうか。32ビットOSnowhereだ(どこでもない)ということなのかもしれない。

Local-Variable Type Inference(Java 10)

2018年3月リリースのJava 10 からローカル変数宣言で左辺の記述を省略できるようになった。

var(Java)参照のこと。

Project Valhalla(Java 1721?)

オブジェクト指向なのにオブジェクトの規則に従わないプリミティブは、特にジェネリクスの導入以降、引数プリミティブを使えないことによる様々な弊をもたらしてきた[5]

Project ValhallaではこのJava誕生時から存在する問題に手をつけようという事のようだ。

次期Javaの玉機と噂されているが、Javaの根幹にかかわる問題だけに互換性が犠牲になる可[6]が高く、難航が予想される。2018年3月の時点で導入の処に関する噂が全くないので、Java17のリリースにはやっぱり間に合わなかったので、長期サポート版に導入されるのはくても20212023年9月以降と思われる。

ちなみにValhallaは北欧神話オーディンの宮殿の一つ。死んだ戦士が集まる場所。果たしてプリミティブとの戦いで散っていったIT戦士たちのは救済されるのか?

2018年以降は半年ごとのリリース

2017年9月OracleからJavaの新しいリリーススケジュールexitが発表された。

これまで2年毎のリリースという建前(実際には3年以上開くことがほとんど)だったのを、OpenJDKexitから半年ごとにリリースする方針に切り替えるとのこと。進捗が遅れても毎年3月9月リリースし、未完成の部分はリリース延期の理由とならず、リリース内容から除外される。バージョン番号も新規則が導入され、たとえば20183リリースされたものは、Java18.3となる。

OpenJDKとは

あまり意識されることがなかったが、Javaのリファレンス実装はJava7の時代にOracle JDK(Java Development Kit)からオープンソースOpenJDKに変更されている。これまでOpenJDKは「本家JDKから、他社の特許などの大人の事情によりオープンソースに出来ない部分を取り除いたもの」といった位置づけだったが、今回のリリーススケジュールの変更でOracle版とOpenJDK版の違いがはっきりしてきた。

LTS(Long Term Support)

半年ごとのアップデートが大変という人には、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から償で使えるLTSGPL提供するようになった。一方で、LTSリリース間隔を短縮する方針で、3年毎が2年毎にexitなる予定。

Java仮想マシンは同梱する時代へ?

これまでJava仮想マシンといえばOracleJava仮想マシンがデファクトスタンダードで、OpenJDKをわざわざ使用する理由は存在しなかった。しかし今後は、OracleLTS版で開発したが実行環境OpenJDKの最新版だったというようなJava仮想マシンバージョン違いによる障害の増加が懸念される。

この問題については、今後は予めインストールしたJava仮想マシンを使用するのではなく、アプリケーションを構成するときに適合したバージョンJava仮想マシンを同梱するよう推奨する予定とのこと(Project JigsawによりJava仮想マシンからアプリケーションが使用する部分だけを分離することが容易になったらしい)。JavaのHello World100MB以上あると揶揄される日が来るかもしれない。

Javaの互換性に関する懸念

上記のようにLTSのJavaでサポートを受けようとするとOracleに支払いをしなければならない(2018年6月Oracle発表によると、個人利用は年30ドルサーバーでの利用は年300ドル)。つまり、Javaに後方互換性を破壊する変更があればあるほど上記支払いを行う必要がある企業が増えてOracleかる仕組みになっている。

Javaはこれまで互換性を重要視する文化があったが、多大なを持つOracleが自社の利益のためにJavaの互換性を破壊する動機があるということは、オープンソース化されているとはいえ後方互換性の今後に大きな懸念を抱かざるを得ない。

2018年3月OracleJavaFXをJava SE 11から削除する方針を発表した。JavaFXユーザーが伸びなかったことが原因であると思われるので、上記と関係あるかどうかは定かではないが、互換性を維持する文化に変化が出始めているのかもしれない。

2018年6月7日OpenJDKからJVMに内蔵されていたJavascriptエンジンであるNashornを非推奨にするexit方針が発表された。OpenJDKからの発表だが、記事はOracle社員によるものなので、実質的にはOracleの方針とも言える。JavaとJavascript両方を動かせるGraalVMに誘導するためとみられるが、やはり後方互換性に対するOracleとJavaの姿勢の変化を感じずにはいられない。

関連動画

関連商品

関連コミュニティ

関連項目

脚注

  1. *実際にはそれぞれの環境によって異なることも多々あるために"Write once, debug everywhere"と揶揄されることも多い
  2. *プログラミング言語コードの長さを較するときに同じ内容をJavaで書いた行数の何分の1になるかで較することがしくない。
  3. *2018年3月リリースのJava10からはvarを導入して型推論により変数宣言時のの記述を省略できるようになる。省略できないことはJavaの短所と言われることが多いが、記事で述べているように見方によっては長所でもあるので、この方針変更により残り少ないJavaの特長が失われていくような印を受ける。
  4. *あれ?全てがオブジェクトなんじゃないの?プリミティブは違うの?とか言ってはいけない。何でラッパーとかいる の?Stringはプリミ ティブ?え?違う?  でもイミュータブルなので、プリミティブ的に扱っておk。って、どっち?メソッドあるからオブジェクト??意味わからないです。
     ・・・とか言う会話を新卒と交わし、本気でエリックガンマ手紙を出そうとした2年を見たことのある人間が、少なくとも日本には一人いる。
  5. *たとえばStream<T>のTにintdoubleを入れることができないため、IntStream, DoubleStreamといったを個別に定義しなければならなくなっている。ラッパークラスを用いてStream<Integer>とすることもできるが、パフォーマンスが犠牲になる。Stream<T>だけで済めばいいが、Optional<T>など汎用性が高い定義されるたびにオブジェクトプリミティブで場合分けが必要になる。
  6. *たとえばList<E>ではオーバーロードにより、remove(E object)はListにobjectが含まれていればそれを除外し、remove(int i)はListのi番の要素を除外する。ところがList<int>を認めてしまうとどちらと解釈するのかわからなくなってしまう。

【スポンサーリンク】

  • 9
  • 0pt
記事編集 編集履歴を閲覧

この記事の掲示板に最近描かれたお絵カキコ

この記事の掲示板に最近投稿されたピコカキコ

ピコカキコがありません

Java

121 ななしのよっしん
2020/09/20(日) 12:56:29 ID: zweMPORUGY
Java/JVMサーバーレス&コンテナ時代到来で十年前のYouTube台頭期のFlashみたいな扱いになってきたなー
Adobe Flash帝国HTML5+WebGL+WebAssembly(WASM)連合艦隊に打ち破られ滅亡したけど
Oracle Java/JVM帝国WebAssembly System Interface(WASI)によってWrite once, run anywhereの世になったら緩やかに衰退に向かう気がする
でも辛うじて滅亡は免れて上古の遺産COBOL中古遺産Javaと並び称される存在になりそう
👍
高評価
0
👎
低評価
0
122 ななしのよっしん
2020/11/21(土) 06:24:13 ID: VoTMHrow4h
>>118 >>121
いや分散処理で大規模データ扱うようなところは(新しめの企業だと例えばNETFLIX, SpotifyJVM使いまくりなので言としてはKotlinとかScalaの方がイケてる感じがあるが結局基盤としてJavaが重要なのは変わらんよ
サーバーレスではJVMの起動が遅くて向いていないが
👍
高評価
0
👎
低評価
0
123 ななしのよっしん
2020/11/24(火) 09:21:30 ID: dJRZ/Mgk/e
Cと同じだな
その活躍の場が外から隔離されて立たなくなっただけで、第一線に思いっきり存在している
👍
高評価
0
👎
低評価
0
124 ななしのよっしん
2020/11/24(火) 09:30:50 ID: +r3CVyyiCL
JVM自体は駆逐されるようなものではないからな
👍
高評価
0
👎
低評価
0
125 ななしのよっしん
2021/02/08(月) 03:36:46 ID: og1yqlIG1y
>Java晴れ関数型言語仲間入りを果たした。
笑わせる
👍
高評価
0
👎
低評価
0
126 ななしのよっしん
2021/10/08(金) 08:54:41 ID: VoTMHrow4h
>>122
>サーバーレスではJVMの起動が遅くて向いていないが
と言ったけどGraalVMもあるし問題ないな
👍
高評価
0
👎
低評価
0
127 ななしのよっしん
2021/12/10(金) 22:39:21 ID: MMAgVlUzqm
「やばすぎる」 JavaライブラリLog4j」にゼロデイ脆弱性、任意のリモートコードを実行可 iCloudSteamMinecraftなど広範囲のJava製品に
https://www.itmedia.co.jp/news/articles/2112/10/news157.htmlexit

👍
高評価
0
👎
低評価
0
128 ななしのよっしん
2022/01/12(水) 12:53:41 ID: cCSTIqVbBw
>>127
>「Javaサーバサイドを作っていれば直接でなくても依存で使っていることがほとんどで、関係ないと思っていてもだいたい関係している。対策するのが相当大変なので放置する会社が多そう」として「暗期突入の可性もある」と
https://news.mynavi.jp/techplus/article/20211223-2235901/exit
>Javaエコシステム全体でLog4Shell全に払拭されるには、広大Log4j 2の依存関係においてすべてのパッケージで修正が了する必要がある。しかし、Google Security Blogによると、多くのアプリケーション依存関係ツリーの非常に深い部分でLog4j 2への依存を含んでいるため、このすべてが修正されるには長い日が必要になる可性があるとのこと
https://japan.zdnet.com/article/35181908/exit
>2021年には、企業ネットワークに対する1週間当たりのサイバー攻撃件数が前年50%も増えた。これ
(省略しています。全て読むにはこのリンクをクリック!)
👍
高評価
0
👎
低評価
0
129 ななしのよっしん
2022/03/03(木) 17:12:06 ID: wiwXjBG0rY
Java:ジャバ(言
Java:ジャワ(名とかお茶とか)
ややこしい
👍
高評価
0
👎
低評価
0
130 ななしのよっしん
2022/04/22(金) 19:23:43 ID: cCSTIqVbBw
Javaに認なしで不正操作できる脆弱性 範囲広く「早急に修正プログラム適用を」
https://www.itmedia.co.jp/news/spv/2204/21/news184.htmlexit
情報処理推進機構IPA4月20日プログラミング言語Javaの基本的な実行環境Java SEに重大な脆弱性が見つかったとして注意を呼び掛けた。Java SEはJavaを扱う上でほぼ必須ともいえるコンポーネントであり、範囲が広い。修正プログラムリリース済みのため速やかにアップデートする必要がある。
👍
高評価
0
👎
低評価
0