안녕하세요

프로그래밍 언어 개념 연습문제 8장 본문

Study_exam/프로그래밍 언어 개념 연습문제

프로그래밍 언어 개념 연습문제 8장

godxxy1229 2023. 6. 5. 16:49

01. 부프로그램의 정적 조상은 무엇인가? 부프로그램의 동적 조상은 무엇인가?


02. 블록이란 무엇인가?


03. 정적 영역과 동적 영역을 갖는 프로그램에서 비지역 변수에 대한 참조가 어떻게 연결되는지 구별하라.


04. 정적 영역과 동적 영역이 갖는 장점과 단점은 무엇인가?


05. Algol 형태의 골격 프로그램 구조에서 각 단위 프로그램의 참조 환경을 나열하여라. 단, 각 변수 이름마다 어느 단위 프로그램에서 선언된 변수인지를 명확히 하라.


06. Ada에서 사용되는 제어 변수의 영역과 Pascal에서의 제어 변수 영역과의 차이점을 논하거나 C, C++, Ada에서 제어변수 영역의 차이점을 논하라.

- 차이점

* C, C++‘{’(brace)로 블럭을 설정하여 영역을 표현하는 블록 중심의 언어이다.

* C++for문의 초기화 식에 제어변수가 새로 정의되는 것을 허용한다.

* C++에서는 변수 정의가 함수의 어느 부분에도 나타날 수 있다.

* C에서는 주 프로그램 역시 프로그램의 다른 부분과 분리되는 자신의 지역

영역을 가지는 하나의 함수이기 때문에 외부 영역만이 전역 영역을 갖는다.

 

* Ada는 선언부에서만 변수를 정의할 수 있다.

* Ada에서는 procedure, package, task의 세 가지 영역 단위를 사용한다.

* Ada에서는 이름 한정이나, use를 통해 변수의 전역적인 속성을 부여할 수 있다.

* Ada에서는 가시성을 결정해 주는 일반적인 규칙으로서 지역 식별자들 다음에

전역 식별자 순으로 적용된다.


07. Ada 언어에서 영역 구멍(hole-in-scope) 상태에 있는 비지역 변수를 접근하는 방법을 조사하여라.

이름 한정(qualification)

  procedure HERE is  
    procedure THEN is
A : REAL ;
B : REAL ;
   
    procedure NOW is
B : REAL ; -- 이 선언으로 THEN.B가 숨겨짐.
C : REAL ;
begin
B := A ; -- NOW.B := THEN.A
C := THEN.B ; -- NOW.C := THEN.B
end NOW ;
   
    begin
...
end THEN ;
   
  begin
.. end HERE ;
   

위의 예제 프로그램의 NOWBTHENB가 영역 구멍 상태에 놓일 수 있지만

THEN.B라는 이름 한정을 통해서 NOWBTHENB를 서로 구분하여

사용할 수 있다.

 

use의 사용

  procedure HERE is
A : INTEGER ;
B : INTEGER ;
 
    procedure THEN is
A : REAL ;
B : REAL ;
   
    procedure NOW is
D : REAL ;
use HERE ;
begin
A := D ;
B := THEN.B ;
end NOW ;
   
    begin
...
end THEN ;
   
  begin
.. end HERE ;
   

위의 예제 프로그램의 HEREA, Buse를 통해서 접근할 수 있다.

 

08. 다음 Pascal 골격 프로그램을 가지고 다음 물음에 답하라.

Program main;
var x: integer;
procedure sub3; forward;
procedure sub1;
    var x: integer;
    procedure sub2;
        begin (sub2}
        ...
        end; (sub2}
    begin {sub1}
    ...
    end; {sub1}
procedure sub3;
    begin {sub3}
    ...
    end; {sub3}
begin{main}
...
end. {main}

 

위의 프로그램이 다음과 같은 순서로 호출하여 실행된다고 가정한다.
        main → sub1 → sub2 → sub3
① 정정 영역을 가정하면, 다음 각 부프로그램에서 x에 대한 참조는 x의 어느 선언인가?
(a) sub1
(b) sub2
(c) sub3
② 동적 영역을 가정하고서, ①의 문제를 반복하시오.


09. 다음 프로그램이 정적 영역 규칙을 사용하여 컴파일되어 실행되었다고 가정한다. 프로시저 sub1에서 출력된 x의 값은 무엇인가? 동적 영역규칙에서는 프로시저 sub1에서 출력된 x의 값은 무엇인가?

program main;
    var x: integer;
    procedure sub1;
        begin {sub1}
        writeln('x=', x)
        end; {sub1}
    procedure sub2;
        var x: integer;
        begin (sub2)
        x := 10
        sub1
        end: {sub2}
begin {main}
x := 5;
sub2
end, {main}

10. 다음 프로그램을 생각해 보자.

program main;
    var x, y, z, : integer;
    procedure sub1;
        var a, y, z : integer;
        procedure sub2;
        var a, b, z : integer:
        begin {sub2}
        ...
        end: {sub2}
    begin {sub1}
    ...
    end: {sub1}
    procedure sub3;
        var a, x, w : integer;
        begin {sub3}
        ...
        end; {sub3}
begin {main}
...
end. {main}

 

정적 영역이 사용된다고 가정하고, subt, sub2, sub3의 각 몸체에서 가시적인 모든 변수들을 그 변수가 선언된 프로그램 단위와 함께 나열하시오.

 

11. 다음 C 프로그램을 생각해 보자.

void fun(void) {
    int a, b, c;    /* 정의 1 */
    ...
    while (...) {
        int b, c, d;    /* 정의 2 */
        ...  ◀─────────── 1
        while (...) {
            int c, d, e;    /* 정의 3 */
            ...  ◀─────── 2
        }
        ...  ◀─────────── 3
    }
    ...  ◀─────────────── 4
}

 

위 함수에서 명시된 4지점에 대해서, 가시적인 변수와 이 변수를 정의하는 정의문 번호를 함께 나열하시오.


12. 다음 C 골격 프로그램을 생각해 보자.

void fun1(void); /* 원형 */
void fun2(void); /* 원형 */
void fun3(void); /* 원형 */
	int x, y, z,
void main();
	...
}
void fun1(void) {
    int a, y, z;
    ...
    }
void fun2(void) {
    int a, b, z;
    ...
    }
void fun3(void) {
	int a, x, w;
    ...
    }
}

 

다음 각 경우 호출 순서가 주어져 있고 정적 영역 규칙과 동적 영역 규칙이 사용된다고 가정하면, 마지막으로 호출된 함수가 실행되는 동안에 가시적인 변수는 어떤 변수인지 함수 이름과 함께 나열하시오.
(a) main은 fun1을 호출; fun1은 fun2를 호출; fun2는 fun3을 호출

(b) main은 fun1을 호출; fun1은 fun3을 호출
(c) main은 fun2를 호출; fun2는 fun3을 호출; fun3은 fun1을 호출
(d) main은 fun3을 호출; fun3은 fun1을 호출

(e) main은 fun1을 호출; fun1은 fun3을 호출; fun3은 fun2를 호출
(f) main은 fun3을 호출; fun3은 fun2를 호출; fun2는 fun1을 호출