SlideShare a Scribd company logo
C/C++ ゼミ (1) プログラムの原理、C言語の原理 2008.4.12
agenda プログラムの原理 プログラムとは 抽象化 コンピュータ・アーキテクチャ コンパイラ C 言語の基礎知識 歴史的な話 本題 変数 関数 Hello World!
プログラムの原理
プログラムとは プログラムへの命令 手間がかかってめんどい作業を、コンピュータにやらせて楽をする html や tex はプログラムではない
プログラム言語 Via http://www.itmedia.co.jp/enterprise/articles/0703/26/news021.html
0と1 コンピュータは 0 と 1 しか理解できない コンピュータへの命令も0と1だけで書く必要がある ……0010011101010001…… さすがに理解不能
マシン語 0と1の命令を、ちょっとだけ読みやすくした 論理的意味ごとに区切ってある 16進数に変換してある場合も 10110000 01100001 00110000… まだきつい
アセンブリ言語 数字を言葉におきかえた 10110000 01100001 MOV AL, 61 CPUによって命令の名前が変わっちゃう
高級言語 Fortran ,  Pascal ,  C とかが登場 アセンブリ言語よりわかりやすい 書き方もCPUに依存しなくなった そのかわり、実行時間は遅くなった MOV AL, 61 a = 61
プログラム言語 Via http://www.itmedia.co.jp/enterprise/articles/0703/26/news021.html
プログラム言語はさらに進化 オブジェクト指向 C++ Java LL (lightweight language) Perl PHP Ruby Phyton javascript
プログラム言語 Via http://www.itmedia.co.jp/enterprise/articles/0703/26/news021.html
言語の水準 開発(プログラムを書く)のは楽ではやい できたプログラムの実行速度はおそい スピードが求められる場面では、低水準言語をつかう 低水準 = 使えない、古い ではない !
なんでこんなにたくさん言語が? 最終的には0と1 どの言語を使っても、同じプログラムは書ける チューリング完全 というらしい… ただ、それぞれ得意分野がある それぞれやりたいことに適した言語を選ぶのが大事
抽象化
抽象化とは 必要なものだけを集める いらないものを省く (イメージしやすいよう名付ける) 01->マシン語->アセンブラ->高水準言語 これも抽象化
抽象化とは 人は、ある一定以上複雑なことについて、考えられない 抽象化して、ものごとを わかりやすく 、無駄なことを 考えなくてすむ ようにする 抽象化で複雑さに対抗! コンピュータなんて抽象化でできてるようなもん
たとえば “a = 6”は、アセンブリ言語であらわすと数行になる 必要な処理をまとめている 現実世界にある”=“を使っているから、処理をイメージしやすい MOV AL, 61 a = 61
データと手続き プログラムは データ と 手続き ( 制御 ) でできている プログラム データを入力 加工 出力
構造化プログラミング アセンブラから高水準言語になったけど、やっぱりまだむずかしい… 手続きを抽象化しよう! 順番に実行する 条件によって分岐する 何度も繰り返す サブルーチン
順番に実行する(順次) 処理 1 処理 2 処理 3
条件によって分岐する(分岐) 条件 処理 1 処理 2
何度も繰り返す(反復) 条件 処理 1 処理 2
手続き抽象化 この三つで、すべてのアルゴリズムを記述できる(らしい) 組み合わせ爆発をおさえつつ、記述力は減少していない!
サブルーチン 関数(Cとか)、プロシジャともいう いくつかの処理をひとまとめにし、 ブラックボックス化 したもの 中身はさっきの3つ(順次・分岐・反復)で書く サブルーチン 入力 加工 出力
サブルーチンのいいところ ブラックボックスなので、 中身を気にせず 使い方だけ知っておけばよい 本来の作業に集中できる 再利用 できる ( ライブラリ ) 誰か ( 世界中 !) が作ったのを、流用できる 変更があったとき、そのサブルーチンの中身だけを直せばよい 他のルーチンには影響しない 処理を イメージ しやすい
構造化プログラミング 大小のサブルーチンで構成 メインルーチンがサブルーチンを呼び出しながら処理を進める サブルーチンの中身は順次・分岐・反復で書く
構造化プログラミング メインルーチン サブルーチン サブルーチン サブルーチン サブルーチン サブルーチン 入力 出力
データ抽象 手続きは抽象化できたけど、データはまだ複雑… データに手続きをくっつける データがこういう場合はこう加工する 手元に来るのは、適切に加工されたデータ オブジェクト指向
気をつけること 抽象化の度合いと、プログラムの実行時間はトレードオフ 適切なレベルのツールを選ぶ必要がある 抽象度高 抽象度低 らくちん はやい 0 と 1 の世界 マシン語とか 低水準 高水準 超高水準 超高水準
気をつけること サブルーチンはブラックボックス でも、 中のアルゴリズムがどういう仕組みか は、知っておくべき ここがよく分かってないと… 効率の悪いプログラムになってしまう うまくいかなかったとき、どこが悪いのかわからない
コンピュータ・アーキテクチャ
コンピュータの構成 CPU ハード ディスク メモリ 入力インタフェース 出力インタフェース マウス、キーボード、カメラ ディスプレイ、プリンタ、スピーカ
CPU 計算・加工 するところ 実際に計算する部分 処理の順番を決める部分 命令を解釈する部分 データを置いておく部分 外部とデータを受け渡しする部分 データは レジスタ に入れておく
レジスタ データを置いておくところ 読み込み、書き込みが超速い ひとつのCPUに、いくつかついていて、それぞれ名前もある
Via http://en.wikipedia.org/wiki/Central_processing_unit
メモリとアドレス レジスタに入りきらないデータは メモリ においておく 必要になったらレジスタに入れて計算する メモリには アドレス がある アドレス 0001 0002 0003 … メモリ データ データ データ …
ハードディスク レジスタやメモリは、電源を切ると終わる 長くデータを保存しとく時は、ハードディスクをつかう アクセス時間は超遅い
プログラムとメモリ プログラムは普段HDにある 実行するとき、メモリに移される 必要なときにレジスタにデータを移して計算 CPU ハード ディスク メモリ レジスタ 遅い 超遅い 速い
コンパイラ
コンパイラ ソースコードを、コンピュータでも理解できる 0 と 1 に翻訳してくれるソフト 文を解析 間違いをチェック 最適化 実行可能オブジェクト (.exe とか ) を生成 コンパイラ コンパイル ソース コード 実行可能 オブジェクト
インタプリタ 命令を受け取って、逐次実行していく インタプリタ 命令 実行 命令 実行
スクリプト 一文ずつ入力するのはめんどいから列挙する-> スクリプト インタプリタはスクリプトを上から順番に読んで実行していく スクリプトは台本という意味
コンパイラとインタプリタ コンパイラ 最終的に完結した一つのファイルを作る できたファイルの実行速度は速い コンパイルには時間がかかる インタプリタ スクリプト単体では動かない 手軽 でかいスクリプトになると遅い
とりあえずコンパイルしてみる hello.c “ hello world” と出すプログラム a.out ができるので、実行する $ gcc hello.c $ a.out
アセンブリ Cのコンパイラは、コンパイルするさい、コードを一度アセンブリ言語に変換する
のぞいてみる $ gcc hello.c –S $ gedit hello.s
リンク ソースコードをコンパイルすると、 オブジェクトファイル ができる いくつかのオブジェクトファイルをつなげて( リンク )、最終的にひとつの実行可能オブジェクトができる ライブラリを使ったら、ライブラリともリンクさせる
ソースコード オブジェクト ライブラリ 実行可能 オブジェクト コンパイル リンク
さっきのコマンドでは、アセンブルして、途中でオブジェクトを作って、リンクまでしてくれているが、ここら辺は自動化されている $ gcc hello.c
リンクしてみる 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 を実行する
バイナリ 実行可能オブジェクトは、0と1の集まりになっている バイナリデータ という バイナリ:2進数 画像とかもバイナリ形式
バイナリファイルの中を見てみる 警告は無視しよう $ gedit hello2
C 言語の基礎知識
C言語(歴史的な話) リッチーとカーニハンが開発(AT&T ベル研) 仕様がシンプル コンパイラ
CとC++とJava C++はCに機能を追加したもの JavaはC++を結構参考にしている C やっとけばオッケー
抽象度の水準 抽象度の水準がちょうど良いと言われている 実行スピードと開発効率 抽象度が低いので、かなり勉強になる(ポインタとか) C やっとけばオッケー
ANSI C 89年に、Cが標準化された ANSI Cとよばれる 今のコンパイラはほぼ全部これに従っている ANSI C やっとけばオッケー
本題
Cのプログラムの構成 関数 と 文 と 変数 関数 サブルーチン 関数は 1 つ以上の文から成る 関数は 1 つ以上の文から成る 色んな処理を書いたもの “ ;” で終わる 変数 データをいれるところ 実際にはメモリ
変数
変数 実際には メモリ メモリ上のどこかに、データを置く領域を確保している 抽象化されているので、プログラマは実際にはメモリのどこにデータがあるかとかを気にしなくて良い 好きな名前 を付けられる データ型 がある
データ型 整数、少数、文字、ポインタ そのデータが何なのか、プログラマが知る手がかりとなる コンパイラが、間違いを検出できる(文字を足し算したとか)
宣言 変数を使う前に、宣言をする必要がある 宣言した段階で、メモリ上に領域を確保する 宣言されてない変数が出てくると、コンパイラはメモリのどこを見ればいいのかわからないので、エラーを出す 変数のスペルミスを防ぐ役割にもなってる
コード /*  変数の宣言  */ int a; double b; a = 10; b = 1.5;
メモリのイメージ アドレス 0001 0002 0003 … メモリ 10 ?? 1.5 … a b
関数
関数 いわゆるサブルーチン
関数を呼び出す printf :  関数名 () の中  :  関数へ渡すデータ ( 引数 ) 引数が沢山ある場合は、” ,” で区切って列挙する printf(“hello world!!”); 関数名  (  引数リスト  );
関数からの出力がある場合 出力は”=“で変数に代入する 関数からの出力を 返り値 という result = pow( 5, 2);
関数を自作 int square ( int n ) { int result; result = n*n; return result; } 返り値の型 関数名  (  引数リスト  ){ 中身 }
関数を宣言する 自作関数は、プログラムの冒頭で宣言する必要がある プロトタイプ宣言 プロトタイプ宣言がないと、コンパイラはその関数がどこに書いてあるかがわからない
プロトタイプ宣言 int square( int n ); int main(void) { ... val = square( 5 ); ... } int square( int n ) { ... }
void 引数や返り値がない関数もある 宣言と本体を書く際”void”といれる int foo(void); void woo( int n ){ ... }
printf の宣言や本体はどこにある? プロトタイプ宣言は ヘッダファイル (stdio.h) に書かれている 本体は ライブラリ という別ファイルに書かれている #include <stdio.h> … Int main(void) { … … int printf(...); … … int printf(...) { … } … stdio.h 自作ファイル ライブラリ
Hello World!
Hello World! 入力してコンパイル、 #include <stdio.h> int main(void) { printf(“hello world!\n”); return 0; }
#include ヘッダファイルを読み込むための、特別な命令 頭に # がつく命令は、文末に” ;” がいらない ( プリプロセッサ・ディレクティブ ) stdio.h には、 printf のプロトタイプ宣言が入っている
標準ライブラリ C に最初からついてくるライブラリ 便利な関数がいっぱい stdio.h stdlib.h math.h string.h ...
main メインは特別な関数 必ず最初に実行される ここから色んな関数を呼び出す
printf 標準出力に文字を出す関数 標準出力は、デフォルトではターミナル(設定で変えられる) 文字か文字列を与えてあげる 文字列は”で囲む
\nと文字 エスケープシーケンス 普通ではあらわしづらい文字(改行やタブやバックスペースなど)を表現する \nは改行 \tはタブ
今後の予定
予定! データ型、演算子、式 制御の流れ 関数 ポインタと配列(2,3回) 構造体 C++へ

