c language sem 01

84
C/C++ ゼゼ (1) ゼゼゼゼゼゼゼゼC ゼゼゼゼゼ 2008.4.12

Upload: kosei-moriyama

Post on 18-Dec-2014

1.860 views

Category:

Technology


2 download

DESCRIPTION

C言語に関する勉強会の資料

TRANSCRIPT

Page 1: C language Sem 01

C/C++ ゼミ (1)

プログラムの原理、 C 言語の原理

2008.4.12

Page 2: C language Sem 01

agenda

プログラムの原理• プログラムとは• 抽象化• コンピュータ・アーキテクチャ• コンパイラ

C 言語の基礎知識• 歴史的な話• 本題

• 変数• 関数• Hello World!

Page 3: C language Sem 01

プログラムの原理

Page 4: C language Sem 01

プログラムとは プログラムへの命令

•手間がかかってめんどい作業を、コンピュータにやらせて楽をする

html や tex はプログラムではない

Page 5: C language Sem 01

プログラム言語

Via http://www.itmedia.co.jp/enterprise/articles/0703/26/news021.html

Page 6: C language Sem 01

0 と 1

コンピュータは 0 と 1 しか理解できない

コンピュータへの命令も 0 と 1 だけで書く必要がある

……0010011101010001……

さすがに理解不能

Page 7: C language Sem 01

マシン語 0 と 1 の命令を、ちょっとだけ読み

やすくした•論理的意味ごとに区切ってある•16 進数に変換してある場合も

10110000 01100001 00110000…

まだきつい

Page 8: C language Sem 01

アセンブリ言語 数字を言葉におきかえた

10110000 01100001

MOV AL, 61

CPU によって命令の名前が変わっちゃう

Page 9: C language Sem 01

高級言語 Fortran, Pascal, C とかが登場 アセンブリ言語よりわかりやすい 書き方も CPU に依存しなくなった

そのかわり、実行時間は遅くなった

MOV AL, 61

a = 61

Page 10: C language Sem 01

プログラム言語

Via http://www.itmedia.co.jp/enterprise/articles/0703/26/news021.html

Page 11: C language Sem 01

プログラム言語はさらに進化 オブジェクト指向

• C++• Java

LL (lightweight language)• Perl• PHP• Ruby• Phyton• javascript

Page 12: C language Sem 01

プログラム言語

Via http://www.itmedia.co.jp/enterprise/articles/0703/26/news021.html

Page 13: C language Sem 01

言語の水準 開発(プログラムを書く)のは楽で

はやい できたプログラムの実行速度はおそ

い スピードが求められる場面では、低

水準言語をつかう 低水準 = 使えない、古い ではない !

Page 14: C language Sem 01

なんでこんなにたくさん言語が?

最終的には 0 と 1 どの言語を使っても、同じプログラ

ムは書ける•チューリング完全というらしい…

ただ、それぞれ得意分野がある それぞれやりたいことに適した言語

を選ぶのが大事

Page 15: C language Sem 01

抽象化

Page 16: C language Sem 01

抽象化とは 必要なものだけを集める いらないものを省く ( イメージしやすいよう名付ける )

01→ マシン語→アセンブラ→高水準言語これも抽象化

Page 17: C language Sem 01

抽象化とは 人は、ある一定以上複雑なことにつ

いて、考えられない 抽象化して、ものごとをわかりやす

く、無駄なことを考えなくてすむようにする

抽象化で複雑さに対抗! コンピュータなんて抽象化でできて

るようなもん

Page 18: C language Sem 01

たとえば

“a = 6” は、アセンブリ言語であらわすと数行になる•必要な処理をまとめている

現実世界にある” =“ を使っているから、処理をイメージしやすい

MOV AL, 61

a = 61

Page 19: C language Sem 01

データと手続き プログラムはデータと手続き ( 制御 )

でできている

プログラムプログラム

データを入力 加工 出力

Page 20: C language Sem 01

構造化プログラミング アセンブラから高水準言語になった

けど、やっぱりまだむずかしい…

手続きを抽象化しよう!•順番に実行する•条件によって分岐する•何度も繰り返す•サブルーチン

