プログラミング言語論0413

Download Report

Transcript プログラミング言語論0413

プログラミング言語論
第二回
理工学部
情報システム工学科
新田直也
プログラミング言語に関する
チューリング賞
1966年
1971年
1972年
1983年
1984年
1991年
2001年
A. J. Perlis
コンパイラ
John McCarthy
Lisp
Edsger W. Dijkstra
ALGOL
Dennis M. Ritchie
C
Niklaus Wirth
Pascal
Robin Milner
ML
Ole-Johan Dahl / Kristen Nygaard
Simula
2003年 Alan Kay
Smalltalk
プログラミング言語の仕組み

なぜプログラミング言語は数多くの仕組みを用意し
ているのか?


計算に必要な最小限の機能だけを持つ言語:
whileプログラム
プログラムに必要とされる機能は計算だけではない.





コンピュータ上で走らせるためやむなく必要となる仕組み.
より高速に計算するために必要な仕組み.
データを包括的に管理するために必要な仕組み.
プログラムを読みやすくするために必要な仕組み.
プログラムを分割管理するために必要な仕組み.
最小プログラミング言語

まずは,必要最小限の機能から始めよう!

Whileプログラム(D.M.Ritchie, C言語の作者)


単純だが,どんな計算でもできることが理論的に証明され
ているプログラム言語
(チューリングマシンと等価,計算万能)
プログラム理論の研究で使われる.
例) 表示意味論(denotational semantics),プログラム検証

制御構造として,連接,判断(if文),前判定反復(while
文のみを持つ)
→構造化定理参照
Whileプログラムの構文


自然数(0を含む)を表す有限個の変数を持つ.
代入文は以下の3通りのみ.
変数 = 0;
変数 = 変数;
変数++;

(変数 = 変数 + 1;)
条件式は以下の1通りのみ.
変数 < 変数

プログラムは再帰的に以下のように構成される.
プログラム ::= 代入文
または
プログラム プログラム
または
if (条件式) { プログラム } else { プログラム } または
while (条件式) { プログラム }
Whileプログラムの例(加算)

z = x + y の計算
z = x;
c = 0;
while (c < y) {
z++;
c++;
}
Whileプログラムの例(減算)

z = x - y の計算
z = 0;
c = x;
while (c < y) {
z++;
c++;
}
Whileプログラムの例(乗算)

z = x * y の計算
z = 0;
c = 0;
while (c < y) {
d = 0;
while (d < x) {
z++;
d++;
}
c++;
}
Whileプログラムで満足できるか?

Whileプログラムが持っているもの




変数
代入文
制御構造
Whileプログラムが持っていないもの




変数の型
演算子, 式
手続き(関数)呼び出し
配列
変数と型

実際はプログラムは有限のメモリ上で動作する.


Whileプログラムでは,各変数が取りうる値に上限が設
けられていなかった.(1変数当たり無限バイト必要.)
x = 1;
y = 0;
while (x > y) {
x++;
}
変数の型宣言とは,各変数に決められたメモリ領域
を割り当てること.


変数を使用する前に型宣言しておかなければならない.
割り当てられた型に応じて適用可能な演算が変わる.
データ型の分類

単純な型



構造を持つ型





基本型(char, int, long, …)
ユーザ定義型(enum)
文字列型
配列型
構造体型
その他
データ参照型


参照型
ポインタ型
基本型(Java)
boolean (論理型)
 byte (バイト型)
 char (文字型)
 short (短長整数型)
 int (整数型)
 long (倍長整数型)
 float (短精度浮動小数点型)
 double (倍精度浮動小数点型)

1バイト
1バイト
2バイト
2バイト
4バイト
8バイト
4バイト
8バイト
型宣言文

変数を使用する前に宣言.

初期化なし型宣言文
型名 変数名;

(例) int x;
初期化つき型宣言文
型名 変数名 = 初期値;
(例) int x = 12;
メモリへの格納形式(整数型)

整数型

リトルエンディアン(最下位バイトを一番下のアドレスに)
Intel系
0xffff番地
0x1234
0x12
0x34
0x0000番地

ビッグエンディアン(最上位バイトを一番下のアドレスに)
Motrola系
0x1234
0xffff番地
0x34
0x12
0x0000番地
メモリへの格納形式(浮動小数点型)

単精度(float)
1
8
23
s
e
f
s…符号ビット
e…指数部
f… 仮数部
下位

倍精度(double)
1
11
52
s
e
f
下位
定数表現
10進定数
100
--- そのまま書く
 8進定数
0777
--- 先頭に0を付ける
 16進定数
0x53fb --- 先頭に0xを付ける.0~fまでを使う.
 単精度定数
3.14F, 1.0E+10F --- 末尾にFを付ける
 単精度定数
3.14, 1.0E+10
--- 末尾にFを付けない
 文字定数
‘a’
--- シングルクォーテーションで囲む
