見出し画像

Java - 紅茶じゃないのプログラムなの

Java を最初に見たのは、やはりブラウザで動くアプレットだったのかもしれません。当時、ブラウザで格好良いことをしようと思えば、perl で CGI をゴリゴリ書くしか無い時代で、プログラムをブラウザで走らせることが出来るなんて「なんて素敵なんでしょう」と思ったものです。

Java

そういえば、当時は「Javaはどう読むの?」というのが話題になりました。インドネシアの首都がある島は「ジャワ島」ですし、ちょうど「ジャワティー」が売れていた頃で、当然「ジャワ」と呼んでいいのだと思っている人が多かったです。アメリカでも混乱していたようで確か公式(サンマイクロシステムズ)あたりが「ジャバ」だよと説明して回ったような記憶があります。

ジャワ島

JAVATEA

Java の一番の特徴と言えるのは、仮想的なJavaマシンを規定して、ソースコードを、この仮想マシンのマシン語にコンパイルして走らせることにあります。仮想マシンのバイナリは、実際に使われるCPUによりインタプリタとして、または逐次コンパイルして実行されます。これは UCSD-Pascal に似た仕組みではあるのですが、そもそも Java は家電などの組み込み向けの言語として開発されたことが理由であるようです。組み込みで使われるCPUは、その規模からいろいろな種類があり、それぞれのCPUに対して個別にコンパイルしたバイナリを用意するよりは、まず仮想マシンを作って同じバイナリを使えるようにしたほうが便利です。それから小規模なCPUで複雑な処理を行うと、どうしてもバイナリが大きくなる傾向があり、一つの命令である程度複雑な処理が行えるJavaマシンのバイナリのほうがコンパクトになることが多いです。

Java仮想マシン

この同じバイナリが、いろいろなCPUで実行できるという特徴が、インターネットの時代にちょうどマッチしたのが始まりなのかもしれません。クライアント・サーバモデルにおいては、サーバにはいろいろな環境のCPUが接続してきます。サーバにしてみれば多様なクライアントそれぞれのバイナリを用意して、クライアントに応じてプログラムを送ることは現実的はありません。Javaであれば仮想マシンのバイナリさえあれば、Java をサポートしているどのクライアントでも実行することが出来ます。こうして、まず Java アプレットが普及していったのですが、ブラウザをフルに活用するためには、Java を始めいろいろなプラグインと呼ばれる追加ソフトをインストールする必要があり、WEBサイトを楽しむにはいろいろハードルがあったことを思い出しました。

クライアントでプログラムを走らせるのに、何もバイナリを送ることもありません。プログラムをテキストで送り付けてクライアントで実行しても良いはずです。登場したばかりの Java のインパクトが強く、これと同じような(でも同じではない)言語であれば、プログラマは新たな言語を覚えること無く、クライアントで走るプログラムを用意することが出来ます。こうして登場したのが Java Script です。ブラウザの持っているオブジェクトを操作するための言語で、Java の「ような」言語ですが、実は全く別の言語です。プログラムはHTMLタグとして記述され、変数には型がありません。ブラウザの中だけではあるもののコードを書いて読み込むだけで、特にコンパイルなどの操作なしにすぐに実行できる手軽さから広く使われるようになりました。ブラウザを制御する Script 言語は、他にもマイクロソフトによる実装である JScript や、VisualBasic をベースとした VBScript なども登場しましたが、IEが思ったように普及しなかったこともあり今では JavaScript に落ち着いているようです。

JavaScript

もちろん一般的なプログラミング言語としての Java も異なるプラットフォームでも動作させることができる利点もあり普及していくのですが、あまりに対象が広いために1種類の仮想マシンですべてを賄うことができずに、今は4種類ほどのエディションにわかれているようです。

【Java言語の歴史】サンマイクロシステムズ社の創業からJava言語がリリースされるまで! ゆっくり解説プログラミング言語 No.087