Page 21: C language Sem 01

順番に実行する ( 順次 )

処理 1処理 1 処理 2処理 2 処理 3処理 3

Page 22: C language Sem 01

条件によって分岐する ( 分岐 )

条件条件 処理 1処理 1 処理 2処理 2

Page 23: C language Sem 01

何度も繰り返す ( 反復 )

条件条件 処理 1処理 1 処理 2処理 2

Page 24: C language Sem 01

手続き抽象化 この三つで、すべてのアルゴリズム

を記述できる ( らしい ) 組み合わせ爆発をおさえつつ、記述

力は減少していない !

Page 25: C language Sem 01

サブルーチン 関数 (C とか ) 、プロシジャともいう いくつかの処理をひとまとめにし、

ブラックボックス化したもの 中身はさっきの 3 つ ( 順次・分岐・

反復 ) で書く

サブルーチンサブルーチン

入力 加工 出力

Page 26: C language Sem 01

サブルーチンのいいところ ブラックボックスなので、中身を気にせ

ず使い方だけ知っておけばよい• 本来の作業に集中できる

再利用できる ( ライブラリ )• 誰か ( 世界中 !) が作ったのを、流用できる

変更があったとき、そのサブルーチンの中身だけを直せばよい• 他のルーチンには影響しない

処理をイメージしやすい

Page 27: C language Sem 01

構造化プログラミング 大小のサブルーチンで構成 メインルーチンがサブルーチンを呼

び出しながら処理を進める サブルーチンの中身は順次・分岐・

反復で書く

Page 28: C language Sem 01

構造化プログラミング

メインルーチン

サブルーチン

サブルーチン

サブルーチン

サブルーチン

サブルーチン

入力

出力

Page 29: C language Sem 01

データ抽象 手続きは抽象化できたけど、データ

はまだ複雑… データに手続きをくっつける

•データがこういう場合はこう加工する•手元に来るのは、適切に加工されたデ

ータ

オブジェクト指向

Page 30: C language Sem 01

気をつけること 抽象化の度合いと、プログラムの実行時

間はトレードオフ• 適切なレベルのツールを選ぶ必要がある

0 と 1 の世界0 と 1 の世界

マシン語とかマシン語とか

低水準低水準

高水準高水準

超高水準超高水準 超高水準超高水準抽象度高

抽象度低

らくちん

はやい

Page 31: C language Sem 01

気をつけること サブルーチンはブラックボックス でも、中のアルゴリズムがどういう仕組みかは、知っておくべき

ここがよく分かってないと…•効率の悪いプログラムになってしまう•うまくいかなかったとき、どこが悪い

のかわからない

Page 32: C language Sem 01

コンピュータ・アーキテクチャ

Page 33: C language Sem 01

コンピュータの構成

CPUCPU ハードディスク

メモリメモリ

入力インタフェース入力インタフェース 出力インタフェース出力インタフェース

マウス、キーボード、カメラ ディスプレイ、プリンタ、スピーカ

Page 34: C language Sem 01

CPU

計算・加工するところ•実際に計算する部分•処理の順番を決める部分•命令を解釈する部分•データを置いておく部分•外部とデータを受け渡しする部分

データはレジスタに入れておく

Page 35: C language Sem 01

レジスタ データを置いておくところ 読み込み、書き込みが超速い ひとつの CPU に、いくつかついてい

て、それぞれ名前もある

Page 36: C language Sem 01

Via http://en.wikipedia.org/wiki/Central_processing_unit

Page 37: C language Sem 01

メモリとアドレス レジスタに入りきらないデータはメモリにおいておく•必要になったらレジスタに入れて計算

する メモリにはアドレスがある

アドレス0001

0002

0003

メモリデータデータデータ

Page 38: C language Sem 01

ハードディスク レジスタやメモリは、電源を切ると

終わる 長くデータを保存しとく時は、ハー

ドディスクをつかう アクセス時間は超遅い

Page 39: C language Sem 01

プログラムとメモリ プログラムは普段 HD にある 実行するとき、メモリに移される 必要なときにレジスタにデータを移

