プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年)...

33
プログラミング言語I 1プログラムとC言語 埼玉大学電気電子システム工学科 伊藤 和人

Transcript of プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年)...

Page 1: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

プログラミング言語I 第1回

プログラムとC言語

埼玉大学電気電子システム工学科伊藤 和人

Page 2: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

この講義の目的

ディジタル計算機のプログラミング言語として現在 も広く使用されているC言語を学ぶ

学習・研究などで、必要なソフトウェアを自分で作成する

様々なデータ構造を知る

プログラム=アルゴリズム+データ構造

用途の広い一般的なアルゴリズムを知る

並べ替え処理(sort)、 短経路問題

Page 3: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

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

中間試験

中間試験解答

Page 4: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

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未満は「欠」

Page 5: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

その他

担当伊藤和人 (電気電子システム工学科棟2階211号室)TEL: 048-858-3731Email: [email protected]

講義資料講義で使用するスライドをホームページに掲載

必要ならばダウンロードして講義に持参

オフィスアワー質問は講義時間中にいつでも受け付け

木曜日昼休み

時間がかかる場合は別途時間を予約

http://www.elc.ees.saitama-u.ac.jp/ProgrammingI/

Page 6: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

プログラムとは

「プログラム」と聞いて何を思う?

運動会のプログラム

発表会のプログラム

「プログラム」とは(1)物事の予定。番組。(2)映画・演劇・コンサートなど各種の催しの、

番組・組み合わせ・順序・筋などを書いたもの。

    物事の進め方、手順を書き表したもの

計算機に行わせたいことの手順を表したもの(3)コンピューターに、情報処理を行うための動作手順を指定するもの。また、それを作成すること。            三省堂提供「大辞林 第二版」より

JABEE認定教育プログラム

Page 7: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

プログラムの表し方

計算機に行って欲しいことをどうやって計算機に伝えるか

例: 「πを10万桁の精度で計算しなさい」

今のところまだ計算機は日本語(自然言語)によるプログラムは理解できない

近のロボットの「会話」とは違うので注意

人間が努力して、計算機が理解できる言葉でプログラムを表現する必要あり

そのための言語 プログラミング言語

Page 8: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

プログラミング言語のレベル

人間の努力の程度によって3つのレベルのプログラミング言語あり

機械語(マシン語)アセンブリ言語

高級プログラミング言語

Page 9: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

機械語

計算機の母国語

ディジタル計算機が直接理解する0,1のビットパターンによって処理を表す

例: 0000 0100 0000 0001   レジスタALに1を加算する

例: 0011 1100 0000 0001レジスタALの値と1を比較する

個々の処理単位を命令(Instruction)という

Pentiumの例計算機の種類によって異なる

Page 10: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

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に対応

変換ツール「アセンブラ」によってアセンブリ言語プログラムを機械語プログラムに変換

Page 11: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

Z80用機械語

PowerPC用機械語

機械語、アセンブリ言語の問題1

プロセッサ種類ごとに異なった言語

Pentium

Pentium用機械語

アセンブリ言語

アセンブリ言語 アセンブリ言語

SPARC用機械語アセンブリ言語

互換性なし

H8

H8用機械語アセンブリ言語

互換性なし

Z80

SPARC

PowerPC

Page 12: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

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

左のプログラムの意味

高級プログラミング言語

アセンブリ言語プログラム

Page 13: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

高級プログラミング言語

プログラムを表記する上で、人間にとって分かりやすい言語

自然言語(日本語、英語、...)ではない自然言語は「曖昧さ」が避けられず、厳密にプログラムを表すには不適当

大規模で、複雑なプログラムを開発可能計算機が普及し、身近になった要因

int x,y;x = 0;y = 1;x = x+y;

x ← 0y ← 1x ← x+y

左のプログラムの意味高級言語プログラム

ニュアンス、行間

Page 14: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

高級プログラミング言語の例1

FORTRAN (1957年)初の高級プログラミング言語

FORmula TRANslatorの略

名前が表すように科学技術計算を得意とする

実数演算、複素数演算が可能

ALGOL (1958年~1962年)ALGOrithmic Language科学技術計算用のプログラミング言語

以降の高級プログラミング言語に多大な影響を与えた

Page 15: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

高級プログラミング言語の例2

COBOL (1960年)COmmon Business Oriented Language10進演算の際に誤差がでないように計算

LISP (1962年)LISt Processor関数型プログラミング言語

関数の再帰的定義が可能

記号処理分野で利用される

Page 16: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

高級プログラミング言語の例3

BASIC (1960年台)教育用のプログラミング言語

科学技術計算もこなす

1980年代にパソコンに搭載されて普及した

Pascal (1971年)プログラミング教育用に開発された高級言語

完全な構造化プログラミングが可能

サブルーチンの再帰的呼び出しが可能

Page 17: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

高級プログラミング言語の例4

