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