私たちがプログラミング言語で書くプログラムをソースコードといいます。Javaでは .java の拡張子のファイルとして保存することになっています。
ソースコードを実行前にあらかじめコンピュータ上で実行しやすい形に変換することをコンパイルといいます。
以前はコンパイルといえば,CPUが直接実行できるコードにすることをいいましたが現代のコンパイルはさまざまな形があります。
JavaではCPUが異なっても実行できることが「売り」ですから,CPUが直接実行できるコードにするわけにはいきません。
コンパイル後に Hello.java などのファイルがあるフォルダを見ると Hello.class など .class という拡張子のファイルができています。
( Hello.java~ というファイルもで見えることがありますが,これはエディタがつくるバックアップファイルで,Hello.java を書き換えると作られます。)
Hello.class というファイルは、
$ javac Hello.java
という操作で Hello.java をコンパイルしたときに作られました。 javac というのはjavaのプログラム(ソース)をコンパイルをするコマンド(注1)です。javacの後に書かれているファイルをコンパイルして、結果を .java を .class に変えたファイルに書き出します。
同様に Hello2.java をコンパイルしたときに Hello2.class というプログラムファイルが作られました。
Hello.java などをソースファイル、Hello.class をプログラムファイルといいます。javaではプログラムファイルをそのままクラスファイルという場合もあります。
できあがったプログラムを実行するのは次のような操作でした。
$ java Hello
で実行されるのはこの Hello.class です(注2)。
このクラスファイルはGnomeのエディタでは編集できません。次のようなメッセージが出ます。
Windowsのエディタでは開いてしまうものがあります。これはテキストファイルでないので、次のように訳のわからない文字が出てきます。また、編集をするとプログラムが壊れますから、注意してください。
C言語ではコンパイルすると、直接実行できるプログラムファイルができます( Windowsでは Hello.exe など)。直接実行とはキーボードで Hello と打つことで実行されることをいいます。
$ Hello
javaではこうなりません。実行するには、
$ java Hello
としますが,これで実行されるのは java (Windowsではjava.exe) で、これが Hello.class から命令を読みとって実行するという形をとっています。
このしくみのおかげでjavaは異なるOSでも動きます。java (java.exe) をOSにあわせて作っておいて同じ class ファイルを実行するのです。
逆にこのしくみのためにjavaは実行速度が遅くなっています。これは弱点ですが、ハードウェアの進化により将来的には気にならなくなるはずです。また、はじめからclassをネイティブに実行するコンピュータを作ることも可能です。
Linux(UNIXでも)ではシェルの機能を用いて,Helloだけで実行するようにできます。
#!/bin/sh java Hello
$ chmod u+x bin/hello
$ hello Hello World! $
これからの例題は面倒なのでコマンドにしませんが,自分で使用したければ試してみるといいでしょう。ただしここで示した方法ではユーザーホームの中に置くコマンドですから,使えるのは自分だけということになります。
同じコンピュータを使っている別ユーザーが同じ名前のシェルスクリプトを作っても互いにじゃまをしません。
コマンドライン端末ではコマンドラインから入力された文字列を端末のシェルと呼ばれるソフトウェアがコマンドとして解釈して処理をします。自分の内部で処理できるコマンドは「内部コマンド」といいます。内部で処理できないものを「外部コマンド」といいます。この場合端末ソフトウェアはその機能をもつ別のソフトウェアを呼び出して仕事をさせる働きをします。
端末ソフトウェアは自分の内部にないコマンドを受け取るとそのコマンドと同じ名前のファイルを探します。そのファイルが実行可能なソフトウェアであった場合,それを実行するのです。
これは端末ソフトウェアの機能拡張のしくみととらえることもできますし,端末ソフトウェアをランチャー(他のソフトの発射台)ととらえることもできます。
Javaをインストールした時に javac という実行可能なファイルを端末ソフトウェアがソフトウェアファイルを探す場所に保存しておいたので,javac というコマンドが使えるということになっているのです。厳密にいえばシェルのコマンドではなくシェルから起動されたプログラムなのですが,位置づけは同等です。
このように自分で作ったプログラムもコマンドとして組み込み,機能を増やしていく仕組みを持っているのがコンピュータのもっともコンピュータらしいところです。
プログラムを作成するということは,実行可能なソフトウェアファイルを作るということです。
.classのファイルはコマンドとしては働きません。厳密には実行可能なソフトウェアファイルではないことになります。
Javaでは java というソフトウェアをまず実行して java に classファイルのプログラムを実行させるという間接的なアプローチをとっています。これは java というプログラムにCPUやOSに依存する部分をまかせて,.classファイルの中にはCPUやOSに依存する要素を入れないようにすることで,.classファイルをどのCPU,どのOSに持っていっても変更せずに実行できるというメリットを引き出しているのです。