기본 콘텐츠로 건너뛰기

방송대 방통대 프로그래밍언어론 6강 - 프로그래밍 언어의 정의와 구현 과정 - 요약 노트 시험족보 예상문제 - 올에이클래스

0-썸네일-요약노트-프로그래밍언어론-6강

프로그래밍언어론 6강 - 프로그래밍 언어의 정의와 구현 과정

프로그래밍 언어가 구문 규칙과 의미 규칙으로 어떻게 정의되는지 이해하고, 인터프리터와 컴파일러가 언어 정의를 실제 실행으로 연결하는 방식을 학습한다. 전통적 언어와 새로운 패러다임 언어의 구현 차이, 컴파일러·인터프리터의 단계와 자료구조, 어휘 분석기와 순환 하강 구문 분석기의 동작까지 차례로 살펴본다.

제1장 프로그래밍 언어의 정의와 구현

1. 언어 정의를 이루는 두 규칙

프로그래밍 언어를 정의하려면 구문 규칙의미 규칙이 모두 필요하다. 구문 규칙은 어떤 기호와 문장 배열이 그 언어에서 올바른 프로그램의 형태인지 규정한다. 반면 의미 규칙은 구문 규칙에 맞게 작성된 프로그램을 실행할 때 각 문장이 무엇을 뜻하고 어떻게 동작해야 하는지 규정한다.

두 규칙은 서로 다른 질문에 답한다. 구문 규칙은 “이 프로그램을 올바르게 썼는가?”를 판정하고, 의미 규칙은 “올바르게 쓴 이 프로그램을 실행하면 어떤 동작이 일어나야 하는가?”를 설명한다. 형태가 잘못된 프로그램에는 의미를 부여하기 어렵고, 형태만 정하고 의미를 정하지 않으면 같은 문장을 구현마다 다르게 실행할 수 있으므로 둘은 함께 정의되어야 한다.

구분핵심 질문주요 정의 방법
구문 규칙어떤 프로그램이 올바른 형태인가?문맥 자유 문법, BNF, EBNF, 구문 도표
의미 규칙올바른 프로그램은 어떻게 실행되어야 하는가?기능적 의미론, 표기적 의미론, 공리적 의미론, 자연어

구문 규칙은 문맥 자유 문법과 EBNF를 주로 사용해 형식적으로 기술한다. 의미 규칙에도 기능적 의미론, 표기적 의미론, 공리적 의미론과 같은 체계가 있지만 실제 언어 설명에서는 자연어가 주로 사용된다. 형식 문법은 문장의 구조를 엄밀하게 판별하기 좋고, 자연어 의미 설명은 각 명령의 효과를 학습자가 이해하기 쉽게 전달할 수 있다.

2. 로봇 제어 언어로 보는 정의의 예

강의의 로봇 제어 언어는 구문과 의미의 차이를 간단하게 보여 준다. 구문 규칙 <program> ::= { forward | left | right }는 프로그램이 forward, left, right라는 세 명령을 반복해 나열한 형태임을 나타낸다. 이 규칙만 보면 어떤 문자열이 프로그램으로 허용되는지는 알 수 있지만, 각 명령을 실행했을 때 로봇이 어떻게 움직이는지는 알 수 없다.

의미 규칙은 forward를 로봇이 향하는 방향으로 단위 길이만큼 이동하는 동작, left를 90도 좌회전하는 동작, right를 90도 우회전하는 동작으로 정한다. 예를 들어 forward left forward는 구문 규칙에 맞으며, 의미 규칙까지 적용해야 로봇이 한 칸 전진하고 왼쪽으로 방향을 바꾼 뒤 다시 한 칸 전진한다는 실행 결과를 알 수 있다.

핵심 구분: 문법이 허용하는 명령의 배열은 구문이고, 각 명령이 실제로 일으키는 상태 변화는 의미이다. 언어 구현은 먼저 구문을 검사한 뒤 올바른 프로그램에 의미 규칙을 적용해야 한다.

