[[PageOutline]] = C 言語チュートリアル = == C 言語って何? == UNIX システム発祥の、割と歴史が古いプログラミング言語です。古い言語でありながら、今でも OS や各種アプリケーションの開発に広く使われています。 === 構造化言語 === C 言語は構造化言語です。これはどういう意味かというと、「○○しなさい」という命令について、その「○○」の処理内容を別の場所で具体的に記述し、その中に書かれている「××しなさい」という命令についても、「××」の処理内容がさらに別の場所で具体的に記述される、ということを繰り返すことで、処理内容をツリー構造として表現できる、ということです。 このスタイルの利点は、処理内容のおおざっぱなシナリオをそのままプログラムとして書き表すことができることです。例えば、お店の POS レジでお会計を済ませた後の、レジ端末おける処理について考えてみましょう。必要な処理として考えられるのは、以下のようなシナリオです。 1. 今回の会計で得た売り上げを、会計システムに通知し、お店の売り上げとして計上する。 1. 今回販売した商品の品番と個数を、在庫管理システムに通知し、在庫情報を更新する。 1. 今回の会計の担当者と販売した商品の情報を、従業員管理システムに通知し、従業員の販売成績として記録する。 この処理全体を行う関数を onSelled() とし、 1 の処理を行う関数を notifyProceeds() 、 2 の処理を行う関数を notifyStockConsumption() 、 3 の処理を行う関数を notifyEmployeesSale() とすると、 onSelled() 関数は以下のように書くことができます。 {{{ /** @brief レジでの販売会計後に呼ばれる関数 @param commodity_info 商品の情報データへのポインタ @param sum 売上金額 @param uid 担当者の従業員 ID */ void onSelled(const item_info_t *commodity_info, long sum, uid_t uid) { notifyProceeds(sum); notifyStockConsumption(commodity_info); notifyEmployeesSale(uid, commodity_info); } }}} notifyProceeds() などの関数が実際にどんな処理を行うかは、それぞれの関数における定義の中でさらに詳細に記述されることになります。 === コンパイラ言語 === C 言語は、同時にコンパイラ言語でもあります。コンパイラの定義も種々ありますが、人が直感的に理解しやすい高級言語で書かれたプログラムやデータを、コンピュータや OS、アプリケーションなどの「処理系」が理解できる情報に変換することをコンパイルと呼び、そのコンパイルを行うプログラムのことをコンパイラと呼びます。 C コンパイラの場合、 C 言語で書かれたプログラムを、アセンブリ言語で書かれたプログラムに変換します[[FootNote(最終的には実行ファイルに変換されるのですが、一般的な C コンパイラコマンドは、「前処理」を行うプリプロセッサ、 C 言語をアセンブリ言語に変換するコンパイラと、アセンブリ言語をバイナリデータに変換するアセンブラ、バイナリデータの名前を解決して実行可能なファイルに変換するリンカ、の 4つのプログラムを組み合わせたものです。)]]。 プログラム・ソースを読み込みながら逐次実行するインタプリタ言語 (BASIC など) と比べると、コンパイラ言語はその特徴として、文法的に完結していることがわかりやすいルールになっている、ということが上げられます。 C 言語の場合、関数などの処理の単位はブレース "{" ~ "}" で括られた'''ブロック'''として表現されます。開きブレースと閉じブレースの数が合わなければ、当然文法エラーと見なされ、コンパイルを行う時点でエラーとしてはじかれます。