Javaによるプログラミングに関する世界観です。
書籍Java言語プログラミングレッスン 第3版(上) Java言語を始めようとJava言語プログラミングレッスン 第3版(下) オブジェクト指向を始めようを参考にさせていただきました。
Javaは、静的型付けのオブジェクト指向言語であり、バイトコードにコンパイルされる仮想マシン向けの言語。
Javaでは、intなどをはじめとする基本型と、基本型以外のクラスベースのオブジェクトを表す参照型の変数で、静的型付けによってデータを変数宣言する。Javaは静的型付け言語であるため、PHPやRubyのように型を意識せずに「いいかげんに扱うことはできない」。クラスライブラリによって提供されるクラスは、すべてObject型から派生したクラスであり、自分でクラスを定義した場合にも暗黙的にObject型かそれから派生した派生クラスの型を親クラスとした子クラスとして扱われる。int型のような基本型は、さまざまなクラスの機能を利用するためにラッパークラス(intであればInteger)が用意されている。
Javaは、オブジェクト指向で記述されることを念頭においた「オブジェクト指向言語」の中でも著名な言語であり、メソッド(関数)を実現するだけであっても必ずクラスの中のメソッドとして定義し、アクセス修飾子を定義しなければならない。C/C++と同様にif文やfor文を使うことができ、連続要素を順番に操作する拡張for文も可能だが、gotoは存在しない。gotoの代わりとして、ラベル付きのbreakを使用できる。
Javaは、コンパイラ言語でもインタープリタ言語でもない、中間言語・バイトコードを使用したVM言語である。プログラムはclassファイルにコンパイルされ、これを実行するにはJavaの仮想マシン(VM)が必要となる。Javaの仮想マシンは、オープンソースのOpenJDKか、あるいはOpenJDKに由来する各社のバイナリ(Oracle JDKやAdoptOpenJDKなど)、あるいはたとえばIBMのJDKのような別の仮想マシンが必要である。このメリットは、VMさえあればどこでも動くということ。Javaのclassファイルは、バイトコードになった段階では、まだどんなプラットフォームにも依存しておらず、VMで実行される段階ではじめてバイトコードがJITコンパイラによってコンパイルされて実行される。このため、あらゆる機械語やプラットフォームにJava VMが対応することができ、再コンパイルを行わなくても、同じバイトコードをどの環境でも実行できる。これはWindowsとLinuxの間で開発と運用を行うサーバー開発や、携帯電話やAndroidのようなモバイル機器、あるいは組み込み向けに開発する際、Windowsで開発して別の機器でプログラムを実行するような場合に便利である。欠点としては、プログラムを実行するために必ずVMというランタイムが必要であり、VMがなくプログラムだけではプログラムを実行することはできない。
また、Javaにはガーベッジコレクションの機能があり、不要になったオブジェクトを自動で回収し、参照がなくなった段階で削除してくれる。
また、Javaのクラスライブラリは、静的型付けでありながらとても整っている。Javaを使う大きなメリットは、「優れたクラスライブラリを使うことで簡単にプログラミングが可能である」ことである。これを模倣したWindowsの.NET Frameworkでもはやり整ったクラスライブラリがある。Microsoftによる.NET Frameworkは「Microsoft製のJava」とも言えるような存在であり、VMによって実行されることも共通だが、どちらかというと「プラットフォーム依存性の排除」よりも「多様なプログラミング言語から同じライブラリを使えること」を目指しており、C#やVB.NETのような高水準のJavaによく似たオブジェクト指向言語でGUIなどのアプリケーションが開発できる。MicrosoftはLinux向けに.NET Coreをリリースしたが、以前からLinuxではUNIX向けの.NET実装としてMonoを開発している。このMonoはゲームエンジンのUnityで使われており、Unity向けの開発では.NET言語であるC#を用いるが、このC#はとてもJavaとよく似た言語である。
.NET向けの言語と同様、Java VMにもJava以外の言語が存在し、「AltJava」と呼ばれる。AltJavaの中で有名なのはScalaとKotlinであり、KoltinはAndroidアプリ開発の公式の標準言語となっている。
Javaでは、コマンドラインアプリの開発のほか、Swingと呼ばれる「プラットフォーム非依存のGUIライブラリ」があり、Swingを用いることでPure JavaなGUIアプリが開発できる。このほか、ブラウザで動くJavaアプレットや、PHPと同様サーバーサイドでHTMLを動的に作成するサーブレット・JSPのような仕組みも存在する。JavaBeansやEJBやRMIを用いた分散コンピューティングは、エンタープライズシステムではよく使われている。また、Javaのコンパイル実行コマンドであるjavacには変更されたモジュールだけを再コンパイルしてくれる機能があるが、Makeの代替のプロジェクト管理ツールとしてApache AntやApache Mavenなどがある。
昔から、Javaはオープンソースと相性がいいことで知られています。
特に、Apacheソフトウェア財団のJakartaは、Java関連のオープンソースソフトウェアプロジェクトをたくさんホストしていて、「Javaと言えばJakarta」と呼ばれるような状況でした。
今でこそJakartaプロジェクトはなくなりましたが、それでも、いまだにJavaはオープンソースと相性がよいです。
オープンソース以外について言えば、JavaはXMLとも相性がいいことで知られています。多くのJavaソフトウェアが、設定ファイルなどの記述にXML形式のファイルを用いています。
このようなJavaですが、肝心のJava仮想マシンとJITコンパイラはオープンソースではなく、長らくSun Microsystemsの製品でした。
そのSunは、かつてよりJavaをオープンソースにするつもりであると言っていて、そのためにOpenJDKというオープンソース版のJava JDKが最近になって提供されるようになりました。
その結果、Javaはオープンソースになりましたが、SunがOracleに買収されると、Oracleは逆にJavaの有料化を決めます。
Javaの有料化は、オープンソース版でありながらサポート期限の短いOpenJDKとともに提供されるものであり、この有料化に反発する企業や組織などが、OpenJDKをビルドした独自のJava JDKを配布したりして、一時期は混乱していました。
今ではJavaはOracle版であっても無料で使用できるような新しいライセンスが提供されるようになりました。
そのように、いろいろとありましたが、今でもJavaがオープンソースと密接な関わり合いを持っていることは変わりません。
それでハッピーエンドである、と言いたいところですが、そのようなJavaも、最近では古くなりつつあります。
特に、PythonやJavaScriptのような新しい言語と比較すると、Javaは非常に古株であり、最新の流行やトレンドから、Javaは取り残され、まるで「新しいCOBOLのような存在」になりつつあります。
ですが、仮想マシンによって高い移植性を持つこと、オブジェクト指向言語として抜群の生産性を持つこと、クラスライブラリが優れていて使いやすいこと、長い間使われている実績を持つことなどの点で、Javaは今でも使われる「もっとも主力とされるプログラミング言語のひとつ」だと思います。
それこそ、サーブレットで使われるエンタープライズのJavaは、今でもエンタープライズの用途で多く使われており、Javaはメインフレームでもオープン系のクラスタでも安価なサーバーでもデスクトップでもモバイルでも、非常によく使われています。
決して、Javaは古くなって使えなくなってしまった、衰えた言語ではありません。今でも最先端から枯れたシステムまで多くの分野で使われる言語であり、多くの人が知識とスキルを持っているとても有力な言語です。ネット上での情報も多く、本や書籍も多く書店に並んでいます。PythonやJavaScriptには、まだまだ全然負けていません。
Java(アプリケーションサーバ)やOpenJDKも参照のこと。
2023.01.25
Java言語の基本。基本的に、Java VMという仮想マシンの上でコマンドラインで動きます。
Java言語プログラミングレッスン 第3版(上) Java言語を始めようを参考に執筆・引用しました。
Javaプログラムはこんな見た目になります。最初からたくさんのキーワードがでてきますが、最初は「おまじない」だと思うしかないでしょう。
public class HogeHello { public static void main(String[] args) { System.out.println("Hello, and Hoge."); } }
簡単な計算ができます。
public class HogeCalc { public static void main(String[] args) { System.out.println("32 + 22 = " + (32 + 22)); } }
同様に、+で足し算、-で引き算、*で掛け算、/で割り算が出来る。
変数はC言語と同じように使えますが、ポインタはありません。(ポインタと同じことをしたい場合は、参照型でオブジェクトを操作します。Javaでは基本型は値型、クラスのオブジェクトは参照型として扱われます。)
後日注記:Javaには「ラッパークラス」というものが存在する。intなどの基本型を操作する際に、ラッパークラスが基本型を扱う上で便利なメソッドをいろいろと提供してくれる。ラッパークラスの名称は、int型ならばIntegerクラス、double型ならばDoubleクラスとなる。
型も参照のこと。
構造化プログラミングも参照のこと。
if文。条件分岐ができます。
if (i < limit) { ... //条件式が真(true)になる時の処理 } else { ... //条件式が偽(false)になる時の処理 }
後日注記:Javaでは、if文などの条件式にboolean型の値しか置くことはできない。このため、C/C++などのように==を誤って=と書いてしまい、変数に代入された左辺の値が条件式の評価に使われることを防ぐことができる。
switch文。if文と同様の条件分岐ができます。
switch (number) { case 1: ... //処理1 break; case 2: ... //処理2 break; default: ... //処理3 break; }
後日注記:条件式によって判断するif文に比べて、switch文では定数式による「値ごとの分岐」を簡単に記述できる。switch文の定数式には値だけではなく式を書くことができるが、浮動小数点数や文字列を使うことはできない。break文を書かないとフォールスルーになってしまい、今のラベルに続いて次のラベルの処理が実行されるので注意しよう。
for文。繰り返し処理ができます。
for (int i = 0; i < count; i++) { ... //繰り返す処理 }
後日注記:C/C++言語と同様に、break(ブロックから脱出)やcontinue(残りの処理をスキップして次の繰り返しに継続)を使うこともできる。Javaにはgoto文は存在しないが、ラベル付きのbreakやcontinueを使うことで、ブロックの中から(たとえブロックがネストされていても)ラベルの位置に脱出・継続することができる。
後日注記:また、Javaには拡張for文というものがあり、配列やコレクションのようにシーケンス(順番)があるものについて、全ての要素をひとつひとつ辿っていくfor文を簡単に書くことができる。Perlのforeach文やPythonのfor文と同様。またこれ以外にもIterator(イテレータ、反復子)を用いてシーケンスを順番に処理することもできる。拡張for文には暗黙のうちにIteratorが使われている。
while文。for文と同様の繰り返し処理ができます。
while (i < count) { ... //繰り返す処理 }
Javaではオブジェクト指向を実現しているため、関数のことをメソッド(直訳すると「手法」)と呼びます。おそらく、関数のように値を返すよりも、メンバ変数の操作を目的としているからです。
(ちなみに、オブジェクトを直訳すると「もの」です。クラスは「階級」、インスタンスは「実例」、フィールドは「野原」、メモリは「記憶」、アドレスは「住所」です。)
以下は自分で書いたメソッドの例。
public class Commands { public static void main(String[] args) { System.out.println(calc("add", 2, 10)); System.out.println(calc("sub", 22, 3)); System.out.println(calc("mul", 3, 2)); System.out.println(calc("div", 20, 4)); printLoop(5, "5回表示されます。"); } public static int calc(String type, int x, int y) { if (type.equals("add")) { return x + y; } else if (type.equals("sub")) { return x - y; } else if (type.equals("mul")) { return x * y; } else if (type.equals("div")) { return x / y; } } public static void printLoop(int c, String str) { for (int i = 0; i < c; i++) { System.out.println(str); } } }
よく「public static void main()」というメソッドを宣言するが、ここでのstaticは静的なメソッドといって、インスタンスを作成しなくてもいつでも実行できる静的なメソッドのことを表す。メソッドだけではなく変数についても同様にstaticをつければインスタンス化しなくてもアクセスできる。
関数も参照のこと。
配列を作成する時にnew int[]とつける必要があるのは、配列が参照型だからです。
Javaには基本的数値のような基本型に加えて、クラスによる変数を定義する際に使う「参照型」の変数があり、配列や文字列は参照型になります。
参照型では、インスタンスを作成するためにnew演算子でコンストラクタを呼ばなければなりません(文字列の場合は、"~"でくくられた文字列リテラルが記述された時点でnew演算子が呼び出されているために明示的に書く必要はない)。
配列や文字列だけではなく、オブジェクト指向のクラスを用いて、オブジェクトのインスタンスを作る際にはnewが必ず必要です。
しかしながら、C++と違い、ガーベッジコレクションが自動的に参照のなくなったインスタンスを破棄してくれるので、delete演算子を用いてデストラクタを呼び出す必要はありません。
Javaクラスライブラリ(コレクションと配列)も参照のこと。
たとえば、newで配列を作成するには、以下のようにします。
String[] array = new String[3]; array[0] = "Java"; array[1] = "C"; array[2] = "Python";
あるいは、{}で一度に初期化する方法もあります。
String[] array = { "Java", "C", "Python" };
拡張for文では、配列のような連続したデータをひとつひとつ取り出して処理することができます。
for (String item : array) { System.out.println(item); }
java.util.Arraysは配列を操作するクラスです。たとえば、すべての要素を同じ値で埋めるfill()、配列のコピーを作るclone()とcopyOf()、ソートするsort()などのメソッドがあります。また要素の個数を得るためにはlengthを使います。また要素を追加する方法はありませんが、arraycopy()メソッドを使って要素数の大きな新しい配列に配列をコピーすることができます。もし動的にサイズの変えられる配列を使いたい時はリストを使います。asList()で配列をリストに変換できます。
Javaでは、C/C++と同様に、複数行のブロックコメントである/* ~ */と一行コメントである//が利用できるほか、ソースコードから自動的にドキュメントを作成するJavadocというツールのための/** ~ */というコメント(開始部分の*がひとつ多い)も利用できる。
2023.02.03
Java(2.オブジェクト指向)を参照のこと。
Java(3.クラスライブラリ)を参照のこと。
以下を参照のこと。
・F.発展
・G.戯言
Javaサンプルコードも参照のこと。
「Write once, run anywhere」(一度書けばどこでも実行できる)を目指したオブジェクト指向言語。
VM(仮想マシン)の上でバイトコードが動き、デスクトップで開発したアプリケーションがそのままモバイルやサーバーでも動く。
オブジェクト指向を大々的に取り入れ、洗練されたクラスライブラリを持つ。
大規模なエンタープライズ向けの開発に使える。
Javaのクラスライブラリは整理されていて使いやすい。
命令の文字列が長いためEclipseなどのIDEによる補完が必須とされる。
以下のページはとても参考になる。
Sunから継承されたOracleのJavaの資格。ブロンズ、シルバー、ゴールドの3種類。
サーティファイによる日本国内の民間資格。3級、2級、1級。
Androidの資格。
実際のところ、Javaは最近、エンタープライズの開発によく使います。エンタープライズとは、ビジネスや商用のシステムのことです。
たとえば、工場の生産システム。工場でひとつひとつのラインが成り立つように、工場のラインを制御するシステムとして、メインフレームと一緒にJavaを使います。
ほかにも、たとえば世界中の運輸・運送されている物品を一元的に把握して、どのような経路を辿るのか、今どこにいるのかを管理したり、といったことにも使います。
ほかにも、国中の信号機の調整とか電力供給のバランスを管理する、などといったことにも使われています。航空、医療、金融、軍事などの専門領域でも使われています。
そのように、ビジネスの基幹システムのことを総称して「エンタープライズ」と呼びます。
エンタープライズでは、たとえば金融システムなど向けにCOBOLなども使われますが、JavaはCOBOLなどに取って代わる新しい言語であると言われています(Javaは新しいCOBOLとも)。
エンタープライズはかっこいい領域ですが、新米エンジニアにやらせるべきではありません。
ここに書いた中でも、航空や医療は間違えると死人が出ます。航空機が墜落したり、病気の人が亡くなったりしてしまいます。また、金融は間違えると銀行預金者やトレーダーに大損が発生し、弁償責任が発生します。軍事を間違えると兵士が犠牲になりますし、国が戦争で負けます。
そのような「本当に動かなければいけない領域」は、正直言って、新米エンジニアにはできません。ベテランのチーフがきちんと設計するか、あるいは多額の費用を払ってIBMに直々に作ってもらうしかないことになります。
2024.11.10
エンタープライズ以外のJavaの用途として、Javaはモバイルや組み込み向けにもよく使われます。
モバイルとは、携帯電話やスマホやタブレットのような携帯端末のことです。
Javaはモバイル向けのOSであるAndroidで使われています。
Javaはスマホアプリを書くために使えます。最近はAltJava(Java言語の代わりに使えるJava VMで動く言語)として、特にAndroidのスマホアプリではKotlinがよく使われますが、スマホアプリならJava VMの標準言語であるJavaも選択肢のひとつです。アプリだけではなくゲームも作れます。3DCGやネットワークも使えます。
組み込みとは、たとえばお風呂の湯沸かし器やエアコンや洗濯機、あるいはバスや列車や自動車のような交通車両、さらにはトースターや炊飯器のように、家電製品のような機械製品に組み込みで使われる、ブラックボックス(中身の隠された箱という意味)なICを使った機器のことです。
組み込みでは機械語やC言語のクロスコンパイラも使われることがありますが、Javaは移植性が高いため、移植性を求められる場面でよく使われます。
Javaの移植性が高い理由は、JavaはVM(仮想マシン)の上で動く言語だからです。それぞれのプラットフォームごとに異なるAPIを、仮想マシンが上手く吸収してくれるため、Windowsで作ったアプリがLinuxとかモバイル環境で、何も手を加えなくてもそのまま動きます。なので、Javaは組み込み用途でよく使われます。特にモバイルではJavaが圧倒的な人気です。
Javaではコンパイラがクラスファイルという中間コード(バイトコード)にプログラムを翻訳します。この時点では、まだどのCPUの命令にも依存していません。そして、それを実行する段階で、バイトコードをその都度機械語に翻訳します。そのように二段階のコンパイル方式になっているため、単にC言語のソースコードを機械語にコンパイルするよりも移植性が高いのです。C言語では、Intel向けにコンパイルするとIntel CPUでしか動きませんが、Javaでは同じバイトコードがJava VM上でARMやSPARCやPOWERでも動きます。特にモバイル端末はARMを使っていることが多いので、この機能は重要です。
2024.11.10
このように、Javaは大規模なシステムから小規模なシステムまで、汎用的に広く使われます。
ここに書いた用途以外にも、たとえばJavaはWebサービスのサーバーサイドのバックエンドを書くためにも使われますし、WindowsやLinuxで動くクロスプラットフォームなGUIのアプリケーションを開発するためにも使えますし、大規模なスパコンのクラスタの分散システムを書くためにも使えます。いわば「Javaさえできればなんでもできる」といった具合です。
このような、「大規模なシステムにも小規模なシステムにも対応できる」という特徴を「スケーラブル」といいます。Javaは極めてスケーラブルな言語です。
Javaはオブジェクト指向言語で、クラスライブラリも整備されており、大規模な複数人での開発に向いています。何十~何百人というエンジニアが協力してシステムを開発するためにJavaは適しています。
Javaには3つのエディションがあり、それぞれ、エンタープライズ向けのJava EE (Enterprise Edition)、パソコン向けのJava SE (Standard Edition)、組み込み向けのJava ME (Micro Edition)となっています。
JavaはSun Microsystemsという会社によって開発されていましたが、SunはOracleに買収されました。Oracleの下、Java EEはEclipse財団に譲渡され、Jakarta EEという名前に変更されました。
2024.11.10
Java
Qiita
個人サイトなど
Javaのチュートリアル。
オラクルのサイト。公式のドキュメントが読めます。
Java
書籍