3. 프로그래밍 언어 구현의 뜻

프로그래밍 언어의 구현은 그 언어로 작성된 프로그램을 수행하는 프로그램이다. 대개 구현 자체도 어떤 프로그램을 입력으로 받는 프로그램 형태로 주어진다. 언어 L의 구현은 먼저 L로 작성된 프로그램 PL이 구문 규칙을 따르는지 검사한다. 올바르면 PL과 입력 데이터를 받아 L의 의미 규칙에 따라 실행하고 출력 데이터를 만든다.

CPU도 비슷한 함수 모형으로 이해할 수 있다. 기계어를 M, 기계어 프로그램을 PM, 입력을 in, 출력을 out이라고 하면 CPU의 수행은 M(PM, in) = out으로 나타낼 수 있다. 일반 프로그래밍 언어의 이상적인 수행 관계도 L(PL, in) = out으로 생각할 수 있지만, 실제 CPU는 고수준 언어 L을 직접 이해하지 못하므로 인터프리터나 컴파일러가 그 간격을 메운다.

4. 인터프리터와 컴파일러의 함수 모형

언어 L의 인터프리터 IntLL로 작성된 프로그램과 입력을 직접 받아 해석하고 결과를 낸다. 이를 IntL(PL, in) = out으로 나타낼 수 있다. 인터프리터는 언어의 문장을 해석하면서 CPU와 비슷한 실행 기능을 수행한다.

컴파일러 CompL은 고수준 언어 프로그램을 곧바로 실행하는 대신 저수준 언어 프로그램으로 변환한다. 즉 CompL(PL) = PM의 변환을 수행하고, 생성된 기계어 프로그램은 CPU가 M(PM, in) = out의 형태로 실행한다. 컴파일은 번역 단계와 번역 결과의 실행 단계가 분리된다는 점이 인터프리트 방식과 구별된다.

구분입력과 처리결과
인터프리터고수준 프로그램과 입력을 받아 문장을 해석하며 수행실행 결과인 출력 데이터
컴파일러고수준 프로그램을 저수준 프로그램으로 번역CPU가 실행할 목적 프로그램
CPU기계어 프로그램과 입력 데이터를 받아 수행출력 데이터

제2장 프로그래밍 언어의 구현 방법

1. 전통적인 언어의 구현

명령형·절차형·객체지향 언어는 전통적으로 기계어의 기능을 단계적으로 확장하는 형태로 구현한다. 명령형 언어는 저급 언어가 제공하는 연산과 명령어를 더 편리하고 풍부한 형태로 확장한다. 변수 대입, 산술 연산, 조건 분기, 반복문과 같은 표현은 결국 기계가 수행할 수 있는 상태 변경과 제어 이동으로 번역될 수 있다.

절차형 언어는 명령형 언어에 사용자 정의 연산인 함수와 사용자 정의 명령어인 프로시저를 지원하는 형태이다. 반복되는 계산을 함수로 묶고, 일련의 작업을 프로시저로 정의하여 호출할 수 있다. 객체지향 언어는 절차형 언어에 사용자 정의 데이터 타입을 지원하는 방향으로 확장된다. 사용자가 데이터의 구조와 그 데이터를 다루는 연산을 새로운 타입으로 정의할 수 있다는 점이 핵심이다.

언어 유형구현 관점추가되는 핵심 기능
명령형 언어저급 언어의 연산과 명령어 확장고수준 연산과 제어 명령
절차형 언어명령형 언어의 확장사용자 정의 함수와 프로시저
객체지향 언어절차형 언어의 확장사용자 정의 데이터 타입

2. 새로운 패러다임 언어와 추상기계

함수형 언어나 논리 언어는 계산을 바라보는 방식이 기계어의 명령 순서와 직접 대응하지 않으므로, 단순히 기계어를 확대한 형태만으로 구현하는 데 한계가 있다. 이를 해결하기 위해 언어의 계산 모델과 실제 하드웨어 사이에 추상기계를 둔다. 원래 언어의 프로그램을 추상기계가 이해하는 프로그램으로 바꾼 뒤, 추상기계의 동작을 실제 하드웨어 위에서 구현한다.