More Related Content

PDF
Fpgax 20130830
PDF
Community Open Day 沖縄
PDF
C言語演習(2) - OpenCV
PPT
コンピュータの構成と設計 第3版 第1章 勉強会資料
PDF
DeNAインフラの今とこれから - 今編 -
PDF
【学習メモ#4th】12ステップで作る組込みOS自作入門
PDF
1次ベーシック講座情報第1回 修正版
PDF
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
Fpgax 20130830
Community Open Day 沖縄
C言語演習(2) - OpenCV
コンピュータの構成と設計 第3版 第1章 勉強会資料
DeNAインフラの今とこれから - 今編 -
【学習メモ#4th】12ステップで作る組込みOS自作入門
1次ベーシック講座情報第1回 修正版
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略

Similar to C language Sem 01 (20)

PPTX
Macで開発環境を整える170420
PDF
オペレーティングシステム 第1回-公開用
PDF
seccamp2012 チューター発表
PPT
システムと情報の数理・ネットワーク概論
PDF
IT魔導の書 ~ Grimoire du IT
PDF
2011.09.18 v7から始めるunix まとめ
PDF
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
KEY
ゆるかわPhp
PDF
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
PDF
201110 01 Polytech Center 1
PDF
20130329 rtm2
PPTX
C++ AMPを使ってみよう
PPT
130329 02
PDF
はじめての「R」
PDF
プログラマとデザイナが共有すべきUIに関するAndroidの10の機能
PPTX
Open Source System Administration Framework - Func
PDF
Android道第1回公開用
PDF
(デ部発表用抜粋版)プログラマとデザイナが共有すべきUIに関するAndroidの10の機能
PDF
20130329 rtm3
ODP
Buffer overflow
Macで開発環境を整える170420
オペレーティングシステム 第1回-公開用
seccamp2012 チューター発表
システムと情報の数理・ネットワーク概論
IT魔導の書 ~ Grimoire du IT
2011.09.18 v7から始めるunix まとめ
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
ゆるかわPhp
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
201110 01 Polytech Center 1
20130329 rtm2
C++ AMPを使ってみよう
130329 02
はじめての「R」
プログラマとデザイナが共有すべきUIに関するAndroidの10の機能
Open Source System Administration Framework - Func
Android道第1回公開用
(デ部発表用抜粋版)プログラマとデザイナが共有すべきUIに関するAndroidの10の機能
20130329 rtm3
Buffer overflow
Ad

More from Kosei Moriyama (6)

PDF
Object meta-level control on ECMA Script 5
KEY
Chrome Web Store に登録してみた
KEY
Programming Contest Hacks
PPT
Firefox 学生向けアドオンパック
PDF
Introduction To Google App Engine
PDF
Survey of the Ontology - オントロジーについての調査
Object meta-level control on ECMA Script 5
Chrome Web Store に登録してみた
Programming Contest Hacks
Firefox 学生向けアドオンパック
Introduction To Google App Engine
Survey of the Ontology - オントロジーについての調査
Ad

C language Sem 01