さて Java の言語としての特徴ですが、基本的には Pascal 系の言語ですが、C++と同じようなクラスを使ったオブジェクト指向がサポートされています。またマルチスレッドやガベージコレクションが言語レベルでサポートされており、CやC++で苦労するスレッド間通信やメモリ管理の問題はシステムにお任せで済ますことができます。そもそも仮想マシンで動作するものですし、システムレベルの細かな処理を記述するのには向きませんが、言語がプラットフォーム間の差異を吸収してくれるので、より本質的な部分に注力してコードを書いていくことが出来ます。

Javaとは?言語の特徴や用途を初心者向けにわかりやすく解説

ということで、とても人気もあり普及していったので、すぐに覚えて使うようになったのですが、クロスプラットフォームである反面、どのOSの上でも Java の環境というのを構築する必要があり、これをぴったり一致させないと、他のプラットフォームでうまく動作しなかったりするのが難点でした。特にクラスライブラリは標準的なものはそれぞれに予め用意してあるのですが、良く使うライブラリたちには、それなりにややこしい依存関係があり、これを維持しないと実行時に「ヌルポ」で落ちるという事故が頻発するのが悩みでした。バイナリが仮想マシンのコードであることは、Pascalの時代と比べると大きく改善しており、特にJITと呼ばれる実行時に必要な部分だけコンパイルして使う技術がとてもうまく機能しており、殆どデメリットを感じませんでした。もちろんどうしてもパフォーマンスが必要な場合には、ネイティブコードを出力する方法も用意されていました。

何だか良い事ずくめにも聞こえるのですが、あまり使いやすいデバッガが無く、仮想マシンのコード単位で実行することが難しく、それを頑張ってもシステムの奥の方で起こっていることを追うことが難しいことに困りました。特にメモリ管理はシステムが握っているので、どうしてメモリ保護違反になるのか追うのはなかなか大変でした。ガベージコレクションはとても便利なのですが、いろいろな理由で、どうしても解放されないメモリが発生してしまうので、Java仮想マシンのプロセスを長く動かしているとジワジワとサイズが膨らんできて、そのうちページアウトするようになってしまいます。そうすると全てのJavaプログラムが地を這うような速度になってしまうので、定期的に仮想マシンを再起動するなんてことが必要でした。つまり言語としての Java は素敵なのですが、Java の実行環境は最低だというのが私の印象でした。

Javaの知られざる欠陥(上)

プリプロを持たない言語の場合、Pascalもそうだったのですが、コメントに言語の細かい設定のようなものを書くのはあまりスキではありません。JavaDocは構わないのですよ。問題はアノテーションで、@Overrideなんて明らかに言語の機能ではないですかと思うのですよね。

いずれにせよ Java は広く受け入れられ、その後のプログラミング言語にも大きな影響を与え、オブジェクトを扱う言語の基本的な枠組みは似たものになっています。ですから Java を理解できれば、他のモダンな言語を覚えるのも楽になるでしょう。ただ Java 自身は、Oracle という特定の会社が管理している言語・プラットフォームでもあるので、その動向は予断を許しません。それもあり「Javaのような」言語が増殖しているキライもあるのですが、プログラムを書く人にとってはあまり関係のないことかもしれません。プログラミング言語を最初に学ぶとしたら、python も素敵なのですが、少しばかり癖が強くて他の言語に応用できないところもあるので、やはり Java をオススメします。

Oracle Java

https://www.oracle.com/jp/java/technologies/


おまけ

言語じゃなくてインドネシアのジャワの話、古いお知り合いのサイトなんですが、興味があればじっくりお読みいただければ。

“ジャワ探究 - 南の国の歴史と文化” ほか



ヘッダ画像は、いらすとや より(Oracle のライセンスって思ったより難しい)
https://www.irasutoya.com/2020/11/blog-post_30.html

#プログラミング言語 #Java #サンマイクロシステムズ #オラクル #オブジェクト指向 #仮想マシン


この記事が気に入ったらサポートをしてみませんか?