함수형 언어의 계산 모델은 람다 계산법이며, 구현을 위한 추상기계로 CPS, G-machine, SGM, STGM, TIM 등이 사용될 수 있다. 논리 언어의 계산 모델은 연역 논리이며, 대표적인 추상기계로 WAM 등이 있다. 추상기계가 구체적인 구현물로 제시되어 코드를 독자적으로 수행할 수 있으면 이를 가상기계라고 한다.

언어계산 모델추상기계의 예
함수형 언어람다 계산법CPS, G-machine, SGM, STGM, TIM 등
논리 언어연역 논리WAM 등

추상기계는 언어의 계산 원리와 하드웨어 명령 사이를 연결하는 개념적 징검다리이다. 가상기계는 그 추상기계를 실제로 구현하여 독자적으로 코드를 수행할 수 있게 한 경우이므로, 두 용어를 완전히 같은 뜻으로 사용해서는 안 된다.

3. 컴파일러의 분석 단계와 생성 단계

컴파일러 구현은 크게 분석 단계생성 단계로 나뉜다. 전단부라고도 하는 분석 단계는 주어진 원시 프로그램의 구조를 파악하고 중간 표현 또는 중간 코드를 만든다. 이 단계는 원시 프로그램이 어떤 어휘, 문법, 타입과 의미 규칙을 갖는지 알아야 하므로 프로그래밍 언어에 종속적이다.

후단부라고도 하는 생성 단계는 중간 표현으로부터 목적 기계에 적합한 명령어를 생성한다. 목적 기계의 명령어 종류, 레지스터와 메모리 구조를 고려하여 효율적인 목적 코드를 만들어야 하므로 목적 기계에 종속적이다. 중간 표현은 언어에 가까운 전단부와 기계에 가까운 후단부를 분리하는 접점 역할을 한다.

시험 포인트: 전단부는 원시 언어에 종속되어 프로그램을 분석하고 중간 표현을 만든다. 후단부는 목적 기계에 종속되어 중간 표현을 효율적인 목적 코드로 바꾼다.

4. 인터프리터의 구현 단계

인터프리터도 프로그램의 구조를 알아야 하므로 컴파일러 전단부와 같은 분석 단계를 거친다. 차이는 분석 뒤의 처리에 있다. 컴파일러가 중간 표현을 목적 코드로 변환한다면, 인터프리터는 중간 표현을 순회하면서 프로그램을 곧바로 수행한다.

인터프리터 엔진은 프로그래밍 언어의 문장 단위로 중간 표현을 해석하고 각 문장의 의미에 해당하는 동작을 실행한다. 따라서 “인터프리터는 분석을 하지 않는다”거나 “원시 문자열을 아무 구조 없이 한 줄씩 읽기만 한다”는 설명은 옳지 않다. 어휘와 구문을 파악하여 실행 가능한 내부 표현을 만드는 과정이 필요하다.

제3장 언어 구현의 핵심 자료구조와 실행 환경

1. 구문 트리

구문 트리는 언어 구현 단계의 중심을 차지하며 분석 단계 전 과정을 관통하는 자료구조이다. 어휘 분석 결과인 토큰들이 문법적으로 어떤 관계를 이루는지 계층 구조로 표현한다. 이후 의미 검사, 중간 코드 생성, 인터프리터 실행 등 여러 단계가 구문 트리를 순회하며 필요한 작업을 수행한다.

구문 트리에는 파스 트리와 추상 구문 트리가 있다. 파스 트리는 문법을 적용한 과정을 그대로 보여 주기 위해 비단말기호와 단말기호 등 문법 기호 정보를 모두 포함한다. 추상 구문 트리, 즉 AST는 괄호나 중간 비단말기호처럼 번역에 불필요한 세부 정보를 줄이고 연산자와 피연산자 등 번역에 필요한 핵심 구조만 포함한다.

