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
© Copyright 2024 ExpyDoc