第1週:プログラムとは
1. 1 プログラムとプロセス
1. 2 プログラミング言語
1. 3 Java 言語
1. 4 プログラムを実行する手順
1. 5 プログラムをどう書くか
1. 6 練習問題
1. 7 変数
1. 8 名前のつけ方
1. 9 エラー
1.10 練習問題
1.11 宿題
1.1 プログラムとプロセス
プロセスの概念はオペレーティングシステムによって異なります。以下の説明
は UNIX の概念と操作方法に従っています。Dコースの人は CNS にリモート
ログインして試してください。
|
- プログラム(program)とは、コンピュータに対して、ど
のような手順で仕事をすべきかを、書いたものです。
- コンピュータが動いているのは、誰かがプログラムを書いたからです。
- プログラムはファイルの中に記憶されています。例えば、ls と
いうファイルの中には、ファイルの一覧を表示する手順が書かれています。
- ls がどこにあるか探してみましょう。which という
コマンドは、プログラムのファイルがどこにあるか教えてくれます。
- emacs (mule, meadow) で /usr/ucb/ls の内容を見てみましょ
う。これは機械に
理解できる形式ですが、人間には理解できません。(たまに理解できる人がい
て、変人と呼ばれます)
- ls コマンドを実行すると、ディスクから
/usr/ucb/ls の内容が主記憶に読み込まれ、CPU がそこに書かれた
手順を実行します。
- CPU がプログラムを実行している状態を、プロセス
(process)と呼びます。
- 同じプログラムを複数回読み込んで、複数のプロセスとして実行すること
もできます。
- ps コマンドは、現在実行中のプロセスの一覧を表示します。
% ps
PID TT S TIME COMMAND
11491 pts/0 S 0:00 -tcsh
11505 pts/0 R 0:01 emacs
11507 pts/1 R 0:00 /bin/tcsh -i
10396 pts/2 S 0:00 -tcsh
10835 pts/2 S 0:01 twm
%
|
一番左の数字はプロセス番号です。
- プログラムのミスでプロセスが止まらなくなったとき、kill コ
マンドで強制終了させます。
kill でも死なない手強いプロセスには、kill -9 を試し
てみましょう。
1.2 プログラミング言語
- プログラミング言語(programming language)とは、プログラ
ムを書くのに用いられる言語です。自然言語とは違い、文法が厳密に定められ
ている人工的な言語です。
- コンピュータが実行するのは機械語(machine language)で書
かれたプログラムですが、これは人間には理解できないので、人間に理解しや
すいプログラミング言語で書き、それを機械語に翻訳します。翻訳することを
コンパイル(compile)、そのためのソフトをコンパイラ
(compiler)と呼びます。
- コンパイルする元のプログラムをソースプログラム(source
program)、結果のプログラムをオブジェクトプログラム(object
program)と呼びます。
- オブジェクトプログラムを作らず、ソースプログラムを同時通訳しながら
実行する方式もあります。同時通訳するソフトをインタープリタ
(interpreter)と呼びます。
1.3 Java 言語
- 自然言語にいろいろな種類があるように、プログラミング言語にも用
途に応じていろいろな種類があります。
- ここで勉強するのは Java 言語です。
- Java 言語は、インターネットでプログラムをやりとりしやすいように作
られた言語で、急速に普及しつつあります。
- Java 言語はコンパイラとインタプリタの両方を使います。コンパイルし
た結果は本当の機械語ではなく、現実には存在しないコンピュータを想定した
機械語です。これをインタプリタが本当の機械語に翻訳しながら実行します。
- 機械語にコンパイルしない理由は、インターネットを通してプログラムを
送ったとき、相手のコンピュータが違う種類の機械語を使っていると困るから
です。そこで、プログラムは仮想的な機械語で送り、それぞれのコンピュータ
でそれを実行するためのインタプリタを用意します。
- Java 言語のコンパイラ、インタプリタ、その他プログラムの開発に必要
なソフトをまとめたものを JDK (Java Development Kit)と呼びます。
JDK にはいくつかのバージョンがありますが、授業では 1.2.1 を基準にします。
どのバージョンを使っているかは、
% java -version
を実行すれば分かります。
|
1.4 プログラムを実行する手順
実際にプログラムをコンパイルして実行してみましょう。これからファイルを
たくさん作りますから、ホームディレクトリに適当な名前のサブディレクトリ
を作り、その中で作業しましょう。
1.5 プログラムをどう書くか
プログラムを書くのにはテキストエディタを使います。CNS では mule または
emacs、ラップトップでは meadow が使えます。ここではまとめて emacs と表
記します。
|
いきなりプログラムを全部書くのは大変なので、上の練習用プログラムの一部
分を書き換えることから始めます。上のプログラムは次のように動作していま
す。
- まず、SfcExample1 がウィンドウを画面に出します。
- Process というボタンをクリックすると、SfcDoNothing
を呼び出します。
- SfcDoNothing は、何もせずに SfcExample1 へ戻りま
す。
これではつまらないので、Process をクリックすると、Output
のところに Hello, world! というメッセージを表示するように
SfcDoNothing を作り替えてみましょう。
まず、HelloWorld.java というファイルを作り、次のような内容を書
き込みます。
class HelloWorld extends SfcDoNothing {
void sfcProcess () {
sfcOutput("Hello, world!");
}
}
|
- Java 言語のプログラムはクラス(class)という単位で出来てい
ます。1行目は、これが HelloWorld という名前のクラスであること、
SfcDoNothing というクラスに、このクラスの内容を付け加える(拡
張する)ことを示しています。
- ファイル名は、クラス名の後に .java を付けたものでなくては
なりません。
- クラスの本体は1行目の '{' と5行目の '}' で挟まれた部
分です。
- 2行目は sfcProcess という名前のメソッドがここから始まるこ
とを示しています。メソッド(method)とは、実行すべき手順を書
き並べたものです。メソッドの詳しい説明と void の意味は次週以
後に説明します。なお、sfc が付いているのは授業の教材用の機能
という印です。一般のプログラムでは使えません。
- メソッドの本体は2行目の '{' と4行目の '}' で挟まれた部
分です。
- Process ボタンをクリックすると、sfcProcess の本体
が実行されます。
- 3行目は、sfcOutput というメソッドを実行せよという命令です。
- sfcOutput はウィンドウの Output のところにメッセー
ジを表示するメソッドです。
- sfcOutput の後の括弧の中が表示すべきデータです。変化しな
い文字列データは、" で挟んで書きます。
- 空白は、単語を区切るために必要です。さらに余分な空白を入れても構い
ません。行の左端の空白は、プログラムを読みやすくするために、クラス本体
は4個、メソッド本体は8個というふうに数を変えてあります。なお、emacs の
java-mode では TAB キーを押すと自動的に適当な数の空白を入れてくれます。
次に、これをコンパイルします。
% javac HelloWorld.java
%
|
それでは、HelloWorld を SfcDoNothing の代わりに使っ
て実行してみましょう。
% java SfcExample1 HelloWorld
|
ウィンドウの Process ボタンをクリックしてみてください。
1.6 練習問題
HelloWorld.java のメッセージを自分の好きな文章に変えて、コン
パイル、実行しなさい。
1.7 変数
次に、いつも同じメッセージではなく、Process ボタンをクリックし
た回数を表示してみましょう。そのためには、今何回ボタンをクリックしたか
覚えておく必要があります。そのためには変数(variable)を使い
ます。数学の変数とは少し違い、数値や文字などのデータを入れておく箱のこ
とです。
Count.java というファイルを作り、中に次のプログラムを書き込み
ましょう。
class Count extends SfcDoNothing {
int x = 0;
void sfcProcess () {
x = x + 1;
sfcOutput(Integer.toString(x));
}
}
|
- 1行目は、これが Count という名前のクラスであること、
SfcDoNothing というクラスの一部を書き換えたものであることを示
しています。
- クラスの本体は1行目の '{' と7行目の '}' で挟まれた部
分です。
- 2行目は x という名前の変数をこれから使うことを示していま
す。これを変数の宣言(declaration)と呼びます。
変数名の前の int は、この変数
に入れるのは整数値であること、後の =0 は、
最初の値が 0 であることを示しています。
- 2行目はメソッド sfcProcess の外にあることに注意しましょう。
もし中に書くと、Process ボタンをクリックするたびに値が 0 になる
ので、いくらクリックしても数が増えていかなくなります。
- 3行目は sfcProcess という名前のメソッドがここから始まるこ
とを示しています。メソッドの本体は3行目の '{' と6行目の
'}' で挟まれた部分です。
- 4行目は x に入っている数値を 1 増やすための命令です。
x=x+1 という式は、数学的には意味がありませんが、Java では =
の右側を計算した結果を左側の変数の中に入れるという意味です。
- 変数に新しい値を入れることを代入(assignment)と呼びます。
- 5行目は、sfcOutput というメソッドを実行せよという命令です。
括弧の中は、また別のメソッド Integer.toString を実行せよと言
う命令になっています。
- 変数 x の中に入っているのは数値ですが、sfcOutput
に渡すデータは文字列でなくてはなりません。Integer.toString は、
整数値を文字列に変換してくれます。
- x の値が 1 の時、Integer.toString(x) を実行した
結果は "1" になります。したがって、
sfcOutput(Integer.toString(x)) は sfcOutput("1") と
書いたのと同じになります。
次に、これをコンパイルします。
それでは、Count を SfcDoNothing の代わりに使っ
て実行してみましょう。
ウィンドウの Process ボタンをクリックしてみてください。
1.8 名前のつけ方
- クラス名や変数名は好きな名前を使うことができます。ただし、
class や extends など、あらかじめ特別の意味を持って
いる語は使えません。
- 名前はアルファベットと数字を自由に組み合わせて作ることができます。
ただし、途中に空白や記号があったり、先頭が数字で始まったりしてはいけません。
- 名前である: 'abc', 'a123', 'ThisIsANiceName'
- 名前でない: 'A Name', '1a', 'a-b'
- 英単語をつなげた名前は、単語の先頭文字を大文字にする習慣です。
- 日本語文字を使うことも可能ですが、漢字コード変換に関する知識がない
とトラブルの原因になります。アルファベットだけにしておく方が無難です。
1.9 エラー
- プログラミング言語の文法は厳密に決まっているので、一文字でも間違えると
正しく動きません。
- プログラムに含まれる間違いをバグ(bug)と呼びます。
- バグを含むプログラムを動かそうとした場合、コンパイル時に何かがおか
しいということが分かる場合と、コンパイルして実行してみてからおかしいこ
とが分かる場合があります。
- コンパイル時に発見された場合、コンパイラはエラー(error)
として処理します。通常はエラーが発見された場所と、エラーの種類が画面に
表示されます。
- 実行時に発見された場合、インタプリタがエラーを表示します。
- 文法的には正しいけれど、思っていたのと違う結果が出ることもあります。
これは、エラーにはなりませんから、結果を見て直すしかありません。
1.10 練習問題
わざと間違いをして、どのようなエラーが出るか見てみましょう。
- コンパイルするときに指定するファイル名を間違える。
% javac SfcExample.java
- 実行するときに指定するクラス名を間違える。
% java SfcExample1 HalloWorld
- ファイル名とクラス名が一致しない。HelloWorld.java の中の
クラス名を別の名前にして、コンパイル、実行。
- メソッド名を間違える。HelloWorld.java の中の
sfcProcess を別の名前にして、コンパイル、実行。
1.11 宿題
- Count.java を変更し、クリックするたびに 1, 2, 4, 8, 16,
... と倍々に増えていくようにしなさい。
- 誤りをたくさん含んだファイル
/pub/sfc/ipl/1bc/exercise/Erroneous.java を自分の作業ディ
レクトリにコピーし、コンパイルしてみなさい。出てきたエラーを見て、正し
くコンパイルできるように修正しなさい。一つのエラーを修正すると、隠れて
いた他のエラーが現れることがあります。
慶應義塾大学の授業以外での無断利用、複製はご遠慮下さい。
Copyright (c) 1999 慶應義塾大学