430 likes | 563 Views
関数,スコープ. 拡張 K- 言語 関数呼び出し 変数の有効範囲. ★ K 言語 → VSM. main() { int a,b; int c; c=a+b; }. 12 PUSHI (0,3) 13 PUSH (0,1) 14 PUSH (0,2) 15 ADD 16 ASSGN 17 REMOVE. ★ K 言語 → VSM. main() { int a,c; { int c; c=a+25; } }. 12 PUSHI (0,1) 13 PUSH (1,1) 14 PUSHI 25
E N D
関数,スコープ 拡張K-言語 関数呼び出し 変数の有効範囲
★K言語 → VSM main() { int a,b; int c; c=a+b; } 12 PUSHI (0,3) 13 PUSH (0,1) 14 PUSH (0,2) 15 ADD 16 ASSGN 17 REMOVE
★K言語 → VSM main() { int a,c; { int c; c=a+25; } } 12 PUSHI (0,1) 13 PUSH (1,1) 14 PUSHI 25 15 ADD 16 ASSGN 17 REMOVE
★K言語 → VSM main() { int a,b,c; { int c; a=c-3; } a=c-3; } 12 PUSHI (0,1) 13 PUSH (0,3) 14 PUSHI 3 15 SUB 16 ASSGN 17 REMOVE
★K言語 → VSM int func1 (int x,int y) { int wa; wa=x+y; return wa; } main(){ c=func1(12,34); } 2 PUSHI (0,1) 3 PUSH (0,-4) 4 PUSH (0,-3) 5 ADD 6 ASSGN 7 REMOVE 8 PUSH (0,1) 9 RETURN 2
★K言語 → VSM int func1 (int x,int y) { int wa; wa=x+y; return wa; } main(){ int a,c; c=func1(12,34); } 20 PUSHI (0,2) 21 PUSHI 12 22 POP 23 PUSHI 34 24 POP 25 CALL 1 26 ASSGN 27 REMOVE
K言語 → VSM int func1 (int x,int y) { int wa; wa=x+y; return wa; } main(){ int a,c; c=func1(12,34); } wa 20 PUSH (0,1) 21 RETURN 2 引数の数=2 100 PUSHI (0,2) ???? 105 CALL 1 106 ASSGN 107 REMOVE c = ;
関数呼び出し int tasu(int x,int y) { int wa; wa=x+y; return wa; } main() { int a; a=tasu(2,3); tasu(5,2); } 関数は 必ず戻り値がある とする mainは 戻り値なし とする REMOVE 戻り値を 使わなくてもよい
再帰呼び出し:可能 int wa(int n) { if ( n <= 1) return 1; return n+wa(n-1); } main() { wa(3); } 再帰呼び出し
再帰呼び出し 同じ関数waでも 引数の値が異なる 局所変数の値が異なる wa(3) →wa(2) →wa(1) n=1 n=2 n=3 nを記憶する場所(アドレス)を 一回呼び出す毎に変更しなければならない ↓ 一回呼び出す毎に新しい記憶場所を確保する (フレームと呼ぶ)
Dsegにフレームを積む • wa(3) • wa(2) • wa(1)
フレームの構造:CALL,int waの後 int tasu(int x,int y) { int wa=11; wa=x+y; return wa; } main() { int a=7; a=tasu(2,3); } mainの 固定領域 FP tasuの 固定領域 BP DP
フレームの構造:RETURNの後 int tasu(int x,int y) { int wa=11; wa=x+y; return wa; } main() { int a=7; a=tasu(2,3); } mainの 固定領域 FP= tasuのDL DP= tasuのFP-1 -2(引数の数) BP= tasuのSL
Dsegの使用状況の推移[1] • int func1(int a,int b) • { int wa=15; • wa=a+b; • return wa; • } • int func2(int x,int y) • { int seki=23; • seki=5*func1(x,y); • return seki; • } • main() • { int u=3,v=7,w=61; • w=func2(u,v); • } FP BP DP ここ
Dsegの使用状況の推移[1] BP • int func1(int a,int b) • { int wa=15; • wa=a+b; • return wa; • } • int func2(int x,int y) • { int seki=23; • seki=5*func1(x,y); • return seki; • } • main() • { int u=3,v=7,w=61; • w=func2(u,v); • } DP ここ FP
Dsegの使用状況の推移[1] • int func1(int a,int b) • { int wa=15; • wa=a+b; • return wa; • } • int func2(int x,int y) • { int seki=23; • seki=5*func1(x+1,y+2); • return seki; • } • main() • { int u=3,v=7,w=61; • w=func2(u,v); • } ここ FP BP DP
Dsegの使用状況の推移[1] • int func1(int a,int b) • { int wa=15; • wa=a+b; • return wa; • } • int func2(int x,int y) • { int seki=23; • seki=5*func1(x+1,y+2); • return seki; • } • main() • { int u=3,v=7,w=61; • w=func2(u,v); • } BP DP ここ FP
Dsegの使用状況の推移[1] • int func1(int a,int b) • { int wa=15; • wa=a+b; • return wa; • } • int func2(int x,int y) • { int seki=23; • seki=5*func1(x,y); • return seki; • } • main() • { int u=3,v=7,w=61; • w=func2(u,v); • } FP BP DP ここ
変数の有効範囲 int x,y; main() { int a,b; } 関数の外で定義=大域変数 すべての関数で有効 関数の内部で定義=局所変数 その関数内部でのみ有効
ブロック構造 大域変数 int x,y; main() { int a,x; { int u,a; a=x+y; { int f,u; f=u+a; } } } 局所変数 ブロック変数 内部のブロック変数 一番近くの定義が有効
ブロック構造:Dsegに番地を確保 int x=3,y=7; main() { int a=11,x=15;<=18 { int u=21,a=29;<=22 a=x+y;a←15+7 { int f=34,<=58u=36; f=u+a;f←36+22 } } x=a+y; x←11+7 }
ブロック構造:変数表 main() { int a=11,x=15; { int u=21,a=29; a=x+y; { int f=34,u=36; f=u+a; } } x=a+y; }
ブロック構造:Dsegに番地を確保 int x=3,y=7; main() { int a=11,x=15; { int u=21,a=29; a=x+y; { int f=34,u=36; f=u+a; } } x=a+y; } FP ここでの Dsegの構造 BP DP
ブロック構造:Dsegに番地を確保 int x=3,y=7; main() { int a=11,x=15; { int u=21,a=29; a=x+y; { int f=34,u=36; f=u+a; } } x=a+y; } FP ここでの Dsegの構造 BP DP
Dsegの使用状況の推移[2] • int g=42,h=53; • int func(int a,int b) • { int wa=15; • { int sa=75; • sa=b-a; • wa=sa+g; } • if(a<b){ • int sa=82; • sa=a-b; • wa=sa+h; } • return wa; • } • main() • { int u=3,v=7,w=61; • w=func(u,v);} FP BP DP ここ
Dsegの使用状況の推移[2] • int g=42,h=53; • int func(int a,int b) • { int wa=15; • { int sa=75; • sa=b-a; • wa=sa+g; } • if(a<b){ • int sa=82; • sa=a-b; • wa=sa+h; } • return wa; • } • main() • { int u=3,v=7,w=61; • w=func(u,v);} FP ここ BP DP
Dsegの使用状況の推移[2] • int g=42,h=53; • int func(int a,int b) • { int wa=15; • { int sa=75; • sa=b-a; • wa=sa+g; } • if(a<b){ • int sa=82; • sa=a-b; • wa=sa+h; } • return wa; • } • main() • { int u=3,v=7,w=61; • w=func(u,v);} FP ここ BP DP
Dsegの使用状況の推移[2] • int g=42,h=53; • int func(int a,int b) • { int wa=15; • { int sa=75; • sa=b-a; • wa=sa+g; } • if(a<b){ • int sa=82; • sa=a-b; • wa=sa+h; } • return wa; • } • main() • { int u=3,v=7,w=61; • w=func(u,v);} FP ここ BP DP
Dsegの使用状況の推移[2] • int g=42,h=53; • int func(int a,int b) • { int wa=15; • { int sa=75; • sa=b-a; • wa=sa+g; } • if(a<b){ • int sa=82; • sa=a-b; • wa=sa+h; } • return wa; • } • main() • { int u=3,v=7,w=61; • w=func(u,v);} FP BP ここ DP
Dsegの使用状況の推移[2] • int g=42,h=53; • int func(int a,int b) • { int wa=15; • { int sa=75; • sa=b-a; • wa=sa+g; } • if(a<b){ • int sa=82; • sa=a-b; • wa=sa+h; } • return wa; • } • main() • { int u=3,v=7,w=61; • w=func(u,v);} FP BP DP ここ
Dsegの使用状況の推移[2] • int g=42,h=53; • int func(int a,int b) • { int wa=15; • { int sa=75; • sa=b-a; • wa=sa+g; } • if(a<b){ • int sa=82; • sa=a-b; • wa=sa+h; } • return wa; • } • main() • { int u=3,v=7,w=61; • w=func(u,v);} FP BP DP ここ
Dsegの使用状況の推移[3] • int g=42,h=53; • int func(int a,int b) • { • int wa=15; • return wa; • } • main() • { • int u=3,v=7,w=61; • { • int x=31,y=90; • w=func(x+3,v-1); • } • w=u+w; • } FP BP ここ DP
Dsegの使用状況の推移[3] • int g=42,h=53; • int func(int a,int b) • { • int wa=15; • return wa; • } • main() • { int u=3,v=7,w=61; • { • int x=31,y=90; • w=func(x+3,v-1); • } • w=u+w; • } FP DP BP ここ
Dsegの使用状況の推移[3] • int g=42,h=53; • int func(int a,int b) • { • int wa=15; • return wa; • } • main() • { • int u=3,v=7,w=61; • { • int x=31,y=90; • w=func(x+3,v-1); • } • w=u+w; • } FP ここ BP DP
Dsegの使用状況の推移[3] • int g=42,h=53; • int func(int a,int b) • { • int wa=15; • return wa; • } • main() • { int u=3,v=7,w=61; • { • int x=31,y=90; • w=func(x+3,v-1); • } • w=u+w; • } FP DP BP ここ
Dsegの使用状況の推移[3] • int g=42,h=53; • int func(int a,int b) • { • int wa=15; • return wa; • } • main() • { • int u=3,v=7,w=61; • { • int x=31,y=90; • w=func(x+3,v-1); • } • w=u+w; • } FP BP DP ここ
課題 Dsegの変化を書きなさい. int u; int func1(int x,int y) { int wa; wa=x+y; { int u; u=17; wa=wa+u;} return wa;} main () { int a,b,c; a=12; u=23; { int c,d; d=14; c=func1(a,d); a=u+c; } }
問1: K言語 → VSM main() { int a,b; int c; c=b+a; } 12 PUSHI (0,3) 13 14 PUSH (0,1) 15 ADD 16 ASSGN 17 REMOVE ①PUSH(0,1) ②PUSHI(0,1) ③PUSH (0,2) ④PUSHI (0,2) ⑤PUSH (0,3) ⑥正解なし 問1
問2: K言語 → VSM main() { int a,b,c; { int c; c=b+25; } } 12 PUSHI (0,1) 13 14 PUSHI 25 15 ADD 16 ASSGN 17 REMOVE ①PUSHI(1,1) ②PUSH(1,1) ③PUSH (1,2) ④PUSHI (1,2) ⑤PUSH (0,2) ⑥正解なし 問2
問3: K言語 → VSM main() { int a,b,c; { int c; a=c-3; } a=b-3; } 12 PUSHI (0,1) 13 14 PUSHI 3 15 SUB 16 ASSGN 17 REMOVE ①PUSHI(1,1) ②PUSH(1,1) ③PUSH (0,2) ④PUSHI (0,1) ⑤PUSHI (0,2) ⑥正解なし 問3
問4 int func1 (int x,int y) { int wa; wa=y+wa; return wa; } main(){ c=func1(12,34); } 2 PUSHI (0,1) 3 4 PUSH (0,1) 5 ADD 6 ASSGN 7 REMOVE ①PUSHI(1,-1) ②PUSH(1,-2) ③PUSH (0,1) ④PUSH (0,-3) ⑤PUSHI (0,-4) ⑥正解なし 問4
問5 int func1 (int x,int y) { int wa; wa=x+y; return wa; } main(){ int a,b,c; c=func1(12,34); } 20 21 PUSHI 12 22 POP 23 PUSHI 34 24 POP 25 CALL 1 26 ASSGN 27 REMOVE 問5 ①PUSHI(1,2) ②PUSH(1,3) ③PUSH (0,2) ④PUSH (0,3) ⑤PUSHI (0,3) ⑥正解なし