プログラミング言語 I 第 1 回 プログラムと C 言語
埼玉大学電気電子システム工学科 伊藤 和人
Copyright ©2008 Kazuhito Ito
この講義の目的
ディジタル計算機のプログラミング言語とし て現在最も広く使用されている C
言語を学ぶ 学習・研究などで、必要なソフトウェアを自分で 作成する
様々なデータ構造を知る
プログラム=アルゴリズム+データ構造
用途の広い一般的なアルゴリズムを知る
並べ替え処理(sort)、最短経路問題
Copyright ©2008 Kazuhito Ito
講義展開
プログラムとC言語 アルゴリズムとプログラム コンピュータ・グラフィックス
1
オブジェクト指向 パズル2 パズル1 コンピュータ・グラフィックス2
ソート πの計算
1
πの計算2 期末試験最短経路問題 迷路
1
10 9 2
3 4 5 6 7 8
11 12 13 14 15
中間試験中間試験解答
Copyright ©2008 Kazuhito Ito
成績評価
評価対象
小テスト、レポート(?回)、中間試験、期末試験
評価方法
小テスト: 10%、レポート: 20%、
中間試験: 30% 、期末試験: 40%
総合評価点は100点満点
評価基準
優: GP 3.0以上
良: GP 2.0以上3.0未満
可: GP 1.0以上2.0未満
不可: GP 1.0未満 出席回数が
2/3
未満は「欠」Copyright ©2008 Kazuhito Ito
その他
担当
伊藤和人
(
電気電子システム工学科棟2
階211
号室)
TEL: 048-858-3731
Email: [email protected]
講義資料
講義で使用するスライドをホームページに掲載
必要ならばダウンロードして講義に持参
オフィスアワー
質問は講義時間中にいつでも受け付け
木曜日昼休み
時間がかかる場合は別途時間を予約
http://www.elc.ees.saitama-u.ac.jp/ProgrammingI/
Copyright ©2008 Kazuhito Ito
プログラムとは
「プログラム」と聞いて何を思う?
運動会のプログラム
発表会のプログラム
「プログラム」とは
(1)
物事の予定。番組。(2)映画・演劇・コンサートなど各種の催しの、
番組・組み合わせ・順序・筋などを書いたもの。
物事の進め方、手順を書き表したもの
計算機に行わせたいことの手順を表したもの
(3)コンピューターに、情報処理を行うための動作手順
を指定するもの。また、それを作成すること。
三省堂提供「大辞林 第二版」より
JABEE認定教育プログラム
Copyright ©2008 Kazuhito Ito
プログラムの表し方
計算機に行って欲しいことをどうやって計算 機に伝えるか
例: 「πを10万桁の精度で計算しなさい」
今のところまだ計算機は日本語 ( 自然言語 ) によるプログラムは理解できない
最近のロボットの「会話」とは違うので注意
人間が努力して、計算機が理解できる言葉 でプログラムを表現する必要あり
そのための言語
プログラミング言語Copyright ©2008 Kazuhito Ito
プログラミング言語のレベル
人間の努力の程度によって 3 つのレベルの プログラミング言語あり
機械語(マシン語)
アセンブリ言語
高級プログラミング言語
Copyright ©2008 Kazuhito Ito
機械語
計算機の母国語
ディジタル計算機が直接理解する0,1のビットパ ターンによって処理を表す
例: 0000 0100 0000 0001 レジスタALに1を加算する
例: 0011 1100 0000 0001 レジスタALの値と1を比較する
個々の処理単位を命令(Instruction)という Pentiumの例
計算機の種類によって異なる
Copyright ©2008 Kazuhito Ito
アセンブリ言語
機械語命令に人間が分かりやすい単語(ニモ ニック ) を割り当て
例: ADD AL, 1・・・レジスタALに1を加算(add)
0000 0100 0000 0001 (機械語)
例: CMP AL, 1・・・レジスタALの値と1を比較
(compare) 0011 1100 0000 0001 (機械語)
機械語とアセンブリ言語は1対1に対応
変換ツール「アセンブラ」によってアセンブリ言語 プログラムを機械語プログラムに変換
Copyright ©2008 Kazuhito Ito
Z80用機械語
PowerPC用機械語
機械語、アセンブリ言語の問題 1
プロセッサ種類ごとに異なった言語
Pentium Pentium用機械語
アセンブリ言語
アセンブリ言語 アセンブリ言語
SPARC用機械語
アセンブリ言語互換性なし
H8
H8用機械語
アセンブリ言語互換性なし
Z80
SPARC
PowerPC
Copyright ©2008 Kazuhito Ito
機械語、アセンブリ言語の問題 2
計算機 ( プロセッサ ) が行う個々の処理は 極めて単純 ( 加算、減算、比較、コピー ,...) ちょっとした処理でも多くの命令が必要
もっと簡単で、人間が分かりやすいプログ ラミング言語が必要
pushl %ebp movl %esp,%ebp subl $24,%esp movl $0,-4(%ebp) movl $1,-8(%ebp) movl -8(%ebp),%eax addl %eax,-4(%ebp)
x
←0 y
←1 x
←x+y
左のプログラム の意味高級プログラミング言語
アセンブリ言語 プログラム
Copyright ©2008 Kazuhito Ito
高級プログラミング言語
プログラムを表記する上で、人間にとって 分かりやすい言語
自然言語 ( 日本語、英語、 ...) ではない
自然言語は「曖昧さ」が避けられず、厳密にプ ログラムを表すには不適当
大規模で、複雑なプログラムを開発可能
計算機が普及し、身近になった要因
int x,y;
x = 0;
y = 1;
x = x+y;
x
←0 y
←1 x
←x+y
左のプログラムの意味 高級言語プログラムニュアンス、行間
Copyright ©2008 Kazuhito Ito
高級プログラミング言語の例 1
FORTRAN (1957 年 )
最初の高級プログラミング言語
FORmula TRANslatorの略
名前が表すように科学技術計算を得意とする
実数演算、複素数演算が可能
ALGOL (1958 年~ 1962 年 )
ALGOrithmic Language
科学技術計算用のプログラミング言語
以降の高級プログラミング言語に多大な影響 を与えた
Copyright ©2008 Kazuhito Ito
高級プログラミング言語の例2
COBOL (1960年)
COmmon Business Oriented Language
10進演算の際に誤差がでないように計算
LISP (1962 年 )
LISt Processor
関数型プログラミング言語
関数の再帰的定義が可能
記号処理分野で利用される
Copyright ©2008 Kazuhito Ito
高級プログラミング言語の例3
BASIC (1960年台)
教育用のプログラミング言語
科学技術計算もこなす
1980年代にパソコンに搭載されて普及した
Pascal (1971 年 )
プログラミング教育用に開発された高級言語
完全な構造化プログラミングが可能
サブルーチンの再帰的呼び出しが可能
Copyright ©2008 Kazuhito Ito
高級プログラミング言語の例 4
Prolog (1972 年 )
Programming in Logic
プログラムを規則によって表し、推論を行って 結果を得る
エキスパートシステムなどで利用
Smalltalk (1970 年代 )
オブジェクト指向プログラミング言語
言語定義とプログラム開発環境が一体化
開発環境は後のウィンドウ型GUIに影響
Copyright ©2008 Kazuhito Ito
高級プログラミング言語の例 5
C 言語 (1972 年 )
オペレーティングシステムUNIXを記述するた めに開発した高級プログラミング言語
B言語を元に開発
Dennis M. Ritchie、Brian W. Kernighanが
「プログラミング言語C」を出版
K&R仕様C言語として普及(1978年)
ANSI(アメリカ規格協会)が標準化し、
ANSI-C規格を制定(1989年)
オブジェクト指向の考えを取り入れたC++、
Objective-Cなどが派生している
Copyright ©2008 Kazuhito Ito
高級プログラミング言語の例 6
Perl (1987 年 )
Practical Extraction and Report Language
連想配列が使用でき、文字データ処理が得意
UNIXとともに普及
JAVA (1995 年 )
C++言語に極めて似た文法
ネットワーク経由のプログラム配布・実行を考慮 してセキュリティ面で安全対策が施されている
プロセッサの種類によらず共通に実行可能
i-APPLI
Copyright ©2008 Kazuhito Ito
高級プログラミング言語のまとめ
FORTRAN 1957
手続き型ALGOL 1960
手続き型手続き型
オブジェクト指向型 手続き型
LISP 1962
関数型BASIC 196x
COBOL 1960
Pascal 1971
Prolog 1972
Smalltalk 197x
C 1972
手続き型 手続き型
手続き型
オブジェクト指向型
JAVA 1995
Perl 1987
手続き型Copyright ©2008 Kazuhito Ito
C言語プログラムの例1
二次方程式を解く
変数の宣言 a = 1.6;
b = 5.0;
c = 2.1
root = sqrt(b*b-4*a*c);
bunbo = 2*a;
answerP = (-b+root)/bunbo;
answerN = (-b-root)/bunbo;
double
root, bunbo;double
a, b, c;double
answerP, answerN;計算と 変数へ代入
a ac b x b
2
2
− 4
±
= −
2
+ bx + c = 0 ax
*: かけ算
sqrt: 平方根の
計算
Copyright ©2008 Kazuhito Ito
C言語プログラムの例2
階乗計算プログラム
#include <stdio.h>
int factorial( int n ) {
if( n == 0 ) return 1;
return n*factorial(n-1);
}
int
main( int argc, char *argv[] ) { int n;
n = atoi( argv[1] );
printf( "%d
の階乗は%d
です。¥n", n, factorial(n) );
}
階乗を定義どおりに記述
Copyright ©2008 Kazuhito Ito
高級言語プログラムの実行
プロセッサが直接実行できるのは機械語
高級言語から機械語への翻訳が必要
翻訳の方法に 3 種類
コンパイル型
インタプリタ型
バイト・コンパイル型
まず、翻訳に必要な処理を考える
Copyright ©2008 Kazuhito Ito
高級言語プログラムの翻訳手順
字句解析
定数、変数、予約語、演算子などを識別
構文解析
処理内容を理解する
機械語プログラムへ変換
処理内容を実現するように機械語命令を組み 合わせる(コード生成という)
(日本語で単語に分けることに相当)
(主語、述語、形容詞などを認識して意味を
理解することに相当)Copyright ©2008 Kazuhito Ito
高級言語プログラムの翻訳方式 1
コンパイル型
字句解析、構文解析、コード生成を一括して行 い、高級言語プログラムを完全に機械語プログ ラムへ変換してしまう
(本の翻訳に相当)
翻訳を行うための専用のプログラムが存在
変換に時間がかかる
変換後の機械語プログラム実行は高速
コンパイル済みのプログラムは単独で実行可
(プログラム実行にはコンパイラは不要)
コンパイラ
Copyright ©2008 Kazuhito Ito
高級言語プログラムの翻訳方式 2
インタプリタ型
プログラム実行に従って、次に実行すべき部分 を毎回字句解析、構文解析、コード生成する
(通訳に相当)
プログラムをすぐに実行可能
字句解析、構文解析が必要なため実行は低速
プログラム実行には高級言語プログラム本体と インタプリタ・プログラムが常にセットで必要
最近は計算機が十分高速になり、インタプリタ 型はバイト・コンパイル型に置き換えが進んで いる
Copyright ©2008 Kazuhito Ito
高級言語プログラムの翻訳方式 3
バイト・コンパイル型
字句解析、構文解析はプログラム実行開始時に 一括して処理
処理内容を中間言語(バイト・コード)に変換
バイト・コードはプロセッサ種類に非依存
バイト・コードを解釈して実行するためのプログ ラムをプロセッサ種類ごとに用意すればよい
プログラム実行には、高級言語プログラムと バイト・コード・インタプリタがセットで必要
コンパイル型とインタプリタ型の中間の実行速度 ここまでの処理をバイト・コンパイルという
Copyright ©2008 Kazuhito Ito
高級言語翻訳方式のまとめ
FORTRAN C
コンパイル型BASIC
インタプリタ型(あるC処理系) JAVA
Perl
バイト・コンパイル型Pascal
(.NET)
スクリプト型
Copyright ©2008 Kazuhito Ito
C 言語の特徴
高級プログラミング言語
コンパイル型
プログラムの実行速度を重視
機械語を意識した処理記述
もともとはUNIX OSの記述用に開発された
文字処理の実行効率向上を重視
プロセッサの機械語を活用できる記述が可能
Copyright ©2008 Kazuhito Ito
コンパイルと実行
Hello worldプログラム
ソースファイルとして‘hello.c’に保存
ソースファイルをコンパイル
コンパイル結果(実行バイナリ)を実行
#include <stdio.h>
int main() {
printf( “Hello, world!¥n” );
}
D:¥work> cl hello.c
D:¥work> hello
Hello, world!
Copyright ©2008 Kazuhito Ito
C 言語プログラムのコンパイル
ソース プリプロセス プリプロセス
コード生成 コード生成
アセンブリ アセンブル
アセンブル ライブラリ
hello.c
hello.asm
オブジェクト
hello.obj
libc.libなど
リンクリンク 実行バイナリ
hello.exe
テキスト・エディタなどで作成字句解析・構文解析・コード生成
Copyright ©2008 Kazuhito Ito
まとめ
プログラムとは
機械語と高級プログラミング言語
C 言語
コンパイル処理
Copyright ©2008 Kazuhito Ito
最後に
プログラミングは手段
アルゴリズムや数式モデルがあり、それを コンピュータで実行・計算させる