• 検索結果がありません。

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

N/A
N/A
Protected

Academic year: 2021

シェア "プログラミング言語 I 第 1 回 プログラムと C 言語"

Copied!
6
0
0

読み込み中.... (全文を見る)

全文

(1)

プログラミング言語 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認定教育プログラム

(2)

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

左のプログラム の意味

高級プログラミング言語

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

(3)

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

(4)

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

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

„

字句解析

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

„

構文解析

„処理内容を理解する

„

機械語プログラムへ変換

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

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

(主語、述語、形容詞などを認識して意味を

 理解することに相当)

(5)

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!

(6)

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 言語で記述 するかを述べていく

この講義では

参照

関連したドキュメント

地図 9 “ソラマメ”の語形 語形と分類 徽州で“ソラマメ”を表す語形は二つある。それぞれ「碧豆」[pɵ thiu], 「蚕豆」[tsh thiu]である。

いずれも深い考察に裏付けられた論考であり、裨益するところ大であるが、一方、広東語

2021] .さらに対応するプログラミング言語も作

LLVM から Haskell への変換は、各 LLVM 命令をそれと 同等な処理を行う Haskell のプログラムに変換することに より、実現される。

しかし,物質報酬群と言語報酬群に分けてみると,言語報酬群については,言語報酬を与

Guasti, Maria Teresa, and Luigi Rizzi (1996) &#34;Null aux and the acquisition of residual V2,&#34; In Proceedings of the 20th annual Boston University Conference on Language

 “ボランティア”と言えば、ラテン語を語源とし、自

②上記以外の言語からの翻訳 ⇒ 各言語 200 語当たり 3,500 円上限 (1 字当たり 17.5