Presentation is loading. Please wait.

Presentation is loading. Please wait.

オブジェクト指向言語論 第五回 知能情報学部 新田直也.

Similar presentations


Presentation on theme: "オブジェクト指向言語論 第五回 知能情報学部 新田直也."— Presentation transcript:

1 オブジェクト指向言語論 第五回 知能情報学部 新田直也

2 手続き 手続き:一連の処理を行う機能単位. 名前をつけることができ,その名前で何度でも呼び出すことができる.
FORTRAN, Basic --- サブルーチン Pascal プロシージャ(手続き) C, C 関数 Java メソッド 名前をつけることができ,その名前で何度でも呼び出すことができる.

3 手続きの有効性 z = x * y を行うWhile プログラム z = 0; c = 0; while (c < y) {
int plus(int z, int x) { int d = 0; while (d < x) { z++; d++; } return z; main() { int z = 0; int c = 0; while (c < y) { z = plus(z, x); c++; z = 0; c = 0; while (c < y) { d = 0; while (d < x) { z++; d++; } c++;

4 手続きの定義と呼び出し int plus(int z, int y) { int d = 0; while (d < y) {
} return z; main() { int z = 0; int c = 0; while (c < y) { z = plus(z, y); c++; 関数plusの定義(関数宣言) 関数plusの呼出し

5 手続きの引数と戻り値 int plus(int z, int y) { int d = 0; while (d < y) { z++;
} return z; main() { int z = 0; int c = 0; while (c < x) { z = plus(z, x); c++; 仮引数:定義側の引数 戻り値 実引数:呼出し側の引数

6 手続きの型 int plus(int z, int *y) { int d = 0; while (d < *y) { z++;
} return z; main() { int z = 0; int c = 0; while (c < y) { z = plus(z, &x); c++; すべての関数は型を持つ. 関数定義と呼出し側で型が一致 してなければならない.

7 前方参照とプロトタイプ宣言 プロトタイプ宣言 後方参照 前方参照 int plus(int z, int x) { int d = 0;
while (d < x) { z++; d++; } return z; main() { int z = 0; int c = 0; while (c < y) { z = plus(z, x); c++; int plus(int, int); main() { int z = 0; int c = 0; while (c < y) { z = plus(z, x); c++; } int plus(int z, int y) { int d = 0; while (d < y) { z++; d++; return z; プロトタイプ宣言 後方参照 前方参照

8 値を返さない手続き 値を返さない手続きは以下のように定義する. 値を返さない手続きの呼出し.
C, C++, Javaの場合: 戻り値を void に. VBの場合: サブルーチンプロシージャとして定義. 値を返さない手続きの呼出し. void view(int a) { printf(“%d\n”, a); } main() { view(10); 式として扱われない. (値を評価できない.)

9 再帰呼び出し(1) (もちろん)関数の中で関数を呼出すことが可能. main() { printf(“%d\n”, max3(12, 15, 11)); } int max3(int x, int y, int z) { return max2(max2(x, y), z); } int max2(int x, int y) { if (x >= y) return x; else return y; }

10 再帰呼び出し(2) 関数の中で自分自身を呼び出すとどうなるか?
int factorial(int x) { if (x == 1) { return 1; } else { return x * factorial(x – 1); } }

11 記憶クラス メモリ管理は古くて新しい問題 「忘れてもいいことはさっさと忘れる」が基本. 使えるメモリは有限.
メモリの使い方は実行速度にも影響. さまざまな環境: 携帯電話,デジタル家電… 「忘れてもいいことはさっさと忘れる」が基本. 長く覚えておくための記憶領域: ヒープ領域 一時的に覚えておくための記憶領域: スタック領域

12 プログラムのメモリマップ 各プログラムに割り当てられるメモリの領域は以下のようになっている. 領域が増減する 1プログラムに 割り当てられる
0xffff番地 スタック領域 領域が増減する 1プログラムに 割り当てられる 領域 ヒープ領域 静的領域 書き換え不可能 プログラム領域 0x0000番地

13 各領域の説明 プログラム領域: 静的領域: ヒープ領域: スタック領域: プログラムの実行コード(機械語)が格納される.
プログラムが持つ定数などが格納される. char *a = “This is a string.”; printf(“Hello World!!”); ヒープ領域: 大域変数(後で説明)が格納される. スタック領域: 自動変数(後で説明),関数の引数,戻り番地などが格納される.

14 自動変数 自動変数: 関数呼出し,ブロック開始時に生成される. 関数からの復帰,ブロック終了時に消滅する. スタック領域上に確保される.
main () { int i, j; func(); } func() { int x, y; mainの中でのみ使用可能 mainを抜けると消滅 funcの中でのみ使用可能 funcを抜けると消滅

15 静的変数 静的変数: 自動変数と同様,宣言した関数内でしか見れない. 関数からの復帰時に消滅せず値が保持される. ヒープ領域に確保される.
main () { int i, j; tick(); } tick() { static int count = 0; count++; 静的変数であることを示す記憶指定子 funcの中でのみ使用可能 次回呼出し時に値が残っている

16 大域変数 大域変数(外部変数): 関数の外で宣言する. 複数の関数で値を共有できる. プログラム実行中消滅しない. ヒープ領域に確保される.
mainでもfuncでも使用可能 消滅しない int i, j; main () { i = 1; j = 2; func(); } func() { printf(“[%d,%d]”, i, j); [1,2]が表示される

17 変数のスコープと寿命 スコープ: その変数を見れる範囲 寿命: その変数に値が保持されている期間 スコープ 寿命 自動変数 関数内
関数呼出しの間 静的変数 プログラムの全実行 大域変数 プログラム全体

18 スコープと可視性 別々のスコープで同じ名前を使用できる. 名前が衝突したときは,内側のスコープを優先. main内における i ,j
int i, j; main () { func1(); func2(); } func1() { func2() { main内における i ,j func1内における i ,j func2内における i ,j

19 スタック領域の詳細 関数呼出しに応じて スタック領域が確保される. main () { main用 int x = 1;
0xffff番地 main () { int x = 1; x = input(x); } int input(int y) { char s[10]; scanf(“%s”, s); printf("%s\n", s); return y + 1; main用 x y 戻り番地 s[0] s[1] : 自動変数用 28バイト 引数用 20バイト input用 0x0000番地

20 バッファオーバーフロー攻撃 scanfなどで戻り番地を上書きする. 戻り番地は29~32文字目 不正な コード main () {
0xffff番地 main () { int x = 1; x = input(x); } int input(int y) { char s[10]; scanf(“%s”, s); printf("%s\n", s); return y + 1; main用 x : 引数用 20バイト y input用 戻り番地 : 不正な コード 自動変数用 28バイト s[1] s[0] 0x0000番地


Download ppt "オブジェクト指向言語論 第五回 知能情報学部 新田直也."

Similar presentations


Ads by Google