1. Java コンパイラ
ところで、Java の他言語に対する揺るぎない利点としてよく挙げられるのがマルチプラットフォーム性です。いったい何のことか、少し遠回りして説明しましょう。
実は、コンピュータはごく単純な命令しか実行できません。
犬には「そばへ」「お手」などのコマンドがあり、それを聞くと何か重要な動作をします。コンピュータにとってのその役割を果たすのは数値です。各命令はある数値にエンコードされています(これを機械語とも呼びます)。
数値だけでプログラムを書くのはとても大変なので、人間はプログラミング言語とコンパイラを考案しました。そのような言語は人間にも理解でき、同時にコンパイラにも理解できます。コンパイラとは、プログラミング言語で書かれたプログラムのテキストを機械語の集合へ変換する特別なプログラムです。
通常、プログラマはプログラミング言語でプログラムを書き、その後コンパイラを実行します。コンパイラは、プログラマが書いた複数のソースコードから機械語の 1 つのファイル—最終的な(コンパイル済みの)プログラム—を生成します。
- C++ の プログラム
-
コンパイラ
- 機械語の コードで構成された プログラム
このようにして得られたプログラムは、そのままコンピュータ上で実行できます。ただし、この方式の欠点は、生成されたプログラムのコードがプロセッサや OS に強く依存することです。Windows 向けにコンパイルされたプログラムは、Android のスマートフォンでは動作しません。
Android向けにプログラムを書いた場合、Windowsでは起動しません!
しかし、Javaはもっと革新的なアプローチを採用しています。
- Java の プログラム
-
Java コンパイラ
- プログラム, 特別な コード(バイトコード)から なる
-
Java VM
- プログラム, 機械語の コードから なる
Java コンパイラは、すべてのクラスを 1 つの機械語プログラムにまとめてコンパイルするわけではありません。代わりに、各クラスを個別に、しかも機械語ではなく特別な中間コード(バイトコード)にコンパイルします。機械語へのコンパイルは、プログラムの起動時に実行されます。
では、起動時に誰が機械語へコンパイルするのでしょうか?
それには JVM (Java Virtual Machine) — Java 仮想マシンという特別なプログラムがあります。まず JVM を起動し、次にバイトコードから成るプログラムを起動します。そして、実行直前に JVM がそのプログラムを機械語へコンパイルします。
もし高性能なプロセッサを使っていて、より多くの機械命令セットに対応しているなら、「2 回目のコンパイル」であなたのプロセッサや OS を考慮した機械語が生成されます。これが、Java がときに C++ より速い理由です。C++ は最初から機械語へコンパイルされるため、プロセッサの最も一般的な命令しか使えないのです。
2. コンパイル時の典型的なエラー
今は速度や最適化はそれほど重要ではありません。大切なのは、コンパイラがあなたのプログラムをエラー検査するということです。コンパイラはコードの正当性をチェックし、小さなミスひとつでも見つかれば先へ進ませません。
エラーの例:
文字列しか格納できない変数に数値を代入しようとしています。
String userName = 42; // おっと!それはできません。
コンパイラはすぐに型が一致しないとエラーを出します: Cannot implicitly convert type 'int' to 'string'。
別の例 — printlnメソッドのタイプミス:
System.out.printline("こんにちは!"); // メソッド名の誤り
コンパイラはこう言うでしょう: 「そのようなメソッドはありません — 構文を確認してください!」
エラーの読み方
ほとんどのコンパイラは、コードのどこにエラーがあるかを示し、場合によっては修正案まで提示してくれます。エラーを恐れないでください。エラーひとつひとつが啓発への一歩であり、あなたの内なる「ボス」を倒す道のりなのです。
3. コメント
さて、あなたは複雑なプログラムを書いています。すべて動く、あなたは天才!しかし 1 か月後、あのコードを開いてみると…何もわからない。ここに数行、あそこに不思議な変数。頭に浮かぶのは「これは明らかに自分以外の誰かが書いたに違いない!」。そんなときに救ってくれるのがコメントです。
コメントは、教科書の余白のメモや冷蔵庫の付箋(「ビール。飲むな。明日の朝用!」)のようなものです。コンパイラは無視しますが、人間は逆に読みます。コメントはコードの意図を説明し、重要な注意点を記したり、消さずに一部のコードを「無効化」したりできます。
重要:どのコンパイラもあなたのコメントは読みません。完全に無視されます!
一行コメント
Java には一行コメントと複数行コメントの 2 種類があります。一行コメントはダブルスラッシュ//で始まり、行末まで続きます。//以降はすべてコメントとして扱われ、コンパイラに完全に無視されます。
例:
System.out.println("こんにちは、世界!"); // 画面にあいさつを表示する
ここで// 画面にあいさつを表示するはコメントです。行の目的がわかりにくいときは、このように書き添えましょう!
もう一つの例:
int x = 42; // プログラマの年齢という値
一行コメントは、独立した行として書くこともできます:
// ユーザー名という変数の初期化
String userName = "Vasya";
まるで脚本のト書きのように、何のためかをコメントが説明してくれます。
複数行コメント
説明したいことがたくさんある場合、ちょっとした物語になりそうな場合はどうしましょう?そのために、/*で始まり*/で終わる複数行コメントがあります。これらの記号に挟まれた部分は、複数行であってもコンパイラに無視されます。
例:
/*
ここではユーザー名を画面に出力します。
名前がなければ "ゲスト" と表示します。
*/
System.out.println("あなたの名前を入力してください:");
こんな書き方もできます:
int age = 18; /* 新しいユーザーの
初期年齢の値 */
注意:複数行コメントを入れ子にすることはできません。コンパイラより賢く出し抜こうとしても—うまくいきません。
図解:
| 種類 | 構文 | 例 |
|---|---|---|
| 一行 | |
|
| 複数行 | |
|
4. 実例
コード行の「無効化」:
一時的にあるコード片を実行したくないことがあります。まさにコメントの出番です:
// System.out.println("一時的に不要なテキスト");
行は残りますが、コンパイラには「見えません」。
TODO と FIXME のメモ
プログラマも人間です。作業が未完だったり、バグがある場所を自分にメモしたいことがよくあります。そのときは次のように書きます:
// TODO: 空入力の検証を追加する
// FIXME: この関数は合計を誤って計算している
多くのエディタや IDE は、こうしたキーワードをハイライト表示してくれます!
プログラマのジョーク
// このコードには責任を持てません。望まないのに書かされました。
// 親愛なる私は未来から来た!このコードについて許してください。
// もしまた同じものを見かけたら、私は職場に武器を持っていく羽目になります。
// もしこの条件がいつか満たされたら、報酬ありで電話 xxx-xxx-xxx にご連絡ください。
// 親愛なるプログラマへ:
//
// このサブルーチンを「最適化」し終えて
// それがどれほど大きな誤りだったかを理解したら、
// 次の人への警告として下のカウンタを増やしてください:
//
// hours_spent_here = 42
// これを書き始めたとき、神と私だけが何をしているのか理解していた。
// 今では神だけが理解している。
// ときどき、コンパイラは私のコメントを全部無視している気がする
// 私のすべてのコードと仕事を妻のダーリンに捧げます。
// これが本番に出た暁には、彼女が私と子ども 3 人と犬を
// 養わなければならなくなるでしょう。
そう、コメントはとてもユーモラスになり得ます。書いているのは生身の人間なのですから。
GO TO FULL VERSION