*コンパイル [#u42b53f3]
コンピューターは内部で2進数を使ってすべてのものを表しています。
したがって、コンピューターが実行するプログラムも2進数を使って表します。
コンピューターが直接理解できる2進数で表されたプログラムを記述するための言語を''機械語''(''マシン語'')といいます。
ところが、プログラムが2進数で表されていると、人間には理解が難しいです。
そこで、人間がわかる言語でプログラムを書き、それを翻訳して機械語のプログラムに変換します。
この、人間がわかる言語で書かれたプログラムを機械語のプログラムに翻訳することを''コンパイル''といい、コンパイルを行うプログラムを''コンパイラー''といいます。
*コンパイラーとインタープリター [#bdba2093]
コンパイラーでコンパイルするタイプのプログラミング言語では、その言語で書かれたプログラム全体を機械語のプログラムにコンパイルしてから、機械語のプログラムを実行します。
一方で、命令を一つずつ取り出して、解釈と実行を繰り返し行うタイプのプログラミング言語もあります(BASIC, Python, Rubyなど)。
この、命令の解釈と実行を繰り返し行うプログラムを''インタープリター''といいます。
コンパイラーとインタプリターを両方使うプログラミング言語もあります(Javaなど)。
*gcc [#v07e3c3f]
''gcc''は、C言語のコンパイラーのひとつです。
C言語のプログラムをエディターで作成したら、gccを使って機械語のプログラムにコンパイルします。
gccコマンドには、コンパイルするファイルの名前を引数として与えます。
#geshi(sh){{
luna% gcc hello.c
}}
コンパイルが成功すると、''a.out'' という名前の機械語のファイルが作成されます。
*実行 [#of901997]
コンパイルしてできたプログラムを実行するには、実行可能なファイルの名前をコマンドとして指定します。
#geshi(sh){{
luna% a.out
}}
*chmod(おまけ) [#s73ab020]
Linuxでは、ファイルに実行権限が付与されていなければでプログラムを実行できません。
ファイルに実行権限が付与されているかどうかは、lsコマンドに-lオプションをつけてファイルのリストを表示させます。
#geshi(sh){{
luna% ls -l
total 2
-rwxr-xr-x a.out
-rw-r--r-- hello.c
}}
ファイル名の左側に表示されている記号は、最初の一文字がファイルの種類(dはディレクトリー)、その次から3文字ずつセットになって自分の権限、グループの権限、その他の権限を表しています。
rは読み込み (Read)、wは書き込み (Write)、xは実行可能 (eXecute) の権限を表します。
上の例では、a.outには自分にrwx(すべて)の権限、グループとその他にr-x(読み込みと実行)の権限が与えられていて、hello.cには自分にrw-(読み込みと書き込み)の権限、グループとその他にr--(読み込み)の権限が与えられています。
gccでコンパイルして作成される a.out には実行権限が自動的に与えられますが、実行したいファイルに実行権限がない場合は、''chmod''コマンドを使って実行権限を与えないと実行できません。
chmodコマンドには、権限を与える(奪う)相手と与える(奪う)権限を表したものとそのファイルの名前を引数として与えます。
#geshi(sh){{
luna% chmod o-r hello.c
}}
権限は、自分を u、グループを g、その他を o と表し、その後に権限を与えるときはプラス +、奪うときはマイナス - をつけて、最後に与える(奪う)権限の記号をつけて表します。
上の例では、その他のユーザーに対して hello.c の読み込み権限を奪って、ファイルを読めないようにしています。
権限を与える相手とその権限を記号で表す代わりに、3桁の数で表すこともできます。
権限を与えるときは1、与えないときは0として自分、グループ、その他の権限をそれぞれ2進数3ビットで表し、それを10進数に直して3桁の数を作ります。
たとえば、権限を rw-r----- とするとき、これを2進数で 110 100 000 と表し、3ビットずつ10進数にして 640 とします。
#geshi(sh){{
luna% chmod 640 hello.c
}}
644, 640, 600, 755, 750, 700などがよく使われます。
*まとめ [#z62be240]
Cプログラムを(機械語の)実行可能なファイルに変換することを''コンパイル''といい、コンパイルを行うプログラムを''コンパイラー'’といいます。
この授業では、''gcc''というコンパイラーを用いてコンパイルを行います。
gccでコンパイルすると、''a.out''という名前の実行可能なファイルが生成されます。
このa.outを''実行し''ます。
*練習問題 [#vb8242af]
**1B-1 コンパイルと実行(難易度♠) [#x1674be6]
次のプログラムをコンパイルして実行せよ。
#geshi(c){{
#include <stdio.h>
int main(void) {
printf("n\nnn\nnnn\n");
return 0;
}
}}
**1B-2 コンパイルエラーの修正(難易度♠♠) [#e239fb96]
次のプログラムをコンパイルしてエラー・メッセージを確認し、プログラムを修正せよ。
#geshi(c){{
#include stdio.h
int main(void) {
printf("Chubu University\n")
return 0
}
}}