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

Share

C language Sem 01

Download to read offline

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

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

C language Sem 01

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

    Jun. 30, 2018
  • kyosukeharaki

    Apr. 10, 2015

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

Views

Total views

2,693

On Slideshare

0

From embeds

0

Number of embeds

105

Actions

Downloads

22

Shares

0

Comments

0

Likes

2

×