卒研用LinuxマシンでのC/Javaプログラミング方法

卒研室のLinuxマシンでは、Cコンパイラとして、gnuのgccを使用します。

作業用ディレクトリの作成
ホームディレクトリの下にC/Javaプログラミング用のディレクトリを作成し、そこで作業すると良いでしょう。
ソースファイルの作成
ソースファイル作成にはどのようなものを使用してもよいのですが、Emacsを使用すると、 .cの拡張子のついたファイル作成時にCのモード、.javaの拡張子のついたファイル作成時にJavaモードになり、 自動的にC/Jc用のインデント(字下げ)をしてくれるので便利です。
コンパイル法
Cのソースコードのコンパイルにはgccを、Javaのソースコードのコンパイルにはjavac使用します。

Cソースコードの作成、コンパイルおよび実行

EmacsでのCソースコード作成

Emacsで下記のhelloworld.c というプログラム作成例を示します。モード行がCモードになっています。

helloworld.c

  1. 新規ファイルとして helloworld.c をEmacsで開きます。
  2. 上図にしたがって printf 文の前の行まで、プログラムを記述します。
  3. printf の行は字下げされていますが、下図のように、字下げしないでprintfと入力します。

    printf

  4. 続いて、括弧(を入力すると、下図のように自動的に字下げされます。

    printf(

  5. return 0 の行も字下げされていますが、下図のように、字下げしないでreturn 0と入力します。

    return 0

  6. 続いて、セミコロン;を入力すると、下図のように自動的に字下げされます。

    return 0;

  7. 最後に中括弧を記入して、ファイルをセーブし、終了です。

なお、字下げは TABキーでも行なうことができます。

コンパイルおよび実行

コンパイルはコマンドラインで、

$ gcc Cソースプログラムファイル名

と記述し、Enterキーを押します。gccとファイル名の間には半角スペースを一つ以上入れます。

以下は、先ほどの helloworld がエラーなくコンパイルされた例を示しています。

$ gcc helloworld.c
$

ソースファイルに記述ミスがあると、コンパイルエラーとなってメッセージが表示されます。helloworld.cの6行目 return 0; の ;を取って、コンパイルすると下図のようなメッセージが表示されます。

$ gcc helloworld.c
aaa.c: 関数 `main' 内:
aaa.c:7: error: 文法エラー before '}' token
$

上記のメッセージは、関数 'main' の中に、記述ミスがあり、それは7行目の '}' の前の文法エラーだという意味です。

コンパイルが正しく終了すると、a.outというファイルが作成されます。これが実行ファイルです。実行するには、コマンドラインで

$ ./a.out

と入力し、Enterキーを押します。helloworld をコンパイルしてできた a.out を実行 した例を、下図に示します。

$ ./a.out
Hellow world!
$

コンパイルして作成される実行ファイル名を別の名前にしたい場合は、gccのオプション"-o"を使用します。下図は、helloworld.cをコンパイルして得られる実行ファイルを、helloworldという名前にした例です。

$ gcc -o helloworld helloworld.c
$

ls -lしてみると、helloworldが作成されているのがわかります。

$ ls -l
合計 24
-rwxr-xr-x 1 matsu users 4729  5月 7日 14:36 a.out*
-rwxr-xr-x 1 matsu users 4736  5月 7日  2008 helloworld*
-rw-r--r-- 1 matsu users   79  5月 7日  2008 helloworld.c
-rw-r--r-- 1 matsu users   78  5月 7日 14:36 helloworld.c~
$

ファイル名の後ろにアスタリスク"*"がついているのは、このファイルが実行ファイルだからです。

gccには様々なオプションが存在します。

$ jman gcc

で確かめてみましょう。

Javaソースコード作成、コンパイルおよび実行

Cと違って、Javaではソースコードのファイル名に命名規則があります。

アプリケーションで文字列表示

Javaアプリケーションを作成します。

ソースコード入力

emacsを使って下記のソースコードを入力してください。

class FirstApplication {
    public static void main(String args[]){
        System.out.println("北海道科学大学");
        System.out.println("Hokkaido University of Science");
    }
}

大文字、小文字はしっかりと区別してください。またファイル名は

FirstApplication.java

としてください。これはJavaの決まり事で、クラス名と一致させる必要があります。上記プログラムの場合、

class FirstApplication

となっているので、クラス名はFirstApplicationとなります。また、拡張子は必ず、.javaにしてください。

コンパイルおよび実行

下記のようにコンパイルします。

$ javac FirstApplication.java
$

"javac"と"FirstApplication.java"の間には必ず半角スペースを一つ以上入れます。プログラムに間違いがなければ、何もメッセージが表示されず終了します。何らかのエラー・メッセージが出力された場合は、コンパイル・エラーになったときを参照してください。

実行するにはjavaコマンドのあとに、半角スペースを一つ以上いれて、クラス名を指定します。

$ java FirstApplication
北海道科学大学
Hokkaido University of Science
$

上記のように表示されれば成功です。

アプレットで文字列表示

Javaアプレットを作成します。

ソースコード入力

emacsを使って下記のソースコードを入力してください。

import java.awt.Graphics;
import java.applet.Applet;

public class FirstApplet extends Applet {
    public void paint(Graphics g){
        g.drawString("北海道科学大学",10,10);
        g.drawString("Hokkaido University of Science",10,10);}
    }
}

文字、小文字はしっかりと区別してください。またファイル名はJavaアプリケーションと同様に、

FirstApplet.java

としてください。

コンパイルおよび実行

下記のようにコンパイルします。

$ javac FirstApplet.java
$

では、アプリケーションの場合と同様に実行してみましょう。

$ java FirstApplet
Exception in thread "main" java.lang.NoSuchMethodError: main
$

Javaアプリケーションのように実行すると、このようにエラーになります。実は、アプレットは単独では動作しないので、このように実行はできないのです。アプレットを動作させるには下記のようなHTMLファイルが必要になります。

<html>
<body>
<applet code="FirstApplet.class" width="200" height="100" />
</applet>
</body>
</html>

このHTMLファイルの名前は、拡張子が.htmlであればどのような ものでもよろしいです。ここではFirstApplet.htmlとしました。このHTMLコードのうち、アプレットに関係しているのは以下の部分です。

<applet code="FirstApplet.class" width="200" height="100">
</applet>

"code="に、クラス名に".class"を付けたものを指定します。"width"と"height"には、それぞれ、アプレットを表示する領域の幅と高さをピクセル単位で指定します。

以下に示すように実行にはappletviewerを使用します。

$ appletviewer FirstApplet.html &
$

別Windowが起動し、以下のように表示されれば成功です。

FirstApplet

以下に示すように、ソースコードにあらかじめHTMLコードを書いておけば、

/*
<html>
<body>
<applet code="FirstApplet.class" width="200" height="100" />
</applet>
</body>
</html>
*/

import java.awt.Graphics;
import java.applet.Applet;

public class FirstApplet extends Applet {
    public void paint(Graphics g){
        g.drawString("北海道科学大学",10,10);
        g.drawString("Hokkaido University of Science",10,10);}
    }
}
      

下記のように実行できます。

$ appletviewer FirstApplet.java &

Mozilla FirefoxやMicrosoft Internet Explorerなどのjavaに対応したブラウザであれば、ブラウザで"FirstApplet.html"を開けば、アプレットがブラウザ上で動作します。試してみてください。

コンパイル・エラーになったとき>

コンパイル・エラーの原因で多いのは、スペル・ミスや文の最後に付けるセミコロン;の付け忘れ、ファイル名の入力ミス、括弧()や中括弧{}の対応がとれていないなどです。

  1. スペル・ミス FirstApplication.javaの"public"を"pubric"とスペル・ミスしたときに出力されるエラー・メッセージは下記のようになります。
    $ javac FirstApplication.java
    FirstApplication.java:2:  がありません。
       pubric static void main(String args[]){
              ^  FirstApplication.java:5: ';' がありません。
       }
        ^  FirstApplication.java:2: シンボルを解釈処理できません。
    シンボル: クラス pubric
    位置    : FirstApplication の クラス
       pubric static void main(String args[]){
       ^
    エラー 3 個
    $
    上記の例では
    FirstApplication.java:2: がありません。
    
    から、 2行めにエラーが生じていることがわかります。同様に5行目と2行目にもエラーがあるとなっていますが、この場合は Javaの予約語である、"public"のスペル・ミスが原因となって一つのミスで複数のエラーが生じているのです。
  2. セミコロン";"の付け忘れ
    FirstApplication.javaの3行目最後のセミコロン";"の付け忘れで生じるエラー・メッセージを下記に示します。
    $ javac FirstApplication.java
    FirstApplication.java:3: ';' がありません。
            System.out.println("Hokkaido University of Science")
                                                          ^
    エラー 1 個
    $
    
    この場合は、すぐにエラーの原因がわかりますね。
  3. ファイル名の入力ミス
    FirstApplication.javaとファイルを保存したつもりが違う名前で気づかずに保存してしまった、あるいは、コンパイル時にファイル名を間違って指定したときには下記のエラー・メッセージが出力されます。
    $ javac FirstApp.java
    エラー: FirstApp.java を読み込めません。
    エラー 1 個
    $
    
    FirstApp.javaというファイルが存在しないので、読み込めないわけです。
  4. 括弧の対応ミス
    FirstApplication.javaの5行目中括弧"}"の付け忘れで生じるエラー・メッセージを下記に示します。
    $ javac FirstApplication.java
    FirstApplication.java:6: '}' がありません。
    }
     ^  エラー 1 個
    $
    この場合は、すぐにエラーの原因がわかりますね。

以上コンパイル時のエラーの話でしたが、クラス名とファイル名が不一致の時は、コンパイルに失敗するのでしょうか?答えはNoで、クラス名とファイル名が不一致でも、コンパイル時にエラーは出力されません。しかし、実行時に下記のようなエラー・メッセージが出力されます。

$ java FirstApplication
Exception in thread "main" java.lang.NoClassDefFoundError:\
 FirstApplication
$

Javaは、ファイル名ではなく、クラス名でバイト・コードを出力するので、このようなエラーがおきます。試しにクラス名で実行してみてください。エラー無く実行されるはずです。

まとめ

  1. ソース・コードを保存するときのファイル名は必ず"クラス名.java"とする。
  2. アプリケーションを実行するには、"java クラス名"とする。
  3. アプレットを実行するには、HTML形式ファイルが必要で、appletviewer HTMLファイルとするか、Javaに対応したウェブ・ブラウザでHTMLファイルを開く。