(새 문서: 분류: 프로그래밍 언어 == 개요 == Scope란 특정 변수가 유효한 범위를 말한다. Scope은 같은 이름이 겹치는 것을 막아준다. 예를 들어서 <code>f(x) -> x + y</code> 라는 함수에 인자로 <code>val y = 5; 10 * y</code>를 넣었다고 해보자. 그럼 만약 Scope가 없다면, 결과가 <code>f(val y = 5; 10 * y) -> val y = 5; ; 10 * y + y</code>가 되어 55라는 결과가 나온다. 그러나 함수 f(x)의 정의는 사실 올...)
 
편집 요약 없음
 
7번째 줄: 7번째 줄:


== Static scope ==
== Static scope ==
정적 범위를 가지는 언어는 [[Syntax]]적으로 제한되는 범위를 가진다. Static scope은 명시적으로 scope가 정해지기 때문에, 함수를 이해하고 검증하기 쉽다는 장점을 가진다.  
정적 범위를 가지는 언어는 [[Syntax]]적으로 제한되는 범위를 가진다. Static scope은 명시적으로 scope가 정해지기 때문에, 함수를 이해하고 검증하기 쉽다는 장점을 가진다. 따라서, 대부분의 현대언어는 Static scope를 기본 scope정책으로 채택하고 있다.
<syntaxhighlight lang="scala">
<syntaxhighlight lang="scala">
def f(p) = n;
def f(p) = n;

2023년 2월 27일 (월) 01:21 기준 최신판


개요

Scope란 특정 변수가 유효한 범위를 말한다. Scope은 같은 이름이 겹치는 것을 막아준다. 예를 들어서 f(x) -> x + y 라는 함수에 인자로 val y = 5; 10 * y를 넣었다고 해보자. 그럼 만약 Scope가 없다면, 결과가 f(val y = 5; 10 * y) -> val y = 5; ; 10 * y + y가 되어 55라는 결과가 나온다. 그러나 함수 f(x)의 정의는 사실 올바르지 않은 정의이다. 왜냐하면 y가 정의되어 있지 않기 때문이다. 이러한 문제를 해결하는 것이 scope이다.

더욱 엄밀하게 말하여서 Static scope는 statically하게 identifier의 범위가 정해지는 것을 말하여, dynamic scope는 runtime에서 identifier의 scope가 정해지는 것을 말한다. 위의 예시에서 f(x) -> x + y의 경우, static scope에서는 valid하지 않지만, dynamic scope에서는 valid하다.

Static scope

정적 범위를 가지는 언어는 Syntax적으로 제한되는 범위를 가진다. Static scope은 명시적으로 scope가 정해지기 때문에, 함수를 이해하고 검증하기 쉽다는 장점을 가진다. 따라서, 대부분의 현대언어는 Static scope를 기본 scope정책으로 채택하고 있다.

def f(p) = n;
{ val n = 5; f(10) }

위의 예시에서, static scope의 범위는 {부터 }사이가 된다. 이는 문법적으로 정해진 것으로, static scope는 문법에 틀리기 때문에 static time (compiler가)위의 코드를 reject한다.

Dynamic scope

동적 범위를 가지는 언어는 Runtime에 변수의 범위를 가진다.

def f(p) = n;
{ val n = 5; f(10) }

dynamic scope에서는 runtime에 범위를 정하기 때문에, runtime에서 n이 존재하는 지를 검사한다. 위의 경우에는, f(10)은 5라는 값을 내보내게 된다.

Dynamic scope를 Inference rule를 통해서 나타내면 다음과 같다:

[math]\begin{array}{c}{ f\in\mathit{Domain}(\Lambda) \quad \Lambda(f)=(x,e’) \quad \sigma,\Lambda\vdash e\Rightarrow v’ \quad \sigma\lbrack x\mapsto v’\rbrack,\Lambda\vdash e’\Rightarrow v } \\\hline { \sigma,\Lambda\vdash f(e)\Rightarrow v }\end{array}[/math][1]

참고