プログラミング言語論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’
--- シングルクォーテーションで囲む
