پاسخ سه سوال از امتحان میان ترم دو گروه درس طراحی و پیاده سازی زبان های برنامه سازی
1. برنامه زیر در زبان C++ است. Scope, lifetime هر یک از متغیر ها را تعیین کنید.
1. #include <stdio.h>
2. int x=0;
3. void P(int, float):
4. void q(int, int);
5. void main(){
6. int x=1;
7. q(x,x);
8. }
10. void P(int y, float z){
11. x=x+1;
12. y=y+1;
13. z=z+1;
14. }
15. void q(int I, int j){
16. static float f;
17. f=i*2.5;
18. j=1;
19. while (j<=10){
20. float f;
21. f=j*2.5;
22. x=f%2;
23. }
24. }
مشاهده پاسخ
زبان++C ,static scoping را پیاده سازی کرده است . بنابراین در تعیین بازه قابل دید (scope) متغیرها باید قوانین static scoping لحاظ شود. به علاوه متغیرهای محلی توابع در این زبان به صورت پیش فرض از نوع stack dynamic هستند. با این ملاحظات پاسخ سوال به ترتیب زیر خواهد بود.
- متغیرx در خط 2 دارای life time از ابتدای ورود به اجرای برنامه تا انتها آن است.scope این متغیر کل برنامه به جز تابع main است.
- متغیرx در خط 6: دارای life time وscope از ابتدای تابع main تا انتهای آن است. باید توجه کرد که چون در حالت static scoping هستیم و در ضمن زبان C++ اجازه ی تعریف یک تابع در تابع دیگر(nested sub-programming) را نمی دهد متغیرx درتابع main متغیرمحلی این تابع محسوب شده و در تابع q که در آن فراخوانی شده قابل دید نیست.
- متغیرf در خط 16 : static تعریف شده و بنابراین life time آن از ورود به اجرا تا انتهای اجرای برنامه خواهد بود. scope این متغیردرتابع q به جز حلقه ی while می باشد. تعریف یک متغیر با همین نام در بلاک while اینf را از دید پنهان (hidden) می کند.
- Life time متغیرf در خط 20 بسته به نسخه ی C++ می تواند ازهمین خط تا پایان تابع و یا ازابتدای تابع تا انتهای آن باشد. Scope این متغیر حلقه ی while است.
-------------------------------------------------------------------------------------------------
2. تعریف زیر روالهای زیر در زبانی که اجازه ی nested subprogramming را میدهد صورت گرفته است. Referring environment زیر روال q و خروجی برنامه را در دو حالت (زبانی با static scope) و (زبانی با Dynamic scope) بنویسید
Procedure p;
x : integer;
Procedure q;
y : integer;
begin
x:= x+1;
y:=y+1;
end;
Procedure r;
x: integer;
begin
x:=1;
write("x before calling q: ",x);
q;
write("x after calling q:",x);
end;
begin (P)
x:=2;
r;
write("x in P ",x);
end;
مشاهده پاسخ
Referencing environment زیرروال q
- در حالت static scoping برابر است با x از زیرروال p و y از زیرروال q
- در حالت dynamic scoping برابر است با x از زیرروال r و y از زیرروال q
خروجی برنامه در حالت static scoping
X(p) = 2
X(r) = 1
=> "x before calling q: 1"
X(q) in this case = x(p)
In q:
X(p) := x(p) + 1 => x(p) = 3
After calling q and in r, x is still the x(r)
=> "x after calling q: 1"
In p after r: the value of x(p) is changed by q
=> "x in p: 3"
بطور خلاصه خروجی برنامه در این حالت (1,1,3) خواهد بود.
خروجی برنامه در حالت :dynamic scoping
x(p) = 2
x(r) = 1
=> "x before calling q: 1"
X(q) in this case = x(r)
In q:
X(r) := x(r) + 1 => x(r) = 2
After calling q and in r, x is x(r)
=> "x after calling q: 2"
In p; after r: the value of x(p) is not changed
=> "x in p: 2
بطور خلاصه خروجی برنامه در این حالت (1,2,2) خواهد بود.
-------------------------------------------------------------------------------------------------
3. تعریف زیر روالهای زیر در زبانی که اجازه ی nested subprogramming را میدهد صورت گرفته است. Referring environment هر زیرروال و scope / Lifetime هر متغییر و خروجی برنامه را در دو حالت (زبانی با static scoping) و (زبانی باingDynamic scope) بنویسید
Program main is
x : integer;
Procedure B;
Static z : real;
Begin (B)
z:= 1;
x:=x+1;
Write("in B:", x, z);
end; (B)
Procedure A;
z : integer;
x: integer;
Procedure C;
Begin (c)
x := x+2;
z := x+2;
Write (“x, z in C”, x, z);
End; (c)
Begin (A)
x:= 1;
z:= 2;
Write("in A before calling B:", x, z);
B;
Write("in A after calling B:", x, z);
end; (A)
begin (main)
x:=4;
Write("in main before calling A:", x);
A;
Write("in main after calling A:", x);
end; (main)
مشاهده پاسخ
Referencing environment در حالت static scoping
زیرروال B
z از زیرروال B
x از main
z,x از زیرروال A
z,x از زیرروال A
Referencing environment در حالت dynamic scoping
z از زیرروال B
x از زیرروال A زیرا در B در زیرروال A فراخوانی شده است.
نکته. در حالت ,dynamic scoping در هر فراخوانی یک زیرروال، Referencing environment آن ممکن است متفاوت از فراخوانی های دیگر همان زیرروال باشد.
z,x از زیرروال A
زیرروال C در این برنامه فراخوانی نشده و بنابراین R.E. برای آن معنا ندارد.
Life time وscope متغیرها: (توضیح. در این قسمت scope را فقط در حالت static scoping شرح می دهیم)
x خط 2، دارای life time در کل اجرای برنامه است. scope آن در کل برنامه به جز زیرروال A و در نتیجه زیرروال C که در آن تعریف شده می باشد. بعبارت دیگر scope آن، main و زیرروال B است.
z خط 4 . life time آن کل برنامه است زیرا از نوع static است. scope آن فقط زیرروال B است.
z,x در A دارای life time و scope در زیرروال A وC هستند.
(نکته. Life time متغیرها بستگی به نوع آنها (static, stack dynamic, …) دارد و ارتباطی به نوع scoping زبان ندارد ولی scope یک متغیر بستگی به نوع scoping دارد (به مثال سوال قبل توجه کنید)
خروجی برنامه :
Static scoping
In main before calling A 4
In A before calling B 1, 2
In B 5, 1
In A after calling B 1, 2
In main after calling A 5
dynamic scoping
In main before calling A 4
In A before calling B 1, 2
In B 2, 1
In A after calling B 2, 2
In main after calling A 4
موفق باشید