프로그래밍 언어론 3-3-2강. 중첩 서브루틴(Nested Subroutines)

[프로그래밍 언어론]

2019. 10. 26. 14:31

 

[중첩 서브루틴]

: 수많은 언어들은 중첩 서브루틴 지원한다.

: 대부분의 절차적 언어에서 특정 스코프 벗어나면 그 내부에 있던 요소들을 볼 수 없다.

: 내부 서브루틴에서 외부의 name과 중복되는 이름 선언시, 외부 name 바인딩은 해당 scope내에서 deactivate된다.

: 대부분의 절차적언어에서 특정 위치에서 사용된 변수를 해당 바인딩과 가장 가까운 스코프에서 찾아나간다. (현재 subroutine ~ 전역변수까지)

 

 

[Built-in, Predefined Object]

: I/O루틴, 수학함수, 기본타입과 같은 것들 제공하는 가장 밖의 추가, 보이지않는 scope

: 내부에서 name 중복선언시, hidden 된다.

 

 

[Scope내의 hole]

: 내부 subroutine에서 외부 name과 중복된 name으로 선언되면, 외부 name은 해당 scope에서 hidden된다.

: 이를 name 외부 바인딩이 해당 scope안에서 hole 가진다고 한다.

F1 subroutine에서 hole 가지는 name X의 모습

: 일반적으로 hidden된 바인딩에 접근할 수 없지만, qualifier나 scope resolution과 같은것을 변수에 적용시켜 사용이 가능하다.

(Ada에서 함수명.변수명 , C++에서 ::변수명 식으로 사용가능)

 

 

[지역에서 선언되지 않은 객체의 접근]

: 외부 subroutine에서 선언된 객체(변수)를 지역 subroutine에서 사용할때 접근법

: 각 subroutine의 frame에서 자기 이전 단계 frame을 가르키는 포인터가 있어 순차적으로 외부 scope에서 검색이 가능하다.

 (offset 주소 기반 검색 사용 - 이전장)

 

...더보기

지금 이렇게 외부 scope에 접근법.. 과 같이 이전단계 frame으로 이동을 말하는데,

이때 정적 스코프냐 동적 스코프냐에 따라 이전단계 frame 다른거 인식해야한다.

 

정적 스코프에서는 실행 코드(main등)와 관계없이, 그냥 소스코드만 보고 자기 외부 scope로 이동 생각해야하고,

동적 스코프에서야 main과 같은 실행 코드보면서 실행 흐름에 따른 코드 접근 시작해야한다.