Prolog (1972年)Programming in Logicプログラムを規則によって表し、推論を行って結果を得る

エキスパートシステムなどで利用

Smalltalk (1970年代)オブジェクト指向プログラミング言語

言語定義とプログラム開発環境が一体化

開発環境は後のウィンドウ型GUIに影響

Page 18: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

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などが派生している

Page 19: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

高級プログラミング言語の例6

Perl (1987年)Practical Extraction and Report Language連想配列が使用でき、文字データ処理が得意

UNIXとともに普及

JAVA (1995年)C++言語に極めて似た文法

ネットワーク経由のプログラム配布・実行を考慮してセキュリティ面で安全対策が施されている

プロセッサの種類によらず共通に実行可能i-APPLI

Page 20: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

高級プログラミング言語のまとめ

FORTRAN 1957 手続き型

ALGOL 1960 手続き型

手続き型

オブジェクト指向型

手続き型

関数型LISP 1962BASIC 196x

COBOL 1960

Pascal 1971Prolog 1972

Smalltalk 197xC 1972

手続き型

手続き型

手続き型

オブジェクト指向型JAVA 1995Perl 1987 手続き型

Page 21: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

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: 平方根の

計算

Page 22: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

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) );}

階乗を定義どおりに記述

Page 23: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

高級言語プログラムの実行

プロセッサが直接実行できるのは機械語

高級言語から機械語への翻訳が必要

翻訳の方法に3種類

コンパイル型

インタプリタ型

バイト・コンパイル型

まず、翻訳に必要な処理を考える

Page 24: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

高級言語プログラムの翻訳手順

字句解析

定数、変数、予約語、演算子などを識別

構文解析

処理内容を理解する

機械語プログラムへ変換

処理内容を実現するように機械語命令を組み合わせる(コード生成という)

(日本語で単語に分けることに相当)

(主語、述語、形容詞などを認識して意味を 理解することに相当)

Page 25: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

高級言語プログラムの翻訳方式1

コンパイル型

字句解析、構文解析、コード生成を一括して行い、高級言語プログラムを完全に機械語プログラムへ変換してしまう (本の翻訳に相当)翻訳を行うための専用のプログラムが存在

変換に時間がかかる

変換後の機械語プログラム実行は高速

コンパイル済みのプログラムは単独で実行可(プログラム実行にはコンパイラは不要)

コンパイラ

Page 26: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

高級言語プログラムの翻訳方式2

インタプリタ型

プログラム実行に従って、次に実行すべき部分を毎回字句解析、構文解析、コード生成する(通訳に相当)プログラムをすぐに実行可能

字句解析、構文解析が必要なため実行は低速

プログラム実行には高級言語プログラム本体とインタプリタ・プログラムが常にセットで必要

近は計算機が十分高速になり、インタプリタ型はバイト・コンパイル型に置き換えが進んでいる

Page 27: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

高級言語プログラムの翻訳方式3

バイト・コンパイル型

字句解析、構文解析はプログラム実行開始時に一括して処理

処理内容を中間言語(バイト・コード)に変換

バイト・コードはプロセッサ種類に非依存

バイト・コードを解釈して実行するためのプログラムをプロセッサ種類ごとに用意すればよい

プログラム実行には、高級言語プログラムとバイト・コード・インタプリタがセットで必要

コンパイル型とインタプリタ型の中間の実行速度

ここまでの処理をバイト・コンパイルという

Page 28: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

高級言語翻訳方式のまとめ

FORTRAN

C

コンパイル型

BASIC

インタプリタ型

(あるC処理系)

JAVA

Perl

バイト・コンパイル型

Pascal

(.NET)

スクリプト型

Page 29: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

C言語の特徴

高級プログラミング言語

コンパイル型

プログラムの実行速度を重視

機械語を意識した処理記述

もともとはUNIX OSの記述用に開発された

文字処理の実行効率向上を重視

プロセッサの機械語を活用できる記述が可能

Page 30: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

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!

Page 31: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

C言語プログラムのコンパイル

ソース

プリプロセスプリプロセス

コード生成コード生成

アセンブリ

アセンブルアセンブルライブラリ

hello.c

hello.asm

オブジェクトhello.obj

libc.libなど

リンクリンク 実行バイナリ

hello.exe

テキスト・エディタなどで作成

字句解析・構文解析・コード生成

Page 32: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

まとめ

プログラムとは

機械語と高級プログラミング言語

C言語

コンパイル処理

Page 33: プログラミング言語I 第1回 プログラムとC言語 - Saitama …Pascal (1971年) プログラミング教育用に開発された高級言語 完全な構造化プログラミングが可能

Copyright © 2008 Kazuhito Ito

後に

プログラミングは手段

アルゴリズムや数式モデルがあり、それをコンピュータで実行・計算させる

CGやπの計算を例に用いて、アルゴリズムや数式モデルをどのようにC言語で記述するかを述べていく

この講義では