예를 들어 1 + 5 * 2의 파스 트리는 여러 <exp><digit> 노드를 포함한다. AST에서는 루트의 + 아래에 값 1과 곱셈 노드 *가 놓이고, 곱셈 노드 아래에 52가 놓인다. 이 구조는 곱셈이 덧셈보다 먼저 계산된다는 연산 구조를 간결하게 보존한다.

2. 심볼 테이블과 환경

컴파일러의 심볼 테이블은 프로그램에서 정의하거나 선언한 식별자 정보를 저장한다. 변수나 함수의 이름, 타입, 선언 위치와 같은 정보를 기록하여 중복 선언이나 타입 사용을 검사하고 코드 생성에 활용한다. 이름이 나타날 때마다 원시 프로그램 전체를 다시 찾지 않고 표에서 관련 정보를 조회할 수 있다.

인터프리터의 환경은 심볼 테이블보다 확장된 개념이다. 식별자의 이름과 타입, 선언 정보뿐 아니라 현재 실행 시점의 값 정보도 알 수 있어야 한다. 인터프리터 엔진이 대입문을 실행하거나 식을 계산할 때 환경에서 값을 읽고 갱신한다.

자료구조주요 사용자저장하거나 표현하는 정보
구문 트리컴파일러와 인터프리터의 분석·번역·실행 단계프로그램의 계층적 문법 구조
심볼 테이블주로 컴파일러식별자의 타입, 선언 위치 등 정적 정보
환경주로 인터프리터식별자 정보와 실행 중인 값

3. 실행 환경의 메모리와 레지스터

실행 환경은 언어를 정의하고 번역하는 자료구조 자체는 아니지만, 번역된 프로그램을 실행할 때 반드시 필요하다. 실행 환경은 프로그램의 코드와 데이터를 담을 메모리 구조, 그리고 메모리와 실행 상태를 관리할 레지스터를 제공한다.

메모리는 정적 세그먼트와 동적 세그먼트로 나눌 수 있다. 정적 세그먼트에는 코드와 정적 데이터가 들어간다. 동적 세그먼트에는 함수 호출과 지역 정보를 관리하는 스택, 실행 중 동적으로 생성되는 데이터를 관리하는 힙이 포함된다.

전용 레지스터는 특정 실행 관리 기능을 맡는다. PC는 다음에 수행할 명령의 위치, SP는 스택의 현재 꼭대기, FP는 현재 활성화된 함수 호출 영역의 기준 위치를 관리한다. 범용 레지스터는 연산의 피연산자나 임시 결과 등 여러 목적으로 사용된다.

구문 트리·심볼 테이블·환경은 프로그램을 분석하고 번역하거나 해석하기 위한 구현 자료구조이다. 메모리 세그먼트와 레지스터는 완성된 프로그램의 실제 실행을 지원하는 실행 환경이라는 점에서 역할을 구분해야 한다.

제4장 어휘 분석기와 구문 분석기의 실제

1. 어휘 분석기의 역할

어휘 분석기는 원시 프로그램의 문자 흐름에서 의미 있는 어휘를 구별한다. 예약어, 식별자, 리터럴, 연산자 등이 대표적인 어휘이며, 분석 결과는 토큰의 열로 구문 분석기에 전달된다. 필요한 경우 토큰 종류뿐 아니라 식별자의 이름이나 리터럴의 실제 값 같은 속성도 함께 전달한다.

대부분의 어휘 분석기는 유한 상태 기계, 즉 FSM을 구성하여 구현한다. 현재 상태와 새로 읽은 문자에 따라 다음 상태로 이동하고, 하나의 어휘가 끝났다고 판단하면 해당 토큰을 만든다. 이 방식은 문자 패턴을 체계적으로 인식하고 서로 비슷한 어휘를 구분하는 데 적합하다.

2. 유한 상태 기계로 토큰 구별하기

