プログラミング演習I

プログラミング演習I
2004年4月28日(第3回)
木村巌
今日やること:知識編:コンパイル
 コンパイルとは何をすることなのか
今日やること:実践編:コンパイルし
てみる
 プリプロセッサ
 コンパイラ
 アセンブラ
 リンカ
 実際に各過程を見てみよう
 教科書1章、2章を参照のこと
ソースコード作成の準備
 準備
 cd
/cygdrive/z/
 mkdir 040428
 cd 040428
ディレクトリの移動
040428というフォルダを作製
そのディレクトリに移動
Cコンパイラの起動

ソースコードの準備



秀丸エディタで、次の内容を打ち込む(半角英数字で)
行頭の空白はタブキーで!
#include <stdio.h>
int
main (void)
{
printf (“Hello World!\n”);
return 0;
}
先ほど作ったフォルダに、Sample1.cという名前で保存
Cコンパイラの起動(続き)
 Cygwinのウィンドウで、
 ls
 自分が打ち込んだ、Sample1.cというファイルがあ
ることを確認
 gcc -o Sample1 Sample1.c
 ./Sample1
 うまくいけば、Hello World!が表示される
Sample1を見ながら
 プログラムは基本的には英数字小
文字で
 #で始まる行は、コンパイラへの指示
int main (void) は、mainという関数が引
数をとらず、整数型の値を返すことを
意味する
 {}に囲まれた部分がmain関数の本体.
 printf()は、引数を書式付で出力する
標準ライブラリ関数
Sample1を見ながら(続き)
関数名を書くと、その関数が実行される
 ただし、main()は特別で、プログラム内で最初に実行
されることが保証される
 関数に対して、カッコ内に引数を書く
 セミコロン;で区切った行が一つのstatement
 引数がprintf()によって印字される
 戻り値0を環境に返す
 改行文字などについては、教科書のLesson 2.2など
を参照

Coding Standard
Coding Standardとは
改行や、行頭の空白の数、括弧の位置などを指定し
たもの
 Cのプログラムは、自由書式で書かれる
 人間が見やすいように!
 しかし統一が必要である(特に複数人で開発すると
きは)
 この授業では、GNU Coding Standardに準拠する(教
科書とは違う).この文書の「C言語の上手な書き
方」参照.

コンパイルとは何か?
 人間が読めるCのソースを、コンピュータが
実行できる形式に翻訳する
 プリプロセス、コンパイル、アセンブル、リン
ク、の過程に分かれる.
コンパイルの各過程(1)
 プリプロセス
*/で挟まれた部分)を空白に置き換える
 #include <ファイル名.h>を、そのファイルの内容と
置き換える
 その他(定数の定義、条件コンパイルなどプリプ
ロセッサの他の機能は後の回で紹介します)
 コメント(/*
コンパイルの各過程(2)
 コンパイル
 プリプロセスがすんだCのソースを、アセンブラへ
翻訳
 アセンブラ?
 機械語ともいう.
 CPUに直接命令する形式の、機械に密着したレ
ベルの言語
 まだ人間が読める(端末に表示できる)
コンパイルの各過程(3)
 アセンブル
 アセンブラを、コンピュータが直接実行できるファ
イルに変換
 できたファイルを、オブジェクトファイルともいう
 この時点で、直接端末に表示することはできない
コンパイルの各過程(4)
 リンク
 オブジェクトファイルを、最終的な実行可能ファイ
ルに変換する
 複数のファイルからなるプログラムなら、それらを
一つに結合
 標準ライブラリ関数、もし必要であれば数学関数
など、他のライブラリを結合
 スタティックリンクとダイナミックリンク
実際に各過程を見てみよう
 前回のSample1.cを例に、各過程を見る
 gcc –E
Sample1.c | less
 これがプリプロセス後のファイル
 gcc –S Sample1.c
 less
Sample1.s
 これが、コンパイル後のアセンブラファイル
実際に各過程を見てみよう(続)
 gcc –c
Sample1.c
 ls Sample1.o
 objdump –d Sample1.o | less
 これがオブジェクトファイルとアセンブラの対応
 gcc –o
Sample1 Sample1.c
 objdump –d Sample1 | less
 これが、実行可能ファイルとアセンブラの対応
 リンカが付加した情報が増えている
書式付き出力printf()
 Cのプログラムでは、文字列だけでなく、様々
な「型」をもつデータを入出力する
 文字定数、整定数、浮動小数点数など
 それらのデータを、文字として出力するのが、
printf()という標準ライブラリ関数
 Lesson 2.3のSample4を参照(p.29--)
まとめ
 実際にソースコードを入力し、コンパイル、実
行という一連の操作を体験した
 「コンパイル」の時に、実際は何が行われてい
るのかを学んだ
レポート課題
 問.実行すると、
My name is 自分の名前(ローマ字で).
と表示するプログラムを作成し、
 コンパイルと実行の仕方
 ソースコードとアセンブラ(.sという拡張子のファイ
ル)
をメールで提出せよ
 締め切り:2004年5月11日一杯(日本時間で)
 提出先:メールで木村([email protected]
u.ac.jp)まで.