授業で教えた,「コンパイルと実行のコマンド」を,並べてみます.ソースファイルはprogram.cとします.
cc program.c ./a.out
cc -o program program.c ./program
cc program.c -o program ./program
make program ./program
make program && ./program
コンパイル方法として有用なのは,3番目と5番目です.
3番目のように書くと,実行するときは,[.][/][Altl+/][Enter]の4つのキータイプですみます.シェル(bash)で,Altを押しながら/を押すと*1,直前のコマンドの最後の引数が出てきます.
またこの方法に,コンパイルオプションを追加することができます.例えば
- 「cc program.c -Wall -o program」のように書いて,program.cの問題点を見つけ出したりできますし,
- 「cc program.c -lm -o program」のように書いて,sinとかexpとかいった,数学に関するライブラリ関数を使うことができるようになります.
「-Wall」は,私は「ウォールオプション」と読んでいますが,意味は「-W」(警告に関するオプション)と「all」(すべての不審な情報を警告する)の組み合わせです.
「-o program」を「-oprogram」と書いても,手元のコンパイラではきちんとprogramという名前の実行ファイルができましたが,コマンド実行の慣習として,「-o」と,実行ファイルの名前の間には,空白文字を入れておくものです.
makeコマンドは,原則は「Makefileという名前のファイルに書かれている指示に従って,ターゲットとなるファイルを作っていく」というものです.ですが,いつからか*2,Makefileがなくても,「make αを実行したとき,α.cがあれば,cc -o α α.cを実行してくれる」ようになりました.ということで,最もキーストローク数の少ないコンパイル方法だと思います.
最後の「&&」を使った例ですが,これは,まずmake programを実行します.そして正常に終了したときに限り,次の./programを実行します.これはまるで,Cの論理積演算子に似ていますが,ここの「&&」は実行コマンドの一部であり,シェルが解釈します.
なお,「make program; ./program」と書くこともできますが,この「;」は単純な接続を表し,make programが成功しても失敗しても,./programを実行することになります.コンパイルに失敗したら,実行ファイルができないので,./programはおそらくまともに実行できずに終わるでしょう.複数のコマンドを並べて書くとき,「&&」と「;」の区別はしたいです*3.
最後の実行方法のメリットですが,このように,コンパイルと実行を一つのコマンドで書けば,もう一度コンパイルと実行をやり直すには,[↑][Enter]の2回で済みます.コンパイルと実行を別々のコマンドにしていれば,[↑][↑][Enter][↑][↑][Enter]としないといけません.どこに,キーストローク数という手間(コスト)を減らすか,という問題です.