블록 구조 언어
앞선 포스팅에서는 변수의 선언과 선언된 변수의 범위에 대해 간단하게 알아보았다. 이제 블록 구조에 대해 알아보자. 블록이란 프로그램 중 서로 연관된 선언문과 실행문들을 묶어놓은 프로그래밍 단위로, 보통의 블럭은 선언문들과 실행문들로 구성된다. 많은 언어에서 중괄호나 begin-end로 구분된다. C, Pascal 등의 언어에서는 프로시저 / 함수도 하나의 블록이다.
이러한 블록의 중첩을 허용하는 언어를 블록 구조 언어라 한다. Algol, Pascal, Modula, Ada, C 언어 등이 블록 구조를 지원하며, 우리가 계속 설계해온 언어 S 역시 블록 구조 언어에 해당한다. 대부분의 블록 구조 언어는 정적 유효범위 규칙에 따라 블록에서 선언된 변수는 선언된 블록 내에서만 유효하다.
블록 구조 언어의 특징 / 장점은 다음과 같다.
1. 잘 작성된 블록 단위 프로그램은 복잡한 수행 내용을 단순화하며 프로그램 가독성을 높임.
2. 수행 중 발생한 오류는 범위가 블록 단위로 한정되므로 블록의 수정, 삭제 등이 용이함.
3. 블록 내 선언된 변수들은 그 안에서만 유효하며, 실행 종료 후에는 기존 선언되었던 변수들은 모두 무효화.
4. 메모리 관리에 효과적.
다음으로 여러 블록 구조 언어를 살펴보자.
Pascal
Pascal 프로그램의 가장 바깥 블록은 program이며, 이 program 내에 변수 선언, 프로시저(함수) 정의가 가능하다. 프로시저 또한 하나의 블록으로 내부에 변수 선언과 프로시저 선언이 가능하다. 어떤 블록이든 선언 뒤에 나오는 begin - end 사이에 실행문 나열이 가능하다.
C
C 언어에서는 중괄호로 블록을 구분하며, 블록의 중첩 역시 가능하다.
Variable declaration; // 변수 선언
return type function_name(param) {
Variable declaration;
Statements;
}
C 언어는 블록 내 변수 선언이 가능하며, 함수 밖에다 변수를 선언하는 것도 가능하다. 블록 내 선언된 변수는 블록의 범위 내에서만 사용 가능한 지역 변수이며, 블록 밖에 선언된 변수는 전역 변수에 해당한다. C 언어 유효범위의 핵심은 사용 전 선언이며, 이것은 모든 변수는 사용하기 이전에 선언을 먼저 해야 함을 의미한다. 이 원칙에 따르면 지역 변수의 유효 범위는 선언된 지점부터 선언된 블록 끝까지이며, 전역 변수의 유효 범위는 선언된 지점부터 파일 끝까지이다.
만약 전역 변수 x를 선언한 뒤, 함수 fun 내에서 다시 지역 변수 x를 선언하여 함수 fun 내에서 변수 x를 사용하면 이 x는 무엇일까? 유효범위 규칙에 의하면 전역 변수 x와 지역 변수 x 모두 블록 내에서 사용 가능하지만, 최중첩된 선언을 우선시하므로 함수 fun 내에서 사용하는 x는 지역 변수 x이다.
Ada
다음과 같은 declare - begin - end가 하나의 블록으로 declare 다음에는 선언이, begin - end 사이에 실행문이 위치한다. 선언된 이름의 유효 범위는 선언된 블록 내부이다. 다음은 Ada 언어의 짧은 예시이다.
declare
x: integer;
y: boolean;
begin
x := 2;
y := true;
x := x + 1;
...
end;
Ada의 유효범위 규칙의 핵심은 선언된 식별자의 유효범위는 선언된 블록 내라는 것으로, begin - end 내에 다른 블록이 중첩되어 사용될 수 있다. 즉, begin - end 사이에 다시 declare - begin - end 블록을 사용해 중첩된 블록을 사용할 수 있다.
ML
ML은 함수형 언어임에도 불구하고 중첩된 블록을 허용하는 블록 언어의 특징도 가지고 있는데, let - in - end가 하나의 블록이 된다. let 다음에 변수 / 함수를 선언할 수 있으며 in - end 사이에 실행문이 위치할 수 있다.
이렇게 블록 구조 언어에 대해 간단히 알아보았는데, 다음 포스팅에서는 변수의 상태와 상태 전이 등에 대해 알아보도록 하겠다.
'CS > 프로그래밍 언어론' 카테고리의 다른 글
[프로그래밍 언어론] 의미론(sementics) - 수식의 의미 (1) | 2025.07.02 |
---|---|
[프로그래밍 언어론] 변수의 상태와 의미 (1) | 2025.07.01 |
[프로그래밍 언어론] 변수의 범위 (0) | 2025.06.30 |
[프로그래밍 언어론] 어휘 분석기 (1) | 2025.06.29 |
[프로그래밍 언어론] Parser와 추상 구문 트리 (0) | 2025.06.26 |