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