강의의 FSM은 첫 글자가 영문자이면 이후의 영문자나 숫자를 계속 읽어 식별자 토큰 ID를 만든다. 첫 글자가 숫자이면 숫자를 반복해 읽어 정수 리터럴 LIT_INT를 인식할 수 있다. 숫자 뒤에 e, 이어서 +와 숫자들이 나오면 지수 표기 실수 리터럴 LIT_DBL로 인식한다.

시작 상태에서 +를 읽으면 덧셈 연산자 OP_PLUS, =를 읽으면 대입 연산자 OP_ASSIGN을 만든다. 따라서 x=2+34는 식별자, 대입 연산자, 정수 리터럴, 덧셈 연산자, 정수 리터럴의 토큰열이 된다. x=2e+34에서는 2e+34 전체가 지수 표기 실수 리터럴 하나로 인식된다.

처리 흐름: 어휘 분석기는 문자를 읽어 토큰과 속성을 만들고, 구문 분석기는 그 토큰열이 문법 규칙에 맞는지 확인하며 구문 트리를 구성한다. 문자에서 토큰, 토큰에서 트리로 정보가 구조화된다.

3. 구문 분석기와 두 종류의 구문 트리

구문 분석기는 어휘 분석기가 만든 토큰열로부터 구문 트리를 구성한다. 이 과정에서 문법 규칙에 맞지 않는 토큰 배열을 발견하면 구문 오류를 보고한다. 구문 분석기의 결과는 문법 정보를 모두 담은 파스 트리일 수도 있고, 번역에 필요한 정보만 남긴 AST일 수도 있다.

파스 트리는 문법 유도 과정을 확인하거나 문법 자체를 설명하는 데 유용하다. AST는 불필요한 문법 노드를 제거하여 후속 의미 분석, 최적화, 코드 생성 또는 해석 실행에서 다루기 쉽다. 두 트리는 서로 다른 프로그램을 표현하는 것이 아니라 같은 프로그램을 서로 다른 상세 수준으로 표현한다.

4. 순환 하강 구문 분석기의 원리

순환 하강 구문 분석기는 문법 규칙을 그대로 프로시저로 바꾼 형태이다. 각 비단말기호의 문법 규칙마다 하나의 프로시저를 만들고, 규칙의 우변을 모사하도록 프로시저 본문을 작성한다. 우변에 단말기호가 있으면 현재 입력 토큰이 그 단말기호와 일치하는지 검사하고, 비단말기호가 있으면 해당 비단말기호의 프로시저를 호출한다.

프로시저가 서로를 호출하거나 자기 자신을 호출하면서 문법 구조를 따라 내려가므로 순환 하강이라는 이름을 사용한다. 입력을 한 방향으로 읽는 동안 현재 미리보기 토큰을 확인하고, 기대한 단말기호와 일치하면 다음 토큰으로 진행한다. 일치하지 않으면 구문 오류를 발생시킨다.

5. 괄호 문자열 문법과 구현

강의의 예제 문법은 여러 줄의 올바른 괄호 문자열을 인식한다. <L> ::= <S> newline <L> | EOF에서 L은 한 줄의 괄호 문자열 S와 줄바꿈, 이어지는 나머지 입력 L로 구성되거나 파일 끝 EOF가 된다. 따라서 여러 줄을 재귀적으로 처리할 수 있다.

