C プログラミングの手順
テキスト第1章の最初に説明されているように, C言語のプログラムを書いてから実行するまでには, 以下の手順を踏みます.
-
ソースプログラムを書く.
-
ソースプログラムをコンパイルして, 実行プログラムを作る.
-
実行プログラムを実行する.
ソースプログラムの作成には Emacs を使います. ソースプログラムのコンパイルと,実行プログラムの実行は, ターミナルから行います. 以下に,これらの方法を説明します.
ソースプログラムを書く
C 言語の文法に従ってわれわれが直接に書くプログラムを, ソースプログラムと呼びます. この授業では, ひとつのソースプログラムはひとつのソースファイルとなります. 実際の大きなプログラムは,しばしば複数のファイルに分割されます.
ターミナルを立ち上げ, 授業用のフォルダ(下図では densan2)に移動しておきます. ターミナルは 授業用ディレクトリの作成 を行ったときに使いましたね.
ターミナルを起動すると, ホームディレクトリがワーキングディレクトリになっています. ホームディレクトリの下にある授業用ディレクトリ(densan2)に移動するには, cd コマンド使って,
cd densan2
とします(上図参照).続いて,pwd コマンドで, 現在のワーキングディレクトリが授業用ディレクトリであることを確認しましょう.
Emacs を立ち上げます. Emacs は パスの設定 を行ったときに使いましたね.
テキストでの最初のプログラム List 1-1(p.2)を書きます. このプログラムのソースファイルの名前は, list0101.c としましょう. Emacs では,新規にファイルを作成するときにも, ファイルを開くという操作をするのでした. コントロールキー [Ctrl] を押しながら,[x] キーを同時に押して, 両方のキーから指を離してください. 続いて, コントロールキー [Ctrl] を押しながら,[f] キーを同時に押してください. この一連のキー操作は,C-x C-f と表記するのでした. すると,Emacs のウィンドウの一番下にある細い領域 (ミニバッファ)に,
Find file /
と表示されます. 設定によっては表示が異なりますが,Find file: と表示されていれば問題ありません. うまくいかなければ, コントロールキー [Ctrl] を押しながら,[g] キーを同時に押して, 入力中のコマンドを中止します. 入力中のコマンドを中止すると,ミニバッファに Quit と表示されます. そうしたら,最初(C-x)からやり直してください.
ソースファイル(list0101.c)は授業用ディレクトリに作りたいので, 下図のように,
Find file: ~/densan2/list0101.c
とミニバッファに入力して,[Return] キーを押してください. 先頭のチルダ(~)はホームディレクトリを意味します. ホームディレクトリには授業用のディレクトリ(densan2)があります. この授業用ディレクトリに list0101.c というファイルを作成することになります.
上図のようにミニバッファに入力すると,
(New File)
と表示され,新規ファイルが開かれます, この時点では,授業用フォルダの中にはまだ新しいファイルは作られていません (ターミナルで ls コマンドを打ってみるとわかります).
ファイルの拡張子を .c とするところがポイントです. こうすると,Emacs は C のソースファイルを作成するのだと判断し, それを支援する「C モード」というモードに移行します. Emacs には様々なモードが用意されていて, 目的に応じた入力支援をしてくれます.
下に示すように, ソースプログラム List 1-1 を入力してください. テキスト(p.2)に示されているプログラムと同じですが, 注釈は省略しています. テキストでは「余白はタブキーあるいはスペースキーで打ち込む」と書かれていますが, Emacs の C モードでは,余白(インデント)は自動的に挿入されます.
プログラムが書けたら保存します. コントロールキー [Ctrl] を押しながら,[x] キーを同時に押して, 両方のキーから指を離してください. すると, Emacs のウィンドウの一番下にある細い領域(ミニバッファ)に, 下図のように C-x- と表示されます.
続いて, コントロールキー [Ctrl] を押しながら,[s] キーを同時に押してください. この一連のキー操作は,ファイルの「上書き保存」であり, C-x C-s と表記するのでした. ミニバッファに, ファイルが表示されたというメッセージ (下図では,Wrote /home07/latsushi/densan2/list0101.c)が表示されます.
ターミナルで ls コマンドを打ってみると, list0101.c というファイルができていることがわかります
ソースファイルのコンパイル
テキストの p.2 から p.3 で説明されているように, C 言語で書かれたソースファイルは, コンピュータが理解できる形式に翻訳する必要があります (p.5 の Column 1-1 も参照してください). このプロセスをコンパイルと呼びます. コンパイルの次にリンクというプロセスがあります. リンクはプログラムの実行に必要なファイルを連結するプロセスです. テキストではリンクについての説明はまったくありませんので, ここではリンクのプロセスも含めてコンパイルと呼んでおきます. 実際,コンパイルとリンクはひとつのコマンドで実行できるので, リンクのプロセスも含めてコンパイルと呼ぶことはよくあります.
作成したソースファイル list0101.c のコンパイルはターミナルから行います. ターミナルで,
clang list0101.c
と入力して [Return] キーを押すと(clang のあとに半角スペースが必要), コンパイル(リンクを含む)が実行されます. clang(クラン) はコンパイルを実行するプログラム (コンパイラと呼びます)の名前です.
エラーがなければ,何も表示されることなく, 次のコマンドを入力可能な状態に元に戻ります. これには数秒かかるかもしれません.
ソースプログラムに何らかの文法的な誤りがある場合には, エラーメッセージが表示されます. この場合には,エラーメッセージを手がかりにして, プログラムを修正してソースファイルを保存し直し, 再度コンパイルを試みることになります. 最初のうちはエラーメッセージを読んでもよく意味がわからないと思いますが, いろいろなエラーを経験することで, だんだんと意味がわかるようになっていきます.
エラーなくコンパイルに成功したら, ターミナルで ls と打ってみると, a.out というファイルができているのがわかります.
実行ファイルを走らせる
今述べたようにコンパイルを実行すると, ソースファイルの名前が何であれ, 実行ファイルの名前は a.out になってしまいます. もっと適切な名前の実行ファイルを出力するには, 出力ファイル名を指定する必要があります. これは後で説明することにして, ひとまず a.out を実行することにします.
授業用ディレクトリにパスが通っていれば, ターミナルで
a.out
と入力して [Return] キーを押すことで,このプログラムが実行されます. パスが通っていない場合には,
~/densan2/a.out
というように,実行ファイルがある場所を完全に示してください. チルダ(~)はホームディレクトリを意味します. 現在のワーキングディレクトリが授業用ディレクトリ(densan2)ならば,
./a.out
としてもいいです. 最初のドット(.)は現在のワーキングディレクトリを意味します. 実行プログラム a.out を走らせると,下図のような出力が得られます.
このプログラムは 15 + 37 という計算の結果を表示するプログラムですので, 52という数字が左下に出力されています. テキストの Column 1-2(p.6)で説明されているように, 改行が入っていないので出力が少しわかりにくくなっています.
実行ファイルの名前をもっと適切なものにしましょう. コンパイルの時に出力ファイル名を指定してやります. ターミナルで上向き矢印を1回押すと, 直前に入力したコマンドが表示されます. もう1回押すと,もうひとつ前に入力したコマンドが表示されます. 上向き矢印を何回か押して,コンパイルのコマンド
clang list0101.c
を表示させてください.これを書き換えます. カーソルを動かして,途中に -o list0101 というオプションを加えます.
clang -o list0101 list0101.c
として [Return] キーを押してください. このオプションは出力ファイル名を指定しています. -o の後に書かれた list0101 が出力ファイル名となります. ターミナルで ls と打ってみると, list0101 というファイルができています.
ターミナルで list0101 と入力して [Return] キーを押してください. 実行ファイル list0101 が実行されます.
実行ファイル a.out を削除したければ, ターミナルで
rm a.out
と入力して [Return] キーを押せば削除できます(rm の後に半角スペースが必要). このコマンド rm は remove の意味です.
この rm コマンドは注意して使う必要があります. 削除するよう指定したファイルは,ごみ箱に移されることなく, そのまま削除されてしまうからです.
Emacs およびターミナルの終了
次のプログラムを Emacs で書くには, C-x C-f というキー操作で,新たにファイルを作成してください. 今まで編集していたプログラム(list0101.c) を閉じる必要はありません(閉じることはもちろん可能ですが).
Emacs を終了するには,C-x C-c というキー操作をします. コントロールキー [Ctrl] を押しながら, [x] キーを同時に押してください. 続いて,コントロールキー [Ctrl] を押しながら, [c] キーを同時に押して,両方のキーから指を離してください. これで Emacs が終了されます.
ターミナルを終了するには, 最初にターミナルから exit と力して [Return] キーを押します. 教室の Msc では,これでウィンドウが閉じられます. 続いて. メニューから「ターミナルを終了」を選びます.