プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年)...
Transcript of プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年)...
プログラミング言語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-3731Email: [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 %ebpmovl %esp,%ebpsubl $24,%espmovl $0,-4(%ebp)movl $1,-8(%ebp)movl -8(%ebp),%eaxaddl %eax,-4(%ebp)
x ← 0y ← 1x ← x+y
左のプログラムの意味
高級プログラミング言語
アセンブリ言語プログラム
Copyright © 2008 Kazuhito Ito
高級プログラミング言語
プログラムを表記する上で、人間にとって分かりやすい言語
自然言語(日本語、英語、...)ではない自然言語は「曖昧さ」が避けられず、厳密にプログラムを表すには不適当
大規模で、複雑なプログラムを開発可能計算機が普及し、身近になった要因
int x,y;x = 0;y = 1;x = x+y;
x ← 0y ← 1x ← 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 Language10進演算の際に誤差がでないように計算
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 1962BASIC 196x
COBOL 1960
Pascal 1971Prolog 1972
Smalltalk 197xC 1972
手続き型
手続き型
手続き型
オブジェクト指向型JAVA 1995Perl 1987 手続き型
Copyright © 2008 Kazuhito Ito
C言語プログラムの例1
二次方程式を解く
変数の宣言
a = 1.6;b = 5.0;c = 2.1root = 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;
計算と変数へ代入
aacbbx
242 −±−
=02 =++ cbxax
*: かけ算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> helloHello, 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
後に
プログラミングは手段
アルゴリズムや数式モデルがあり、それをコンピュータで実行・計算させる
CGやπの計算を例に用いて、アルゴリズムや数式モデルをどのようにC言語で記述するかを述べていく
この講義では