<S> ::= '(' <S> ')' <S> | ε에서 S는 여는 괄호, 내부의 올바른 문자열, 닫는 괄호, 뒤따르는 올바른 문자열로 구성되거나 빈 문자열이 된다. 첫 번째 재귀 S는 괄호의 중첩을, 두 번째 재귀 S는 같은 수준에서 괄호 쌍이 이어지는 연결을 표현한다. 따라서 (), ()()(), ()(())는 만들 수 있지만 ()), )()(, (()처럼 짝이 맞지 않는 문자열은 만들 수 없다.

구현에서 전역 변수 LA는 현재 미리보기 토큰을 보관하고, nexttoken()은 다음 문자를 읽는다. match(token)LA가 기대한 토큰과 같으면 다음 토큰을 읽고, 다르면 error를 호출한다. 프로시저 L()은 EOF이면 종료하고 그렇지 않으면 S(), 줄바꿈 일치, 다시 L()을 수행한다.

프로시저 S()은 미리보기 토큰이 여는 괄호일 때 match('('), S(), match(')'), S()를 차례로 수행한다. 여는 괄호가 아니면 아무 동작 없이 반환하여 빈 문자열 ε를 구현한다. 문법의 비단말기호 LS가 각각 같은 이름의 프로시저로 직접 대응한다는 점이 순환 하강 구문 분석기의 핵심이다.

빈 문자열 규칙을 구현한 else ;는 아무 입력이나 무조건 허용한다는 뜻이 아니다. 호출한 상위 프로시저가 이어서 닫는 괄호나 줄바꿈처럼 기대하는 단말기호를 match하므로, 전체 문법에 맞지 않는 입력은 결국 오류로 판정된다.

핵심 개념 정리

프로그래밍 언어는 올바른 프로그램의 형태를 정하는 구문 규칙과, 올바른 프로그램의 실행 의미를 정하는 의미 규칙으로 정의한다. 언어 구현은 프로그램의 구문을 검사하고 의미 규칙에 따라 수행할 수 있게 만든 프로그램이다.

인터프리터는 분석한 중간 표현을 순회하며 문장 단위로 실행한다. 컴파일러는 언어 종속적인 전단부에서 프로그램을 분석해 중간 표현을 만들고, 목적 기계 종속적인 후단부에서 효율적인 목적 코드를 생성한다.

명령형·절차형·객체지향 언어는 기계어를 단계적으로 확장하는 관점으로 구현할 수 있다. 함수형·논리 언어는 계산 모델과 하드웨어 사이에 추상기계를 두는 방식이 중요하며, 추상기계가 독자적으로 코드를 실행하는 구체적 구현물이 되면 가상기계라고 한다.

구문 트리는 분석 전 과정을 연결하며, 파스 트리는 문법 기호를 모두 포함하고 AST는 번역에 필요한 핵심만 남긴다. 심볼 테이블은 식별자의 타입과 선언 위치를, 인터프리터 환경은 이에 더해 실행 중 값까지 관리한다. 실제 실행에는 코드·정적 데이터·스택·힙으로 이루어진 메모리와 PC·SP·FP 같은 레지스터도 필요하다.

어휘 분석기는 FSM을 이용해 문자 흐름을 토큰으로 바꾸고, 구문 분석기는 토큰열에서 구문 트리를 만든다. 순환 하강 구문 분석기는 비단말기호마다 프로시저를 만들고 단말기호는 일치 검사, 비단말기호는 프로시저 호출로 문법 우변을 모사한다.

언어 구현의 전체 흐름은 “언어 정의 → 문자에서 토큰으로 어휘 분석 → 토큰에서 구문 트리로 구문 분석 → 의미 처리와 중간 표현 생성 → 목적 코드 생성 또는 중간 표현 실행”으로 연결된다. 각 단계가 무엇을 입력받고 무엇을 만들어 내는지, 컴파일러와 인터프리터가 분석 이후 어디에서 갈라지는지를 중심으로 정리하면 전체 구조를 쉽게 파악할 수 있다.

예상문제 20선

1. 프로그래밍 언어의 구문 규칙이 정하는 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
구문 규칙은 허용되는 기호와 문장 배열, 즉 프로그램의 올바른 형태를 규정한다. 실행했을 때의 동작은 의미 규칙이 정한다.

2. 의미 규칙에 대한 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
의미 규칙은 구문적으로 올바른 프로그램의 각 문장이 어떤 동작과 결과를 가져야 하는지 설명한다.

3. 로봇 제어 언어에서 left의 의미로 정의된 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
left는 로봇의 위치를 옮기지 않고 방향을 왼쪽으로 90도 바꾸는 명령으로 정의된다.

4. 언어 L의 구현이 가장 먼저 해야 할 일은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
언어 구현은 먼저 프로그램의 형태가 구문 규칙에 맞는지 확인하고, 올바른 경우에만 의미 규칙에 따라 실행한다.

5. 컴파일러의 함수 모형을 바르게 설명한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
컴파일러는 PLPM으로 번역한다. 생성된 목적 프로그램은 이후 CPU가 입력과 함께 실행한다.

6. 절차형 언어를 전통적인 구현 관점에서 설명한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
절차형 언어는 명령형 기능을 바탕으로 사용자가 연산을 함수로, 명령 묶음을 프로시저로 정의할 수 있게 확장한다.

7. 함수형·논리 언어 구현에서 추상기계를 두는 주된 이유는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
새 패러다임의 계산 모델은 기계어 명령과 직접 대응하기 어려우므로 추상기계를 중간에 두어 구현의 징검다리로 사용한다.

8. 함수형 언어의 계산 모델과 논리 언어의 대표 추상기계를 바르게 짝지은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
함수형 언어는 람다 계산법을 계산 모델로 삼고, 논리 언어는 연역 논리를 모델로 하며 WAM 등이 추상기계로 사용된다.

9. 컴파일러 분석 단계인 전단부의 특징은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
전단부는 원시 언어의 어휘와 문법, 의미를 알아야 하므로 언어 종속적이며, 분석 결과로 중간 표현을 만든다.

10. 컴파일러 후단부의 역할로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
후단부는 목적 기계의 명령어와 구조에 맞춰 중간 표현을 목적 코드로 바꾸므로 목적 기계에 종속적이다.

11. 인터프리터 구현에 대한 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
인터프리터도 구조를 파악하는 분석 단계가 필요하다. 이후 목적 코드를 생성하지 않고 인터프리터 엔진이 중간 표현을 문장 단위로 수행한다.

12. 파스 트리와 AST의 차이를 바르게 설명한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
파스 트리는 문법 유도에 나타나는 세부 기호를 보존하고, AST는 후속 번역과 실행에 필요한 연산 구조를 간결하게 남긴다.

13. 컴파일러의 심볼 테이블에 주로 저장되는 정보는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
심볼 테이블은 프로그램에 정의되거나 선언된 식별자의 타입, 선언 위치 등의 정적 정보를 저장해 분석과 코드 생성에 활용한다.

14. 인터프리터의 환경이 심볼 테이블보다 확장된 점은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
인터프리터는 프로그램을 수행하면서 변수 값을 읽고 바꿔야 하므로 환경에 식별자의 현재 값도 저장한다.

15. 실행 환경의 구성에 대한 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
코드와 정적 데이터는 정적 세그먼트에 배치되고, 호출과 동적 데이터에 쓰이는 스택과 힙은 동적 세그먼트를 이룬다.

16. 어휘 분석기의 역할로 옳지 않은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
목적 명령어 생성은 컴파일러 후단부의 역할이다. 어휘 분석기는 문자들을 토큰과 속성으로 구분한다.

17. 강의의 FSM에서 x=2e+342e+34는 어떤 토큰으로 인식되는가?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
숫자 뒤의 e, 부호와 이어지는 숫자를 함께 읽어 지수 표기 실수 리터럴 LIT_DBL로 인식한다.

18. 순환 하강 구문 분석기를 만드는 기본 원칙은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
비단말기호마다 프로시저를 만들고, 우변의 단말기호는 일치 검사하며 비단말기호는 해당 프로시저를 호출한다.

19. 문법 <S> ::= '(' <S> ')' <S> | ε에 대한 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
괄호 안의 첫 S가 중첩 구조를 만들고 닫는 괄호 뒤의 S가 이어지는 괄호 쌍을 만든다. ε는 빈 문자열을 허용한다.

20. 괄호 분석기 예제의 match(token) 함수가 수행하는 일은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
match는 단말기호 일치 여부를 검사한다. 일치하면 nexttoken()으로 진행하고, 불일치하면 구문 오류를 발생시킨다.

댓글