して計算

CPUCPU ハードディスク

メモリメモリ

レジスタ 遅い 超遅い速い

Page 40: C language Sem 01

コンパイラ

Page 41: C language Sem 01

コンパイラ ソースコードを、コンピュータでも理解

できる 0 と 1 に翻訳してくれるソフト•文を解析• 間違いをチェック• 最適化• 実行可能オブジェクト (.exe とか ) を生成

コンパイラコンパイラ

コンパイル

ソースコード

実行可能オブジェクト

Page 42: C language Sem 01

インタプリタ 命令を受け取って、逐次実行してい

インタプリタインタプリタ

命令

実行

命令

実行

Page 43: C language Sem 01

スクリプト 一文ずつ入力するのはめんどいから

列挙する→スクリプト インタプリタはスクリプトを上から

順番に読んで実行していく スクリプトは台本という意味

Page 44: C language Sem 01

コンパイラとインタプリタ コンパイラ

•最終的に完結した一つのファイルを作る

•できたファイルの実行速度は速い•コンパイルには時間がかかる

インタプリタ•スクリプト単体では動かない•手軽•でかいスクリプトになると遅い

Page 45: C language Sem 01

とりあえずコンパイルしてみる hello.c

• “hello world” と出すプログラム

a.out ができるので、実行する

$ gcc hello.c

$ a.out

Page 46: C language Sem 01

アセンブリ C のコンパイラは、コンパイルする

さい、コードを一度アセンブリ言語に変換する

Page 47: C language Sem 01

のぞいてみる

$ gcc hello.c –S$ gedit hello.s

Page 48: C language Sem 01

リンク ソースコードをコンパイルすると、

オブジェクトファイルができる いくつかのオブジェクトファイルを

つなげて ( リンク ) 、最終的にひとつの実行可能オブジェクトができる•ライブラリを使ったら、ライブラリと

もリンクさせる

Page 49: C language Sem 01

ソースコード オブジェクト

ライブラリ

実行可能オブジェクトコンパイル

リンク

Page 50: C language Sem 01

さっきのコマンドでは、アセンブルして、途中でオブジェクトを作って、リンクまでしてくれているが、ここら辺は自動化されている

$ gcc hello.c

Page 51: C language Sem 01

リンクしてみる hello21.c と hello22.c

$ gcc hello21.c –c hello21.o$ gcc hello22.c –c hello22.o$ gcc hello21.o hello22.o –o hello2$ hello2

hello21.c のオブジェクトファイルを作る hello22.c のオブジェクトファイルを作る hello21.o と hello22.o をリンクして、実行可能オブジェクト hello2 を作る hello2 を実行する

Page 52: C language Sem 01

バイナリ 実行可能オブジェクトは、 0 と 1 の

集まりになっている バイナリデータという バイナリ: 2 進数 画像とかもバイナリ形式

Page 53: C language Sem 01

バイナリファイルの中を見てみる

警告は無視しよう

$ gedit hello2

Page 54: C language Sem 01

C 言語の基礎知識

Page 55: C language Sem 01

C 言語 ( 歴史的な話 )

リッチーとカーニハンが開発( AT&T ベル研 )

仕様がシンプル コンパイラ

Page 56: C language Sem 01

C と C++ と Java

C++ は C に機能を追加したもの Java は C++ を結構参考にしている

C やっとけばオッケー

Page 57: C language Sem 01

抽象度の水準 抽象度の水準がちょうど良いと言わ

れている•実行スピードと開発効率

抽象度が低いので、かなり勉強になる (ポインタとか )

C やっとけばオッケー

Page 58: C language Sem 01

ANSI C

89年に、 C が標準化された ANSI C とよばれる 今のコンパイラはほぼ全部これに従

っている

ANSI C やっとけばオッケー

Page 59: C language Sem 01

本題

Page 60: C language Sem 01

C のプログラムの構成 関数と文と変数 関数

• サブルーチン 関数は 1 つ以上の文から成る

• 関数は 1 つ以上の文から成る•色んな処理を書いたもの• “;” で終わる

変数• データをいれるところ• 実際にはメモリ

