02: C 言語のコンパイル

C プログラミング入門
基幹7 (水5)
02: C 言語のコンパイル
Linux にログインし、以下の講義
ページを開いておくこと
http://www-it.sci.waseda.ac.jp/teachers/
w483692/CPR1/
2016-04-13
1
アンケート結果
回答数 80
単位:人
Linux の経験
60
50
40
30
20
10
0
C 言語の経験
48
26
4
1
Linux の経験
1
60
50
40
30
20
10
0
50
21
8
1
C 言語の経験
2
C プログラミング体験: 目次
1. C で書かれたプログラム(ソースコード)を
テキストエディタで作成する
2. 端末エミュレータでコンパイルをする
3. できたプログラム(実行ファイル)を実行す
る
4. うまく動くまで、プログラムを修正する
手順は、講義資料ページに掲載しているの
で、それを読みながら進めてください
3
C プログラミング体験(1): ソースコード作成
1. 前回ホームに作成したフォルダ CPR1 の中
にフォルダ 02 を作成(今日の演習用)
2. 右クリックして、新しいファイルを作成
3. 名前を hello.c とする
4.ダブルクリックして開く。
 ただし、初期設定では前回使った gedit ではな
いエディタが開いてしまうので、まず右クリック
してプロパティを開き、「開き方」で gedit を
選択して変更する。
4
Hello, world
#include <stdio.h>
環境によって、円マークで
表示されたり、バックス
ラッシュ(\)で書かれ
る。スライド資料では、
バックスラッシュを表示す
るのが難しいので、円マー
クで統一します。
int main(void)
{
printf("Hello, world!\n");
return 0;
}
5
C プログラミング体験(2): コンパイル
1. 02 のフォルダ内で、ファイルのない部分を
右クリックして、「端末の中に開く」
2. 以下のコマンドを入力する(コンパイル)
$ gcc hello.c -o hello -Wall -Wextra
 成功の場合は、何も表示されない
 プログラムにミスがある場合は、エラーメッセー
ジが表示される
3. プログラムを修正して、再度コンパイルをす
ることを繰り返す(デバッグ)
6
C プログラミング体験(3): 実行
1. プログラムの実行ファイルを確認
$ ls
 コンパイルに成功していれば hello.c のほかに
実行ファイル hello が表示される
2. 実行
$ ./hello
 文字列が表示され、コマンドプロンプトが再び表
