C言語とJavaの違い

JavaプログラマのためのC作法という本を読んでいます。この本には、JavaとCの違いが簡単にまとめられています。JavaプログラマのためのCの入門書というわけではありませんが、Cに関する知識は、大学一回生の授業レベルで十分です(私はCに関してはその程度の知識しかありません…)。大きな違いだけ自分なりにまとめておきます。

JavaプログラマのためのC作法 虎の巻

JavaプログラマのためのC作法 虎の巻

コンパイラ言語とインタプリタ言語の違い

C言語で書いたコードは、コンパイルされた後、マシンの上で直接実行されます。つまりコンパイラ言語です。これに対してJavaインタプリタ言語になります。Javaで書いたコードは、コンパイル時には中間言語コードへと直され、実行時にはバーチャルマシンの上で実行されます。ここでC言語のようなコンパイラ言語は、コードを直接マシンの上で実行するので、実行させるマシンの環境に依存することになります。例えばC言語では、符号なしのint型の大きさを最低16bit(0〜65535)と定義しています。ここで「最低」というのがポイントで、マシンによっては24bitでも、32bitでも良いという訳です。これは、int型だけに限った話でなく、C言語のさまざまな部分に影響しています。一方Javaではバーチャルマシンを利用していますので、プログラムはなるべく近い環境で実行されることになり、こういった問題はかなり少なくなります。

オブジェクト指向

Javaオブジェクト指向C言語オブジェクト指向ではありません。この違いが大きく表れているのは、関数の定義場所でしょう。Javaはオブジェクト(クラス)の内部に、メソッドとして関数を定義します。ちなみに、ここではオブジェクトの持つ関数をメソッドと呼んでいます。一方、C言語オブジェクト指向ではありませんので、グローバルな領域に関数を定義します。これによって、関数へのアクセス方法が異なります。オブジェクト指向では、関数(メソッド)は何らかのオブジェクトに包まれていますので、

オブジェクト名 . メソッド名 (引数);

としてアクセスします。これに対してC言語では、

関数名 (引数);

として関数にアクセスします。また当たり前ですが、C言語では、クラスからインスタンスを生成する仕組みがないので、newやinstanceof演算子がありません。ただし、C言語の構造体の仕組みは、少しクラスと似ています。構造体はメソッドを持てないのが、クラスと大きく違う点ですね。

ポインタの仕組みがあるか

ポインタの仕組みといいましたが、要するにメモリを直接操作できるかどうかです。C言語ではメモリを直接操作できますが、Javaではできませんね。そのためメモリサイズを調べるsizeof演算子、メモリを確保するmalloc、ポインタに関する演算子、* や & がJavaにはありませんね。

最後に

まだこの本を一冊読み終わっていませんが、いくつかのトピックで共通する部分だけを簡単にまとめてみました。また後で追加の内容を書くかもしれません。