Page 61: C language Sem 01

変数

Page 62: C language Sem 01

変数 実際にはメモリ

•メモリ上のどこかに、データを置く領域を確保している

•抽象化されているので、プログラマは実際にはメモリのどこにデータがあるかとかを気にしなくて良い

好きな名前を付けられる データ型がある

Page 63: C language Sem 01

データ型 整数、少数、文字、ポインタ

•そのデータが何なのか、プログラマが知る手がかりとなる

•コンパイラが、間違いを検出できる (文字を足し算したとか )

Page 64: C language Sem 01

宣言 変数を使う前に、宣言をする必要が

ある•宣言した段階で、メモリ上に領域を確保する

•宣言されてない変数が出てくると、コンパイラはメモリのどこを見ればいいのかわからないので、エラーを出す

•変数のスペルミスを防ぐ役割にもなってる

Page 65: C language Sem 01

コード

/* 変数の宣言 */int a;double b;

a = 10;b = 1.5;

Page 66: C language Sem 01

メモリのイメージ

アドレス0001

0002

0003

メモリ10

??

1.5

aa

bb

Page 67: C language Sem 01

関数

Page 68: C language Sem 01

関数 いわゆるサブルーチン

Page 69: C language Sem 01

関数を呼び出す

printf : 関数名 () の中 : 関数へ渡すデータ ( 引数 )

» 引数が沢山ある場合は、” ,” で区切って列挙する

printf(“hello world!!”);

関数名 ( 引数リスト );

Page 70: C language Sem 01

関数からの出力がある場合

出力は” =“ で変数に代入する 関数からの出力を返り値という

result = pow( 5, 2);

Page 71: C language Sem 01

関数を自作int square ( int n ){

int result;

result = n*n;return result;

}

返り値の型 関数名 ( 引数リスト ){中身

}

Page 72: C language Sem 01

関数を宣言する 自作関数は、プログラムの冒頭で宣

言する必要がある•プロトタイプ宣言•プロトタイプ宣言がないと、コンパイ

ラはその関数がどこに書いてあるかがわからない

Page 73: C language Sem 01

プロトタイプ宣言

int square( int n );

int main(void){

...val = square( 5 );...

}

int square( int n ){

...}

Page 74: C language Sem 01

void

引数や返り値がない関数もある 宣言と本体を書く際” void” といれ

int foo(void);

void woo( int n ){...

}

Page 75: C language Sem 01

printf の宣言や本体はどこにある?

プロトタイプ宣言はヘッダファイル(stdio.h) に書かれている

本体はライブラリという別ファイルに書かれている

#include <stdio.h>

Int main(void)

{

int printf(...);

int printf(...)

{

}

stdio.h自作ファイル ライブラリ

Page 76: C language Sem 01

Hello World!

Page 77: C language Sem 01

Hello World!

入力してコンパイル、

#include <stdio.h>

int main(void){

printf(“hello world!\n”);

return 0;}

Page 78: C language Sem 01

#include

ヘッダファイルを読み込むための、特別な命令

頭に # がつく命令は、文末に” ;” がいらない ( プリプロセッサ・ディレクティブ )

stdio.h には、 printf のプロトタイプ宣言が入っている

Page 79: C language Sem 01

標準ライブラリ C に最初からついてくるライブラリ 便利な関数がいっぱい

•stdio.h•stdlib.h•math.h•string.h• ...

Page 80: C language Sem 01

main

メインは特別な関数 必ず最初に実行される ここから色んな関数を呼び出す

Page 81: C language Sem 01

printf

標準出力に文字を出す関数•標準出力は、デフォルトではターミナ

ル (設定で変えられる ) 文字か文字列を与えてあげる

•文字列は”で囲む

Page 82: C language Sem 01

\n と文字 エスケープシーケンス 普通ではあらわしづらい文字 (改行

やタブやバックスペースなど ) を表現する

\n は改行 \t はタブ

Page 83: C language Sem 01

今後の予定

Page 84: C language Sem 01

予定! データ型、演算子、式 制御の流れ 関数 ポインタと配列 (2,3回 ) 構造体 C++ へ