示される
7
C 言語の歴史
1973 年、それまで機械語で書か
れていた UNIX の開発を簡単にす
るために AT&T 研究所の Dennis
Ritchie が開発
すでにつくられていたB言語を改良
1978年、Dennis Ritchie と
Brian Kernighan が解説書 “The
C Programming Language”
を出版 (通称 K&R)
8
言語仕様の規格
1999: C99
1978: K&R
•“The C
Programming
Language”
•ISO/IEC
9899:1999
•JIS X
3010:2003
デファクト
スタンダード
C99/C11 に対応した
教科書などは最近
徐々に増加している
大改訂
現在も C89 の仕様が
一般的に使用されて
いる
(ANSI C 準拠など
と書かれている)
1989:
ANSI C
(C89)
2011: C11
•ISO/IEC
9899:2011
•ISO/IEC
9899:1990
•JIS X
3010:1993
9
講義で学ぶ事項
文法
• 主に C89
• キーワードや式
標準ライブラリ
• 何が提供されているのか
• どのように使用するのか
データ構造
• コンピュータでのデータの扱い
アルゴリズム
• 問題を解く方法
主に秋期「C プログラミング」で扱う
10
コンパイラ (compiler)
C のソースコードをコンピュータが理解する
機械語に変換するためのプログラム
コンパイラで変換を行うことをコンパイルと
いう
コンパイラは、文法的に正しくないコードに
対して、エラーまたは警告を報告する
今日は全員、コンパイルと実行ができるよう
になってください
11
GCC について
Linux で標準的に使われるコンパイラ
詳しい説明は講義資料ページ参照
現在は、 C89 としてソースコードを解釈する
が、オプションを付ければ C99 や C11 を使
うこともできる
12
プログラムの様々な名称:全体
ディレクティブ
#include <stdio.h>
特殊な指定
※詳しい解説はあとで。
int main(void)
{
printf("Hello, world!\n");
return 0;
}
関数定義
main という関数を
定義している
※数学でいう関数とは
意味合いが異なる
(詳細は次回)
13
プログラムの様々な名称: 関数
#include <stdio.h>
int main(void)
{ 関数名
printf("Hello, world!\n");
return 0;
}
文 (関数呼び出し)
文 (制御構造)
キーワード
14
疑問
#include って何しているの?
int とか void って何?
最後の return 0 の意味は?
今後の講義で少しずつ、解説していきます
15
C 言語の全体構造
幾つかの関数 (function) で構成される
手続き (procedure) とも呼ばれ、C は手続き型言
語と呼ばれる。関数型言語ではない(詳しくは調べ
てください)
main という名前の関数を必ず一つ含む
数学でいう関数とは似ているところもあるが異な
る
OS はプログラムを実行すると、 main 関数
を呼び出す(=実行する)
16
関数とは
プログラムを構成する単位
任意の関数名の後に引数列と呼ばれる部分を
含む ( ) が付き、そのあとに文が続く
幾つかの文の列が { } に囲まれて書かれる
上から順に実行される
1つの文は、; (セミコロン) で終わる
複数の文を { } で囲んでまとめたものをブロック
といい、キーワードによって特別な制御がされる
関数の詳しい説明は次回以降説明
17
フリーフォーマット
字句(トークン)の区切りが明確なら、自由
に空白や改行を入れることが出来る。
書き方のルールをコーディングスタイルとい
う。
バグを減らす・他人と共有する・未来の自分が読
むためには、読みやすくすることが重要
タブで字下げ
#include <stdio.h>
int main(void)
{
printf("Hello, world!\n"); 空白で区切り
return 0;
改行で区切り
}
18
フリーフォーマットの例
以下の3つの例はすべて同じプログラムです
が、どれが読みやすいですか?
#include <stdio.h>
int main(void)
{
printf("Hello, world!\n");
return 0;
}
#include <stdio.h>
int main (
void) { printf(
world!\n"
);
return
0;
}
"Hello,
#include <stdio.h>
int main(void){printf("Hello, world!\n");return 0;}
19
ホワイトスペース (whitespace)
空白 (space)
タブ (tab)
Tab |
幅が設定によって可変
改行文字
Enter ↲
エディタ上では折り返して表示される
空白類文字
空白、タブ、改行(といくつか)の総称
ホワイトスペース(空白類文字列)
空白類文字の連続
20
字下げ・インデント (indentation)
ブロックの中を字下げし
て、読みやすくする
人によって書き方が違う
空白
空白
空白
タブ
8
4
2
1
つ
つ
つ
つ
講義資料では
空白 2 つ分
タブと空白は見た目で区別
ができませんが必ず使い分
けること
レポートの評価対象の一つ
#include <stdio.h>
int main(void)
{
printf("Hello, world!\n");
return 0;
}
21
コメント (comment, remark)
/* と */ で囲まれた部分
入れ子にはできない
内容は無視される
ソースコード内に、情報を書き込むために使用
C99 では // で始まるコメントも追加された
行末までがコメントとなる
もともと C++ 言語で使われる文法
一般的なコンパイラでは独自拡張として対応
C89 では仕様違反だが、使用しても問題になるこ
とはおそらく無い
22
コメントの例
/*
* こんにちは世界、と表示するプログラム
* by Mochizuki
*/
#include <stdio.h>
/* メイン関数 */
int main(void)
{
// print a message
printf("Hello, world!\n"); // Cool!
return 0;
}
23
コンピュータの計算の仕組み
コンピュータ
実行ファイルの中身=機械語
(machine language)
0100010000110101
0101010101111101
0101010101010101
0101010010101111
1111110000000101
0101010110100101
記憶装置
CPU
実行
(memory)
読み書き
I/O 制御
コンパイル
ソースコード
int main(void)
{
printf(“...
周辺機器
(peripheral)
24
メモリ(記憶装置)
CPU が読み書きする装置
コンピュータが計算する=メモリの読み書き
2つの状態を持つスイッチのようなものがた
くさん並んで入っている
状態は変更するまで維持される(記憶)
電気を切ると状態が失われる(揮発性)
数、文字、画像、動画、音声などを記憶する
どうやって?
25
メモリのサイズ
状態 1 つ分を bit, 8 つで byte という単位で
表現する
例: 4GB のメモリ
= 4 × 1024 MB = 4 × (1024)2 KB = 4 × (1024)3
byte = 4 × (1024)3 × 8 bit = 68,719,476,736 bit
1 bit
…
1 byte (B)
色で、状態 (スイッチの
ON/OFF) を表現している
26
メモリ上の表現: 数値
正の整数は 2 進法で表
現
8bit では 0~255 の
256 通り表現可能
負の整数は最上位ビッ
トを符号とみなす
複数の表現がある
小数
IEEE754 などの規格
 難しいけどうまくできそうですよね?
正の整数
2進数
0
00000000
1
00000001
2
00000010
…
…
254
11111110
255
11111111
メモリの状態を 0 か 1 とみなして、
8 bit ごとに整数だと思う場合の例
■■■■■■□■■□□■■□□■■□
253
25
27
メモリ上の表現: 文字
文字それぞれに番号(文字
コード)を振る
文字コードにはたくさん種類
がある
ASCII: アルファベットのコー
ド(右表)
JIS 漢字コード: 日本語用の文
字コード
Unicode: 世界中の文字に番号
を振ったコード
0
1
2
0
3
4
5
6
7
0
@
P
`
p
1
!
1
A
Q
a
q
2
"
2
B
R
b
r
3
#
3
C
S
c
s
4
$
4
D
T
d
t
5
%
5
E
U
e
u
6
&
6
F
V
f
v
7
'
7
G
W
g
w
8
(
8
H
X
h
x
9
)
9
I
Y
I
y
A
*
:
J
Z
j
z
B
+
;
K
[
k
{
C
,
<
L
\
l
|
D
-
=
M
]
m
}
E
.
>
N
^
n
~
F
/
?
O
_
o
28
メモリ上の表現: 画像
グレースケール画像の場合
サイズをあらかじめ決めておく
1ピクセルの濃淡値を 0~255 で表現 (0:黒, 255:
白)
メモリの中身
画像は画素の集まりで
できている。これを
ディジタル画像という。
48
52
122
…
1マスは 8bit (1byte) で整
数を表したもの
カラーの場合は通常 RGB の 3 バイトで1ピクセルを表現
29
データ表現
どんなデータでも、数値として表すことがで
きれば、メモリやファイルに格納できる
C 言語では、整数や小数だけでなく、画像の
ような複雑な構造を持ったデータを簡単に扱
える機能がある
以下のデータをどうやってメモリやファイル
に格納するか?どうやって探し出すか?を考
えるのが秋期の講義の目的
学生の成績情報、回路の配線図、地震のシミュ
レーション、音楽、パズルの答え、 etc…
30