コンパイルと実行

コンパイルとは何か

私たちがプログラミング言語で書くプログラムをソースコードといいます。Javaでは .java の拡張子のファイルとして保存することになっています。

ソースコードを実行前にあらかじめコンピュータ上で実行しやすい形に変換することをコンパイルといいます。

以前はコンパイルといえば,CPUが直接実行できるコードにすることをいいましたが現代のコンパイルはさまざまな形があります。

JavaではCPUが異なっても実行できることが「売り」ですから,CPUが直接実行できるコードにするわけにはいきません。

コンパイルする

コンパイル後に Hello.java などのファイルがあるフォルダを見ると Hello.class など .class という拡張子のファイルができています。

( Hello.java~ というファイルもで見えることがありますが,これはエディタがつくるバックアップファイルで,Hello.java を書き換えると作られます。)

.classのファイルができている

Hello.class というファイルは、

$ javac Hello.java[Enter]

という操作で Hello.java をコンパイルしたときに作られました。 javac というのはjavaのプログラム(ソース)をコンパイルをするコマンド(注1)です。javacの後に書かれているファイルをコンパイルして、結果を .java を .class に変えたファイルに書き出します。

同様に Hello2.java をコンパイルしたときに Hello2.class というプログラムファイルが作られました。

コンパイル

Hello.java などをソースファイル、Hello.class をプログラムファイルといいます。javaではプログラムファイルをそのままクラスファイルという場合もあります。

実行する

できあがったプログラムを実行するのは次のような操作でした。

$ java Hello[Enter]

で実行されるのはこの Hello.class です(注2)。

このクラスファイルはGnomeのエディタでは編集できません。次のようなメッセージが出ます。

Windowsのエディタでは開いてしまうものがあります。これはテキストファイルでないので、次のように訳のわからない文字が出てきます。また、編集をするとプログラムが壊れますから、注意してください。

.classファイルをテキストエディタで開いたときの様子

なぜ直接実行できない?

C言語ではコンパイルすると、直接実行できるプログラムファイルができます( Windowsでは Hello.exe など)。直接実行とはキーボードで Hello と打つことで実行されることをいいます。

$ Hello[Enter]

javaではこうなりません。実行するには、

$ java Hello[Enter]

としますが,これで実行されるのは java (Windowsではjava.exe) で、これが Hello.class から命令を読みとって実行するという形をとっています。

このしくみのおかげでjavaは異なるOSでも動きます。java (java.exe) をOSにあわせて作っておいて同じ class ファイルを実行するのです。

逆にこのしくみのためにjavaは実行速度が遅くなっています。これは弱点ですが、ハードウェアの進化により将来的には気にならなくなるはずです。また、はじめからclassをネイティブに実行するコンピュータを作ることも可能です。

それでもコマンドにしたい

Linux(UNIXでも)ではシェルの機能を用いて,Helloだけで実行するようにできます。

  1. ユーザーホームに bin というフォルダを作る。
  2. エディタで次の内容のファイルを作り,binの中に hello という名前で保存する。(拡張子は不要ですが,.sh という拡張子をつける流儀の人もいます。)
    #!/bin/sh
    java Hello
    
  3. 実行権限を持たせる
    $ chmod u+x bin/hello
    
  4. hello と入力すると実行される
    $ hello
    Hello World!
    $
    

これからの例題は面倒なのでコマンドにしませんが,自分で使用したければ試してみるといいでしょう。ただしここで示した方法ではユーザーホームの中に置くコマンドですから,使えるのは自分だけということになります。

同じコンピュータを使っている別ユーザーが同じ名前のシェルスクリプトを作っても互いにじゃまをしません。

注1 コマンド

コマンドライン端末ではコマンドラインから入力された文字列を端末のシェルと呼ばれるソフトウェアがコマンドとして解釈して処理をします。自分の内部で処理できるコマンドは「内部コマンド」といいます。内部で処理できないものを「外部コマンド」といいます。この場合端末ソフトウェアはその機能をもつ別のソフトウェアを呼び出して仕事をさせる働きをします。

端末ソフトウェアは自分の内部にないコマンドを受け取るとそのコマンドと同じ名前のファイルを探します。そのファイルが実行可能なソフトウェアであった場合,それを実行するのです。

これは端末ソフトウェアの機能拡張のしくみととらえることもできますし,端末ソフトウェアをランチャー(他のソフトの発射台)ととらえることもできます。

Javaをインストールした時に javac という実行可能なファイルを端末ソフトウェアがソフトウェアファイルを探す場所に保存しておいたので,javac というコマンドが使えるということになっているのです。厳密にいえばシェルのコマンドではなくシェルから起動されたプログラムなのですが,位置づけは同等です。

このように自分で作ったプログラムもコマンドとして組み込み,機能を増やしていく仕組みを持っているのがコンピュータのもっともコンピュータらしいところです。

注2 実行可能なファイル

プログラムを作成するということは,実行可能なソフトウェアファイルを作るということです。

.classのファイルはコマンドとしては働きません。厳密には実行可能なソフトウェアファイルではないことになります。

Javaでは java というソフトウェアをまず実行して java に classファイルのプログラムを実行させるという間接的なアプローチをとっています。これは java というプログラムにCPUやOSに依存する部分をまかせて,.classファイルの中にはCPUやOSに依存する要素を入れないようにすることで,.classファイルをどのCPU,どのOSに持っていっても変更せずに実行できるというメリットを引き出しているのです。

もくじ

聖愛高等学校
http://www.seiai.ed.jp/
Last Modified