컴파일러 컴파일러
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
컴파일러 컴파일러는 컴파일러를 생성하는 데 사용되는 도구이다. 1959년 토니 브루커와 데릭 모리스가 설계한 최초의 컴파일러 컴파일러 중 하나인 브루커 모리스 컴파일러 컴파일러(BMCC)를 시작으로, META II, yacc, ANTLR, Bison 등 다양한 종류가 개발되었다. 파싱 알고리즘에 따라 LL, LR, 파서 콤비네이터, Packrat 파서 생성기 등으로 나뉘며, 메타컴파일러는 컴파일러의 모든 측면을 설명하는 메타프로그래밍 언어를 입력으로 받아 컴파일러를 생성한다. CWIC, META II, TREE-META 등이 대표적인 메타컴파일러이다.
더 읽어볼만한 페이지
- 컴파일러 이론 - 크로스 컴파일러
크로스 컴파일러는 소프트웨어 빌드 환경과 대상 환경을 분리하여 다른 환경을 위한 실행 코드를 생성하는 컴파일러로, 임베디드 시스템, 다중 운영 체제 지원, 서버 팜 활용 등에 사용되며 GCC, Manx Aztec C, Microsoft C, Free Pascal, Clang 등이 있다. - 컴파일러 이론 - 템플릿 메타프로그래밍
템플릿 메타프로그래밍은 템플릿을 활용하여 컴파일 시간에 계산을 수행하는 프로그래밍 기법으로, 코드 중복을 줄이고 런타임 성능을 향상하며 정적 다형성을 구현하는 데 사용된다. - 메타프로그래밍 - 템플릿 (C++)
C++ 템플릿은 다양한 자료형에 대해 동일한 코드를 재사용하는 기능으로, 함수, 클래스, 변수 템플릿을 지원하며 C++11부터는 가변 템플릿을 통해 인수의 개수를 유연하게 처리할 수 있지만, 과도한 사용은 코드 이해를 어렵게 하고 컴파일 시간을 증가시키는 등의 단점이 있다. - 메타프로그래밍 - 위생 매크로
위생 매크로는 변수 섀도잉 문제를 해결하여 매크로 확장의 안전성을 보장하며, Scheme과 같은 언어에서 식별자의 어휘적 범위를 보존하고 우발적인 포착을 방지한다. - 구문 분석 - 패턴 매칭
패턴 매칭은 데이터 구조나 문자열에서 특정 패턴을 찾아 식별하는 기법으로, 다양한 프로그래밍 언어와 시스템에서 사용되며 데이터 필터링, 추출 및 선언적 프로그래밍에 중요한 역할을 수행한다. - 구문 분석 - 낱말 분석
낱말 분석은 자연어 처리와 컴파일 과정에서 문자열을 토큰으로 분해하는 과정으로, 렉서의 첫 단계로서 소스 코드에서 변수, 연산자 등을 식별하고 공백이나 주석을 제거하여 구문 분석기에 입력 가능한 형태로 정보를 구성한다.
컴파일러 컴파일러 | |
---|---|
기본 정보 | |
종류 | 컴파일러 생성 도구 |
용도 | 컴파일러 자동 생성 |
다른 이름 | 컴파일러 컴파일러, parser generator 파서 생성기 |
상세 정보 | |
입력 | 소스 코드 (일반적으로 텍스트 파일) |
출력 | 컴파일러 또는 파서 (소스 코드 형태) |
사용 분야 | 프로그래밍 언어 개발, 컴파일러 개발, 파서 개발 |
예시 | Yacc, GNU Bison, ANTLR, JavaCC |
동작 원리 | |
입력 형식 | 일반적으로 문맥 자유 문법 (Context-Free Grammar, CFG) 형태의 명세 |
변환 과정 | 입력된 문법 규칙을 기반으로 파싱 테이블 생성 생성된 파싱 테이블을 이용하여 파서 생성 |
생성 방식 | LALR 파서 생성기 LL 파서 생성기 재귀 하강 파서 생성기 |
장점 | |
생산성 향상 | 컴파일러/파서 개발 시간 단축 |
유지보수 용이성 | 문법 변경 시 컴파일러/파서 코드 수정 용이 |
신뢰성 향상 | 자동 생성된 코드는 수동 코드에 비해 오류 가능성 감소 |
단점 | |
성능 저하 가능성 | 자동 생성된 코드는 최적화되지 않아 성능이 떨어질 수 있음 |
디버깅 어려움 | 생성된 코드의 내부 동작 이해가 어려워 디버깅이 어려울 수 있음 |
학습 곡선 | 특정 컴파일러 컴파일러 사용법 학습 필요 |
활용 예시 | |
프로그래밍 언어 개발 | 새로운 프로그래밍 언어의 컴파일러/인터프리터 개발 |
데이터 포맷 처리 | JSON, XML 등 다양한 데이터 포맷 파싱 |
텍스트 기반 시스템 | SQL 쿼리 처리기, 설정 파일 처리기 등 |
2. 역사
파서 생성기의 역사는 컴파일러 개발 역사와 밀접하게 연관되어 있다. 프로그래밍 언어의 컴파일러를 개발하려면 많은 기술과 노력이 필요하다. 이를 돕기 위해, 언어의 구문 등 정의로부터 컴파일러를 생성하는 컴파일러 생성기(컴파일러 컴파일러)가 연구되었다. 그 과정에서 입력을 처리하는 구문 분석기를 자동 생성하는 프로그램이 개발되어 널리 실용화되었는데, 이것이 바로 파서 생성기이다.
전통적으로 1970년대부터 개발된 yacc가 유명하다. yacc는 "Yet Another Compiler Compiler"의 약자이지만, 실제로는 파서 생성기이다. GNU 프로젝트의 bison은 yacc의 상위 호환이다.
2. 1. 초기 역사 (1960년대 ~ 1970년대)
1959년 토니 브루커(Tony Brooker)와 데릭 모리스는 최초의 컴파일러 컴파일러 설계를 시작했으며, 초기 테스트는 1962년 3월에 시작되었다.[4] 맨체스터 대학교의 아틀라스 컴퓨터를 위해 개발된 브루커 모리스 컴파일러 컴파일러(BMCC)는 머큐리 오토코드(Mercury Autocode), 확장 머큐리 오토코드, 아틀라스 오토코드(Atlas Autocode), ALGOL 60, ASA 포트란 등 여러 언어의 컴파일러를 만드는 데 사용되었다.거의 같은 시기에 E. T. 아이언스와 알릭 글레니는 "구문 기계" 논문을 통해 메타컴파일러 연구에 기여했다. 이 논문은 META 시리즈 번역기 작성 시스템에 영감을 주었다.
1963년 발 쇼르는 최초의 메타컴파일러인 Meta I을 구현했으며, 이후 개선된 버전인 META II를 발표했다. META II는 스택 머신 코드를 생성하는 출력 기능을 갖춘 분석 문법을 허용하고 자체 소스 코드 및 기타 언어를 컴파일할 수 있는 초기 컴파일러 컴파일러 중 하나였다.
1970년대에는 벨 연구소에서 lex와 yacc 시스템이 개발되었다. 이들은 유닉스 시스템과 함께 널리 사용되었으며, C 프로그래밍 언어 코드뿐만 아니라 다양한 용도로 활용될 수 있는 유연한 출력 시스템을 갖추고 있었다. GNU 프로젝트의 flex와 bison은 이들의 현대적인 버전이다.
2. 2. 발전 (1980년대 ~ 2000년대)
벨 연구소에서 구축된 최초의 유닉스 버전의 초기 프로그램 중에는 lex 및 yacc 시스템이 있었는데, 이들은 일반적으로 C 프로그래밍 언어 코드를 출력하는 데 사용되었지만 프로그래밍 언어에서 텍스트 파일 변환에 이르기까지 모든 것에 사용할 수 있는 유연한 출력 시스템을 갖추고 있었다.[3] 이들의 현대적인 GNU 버전은 flex와 bison이다.일부 실험적인 컴파일러 컴파일러는 지시적 의미론을 사용하여 프로그래밍 언어 의미론에 대한 형식적인 설명을 입력으로 사용하는데, 이러한 접근 방식은 '의미론 기반 컴파일'이라고도 불리며 1978년 Peter Mosses의 Semantic Implementation System(SIS)에 의해 개척되었다.[3] 그러나 생성된 컴파일러와 컴파일러가 생성한 코드는 시간과 공간 면에서 비효율적이었다. 현재 이러한 방식으로 구축된 프로덕션 컴파일러는 없지만, 관련 연구는 계속되고 있다.
카네기 멜론 대학교의 Production Quality Compiler-Compiler (PQCC) 프로젝트는 의미론을 공식화하지는 않았지만, 기계 설명을 위한 반 공식적인 프레임워크를 갖추고 있었다.
컴파일러 컴파일러는 코드 생성을 위한 재작성 문법에 따라 구문 트리를 타일링하는 데 사용되는 하향식 재작성 기계 생성기( [http://jburg.sourceforge.net/ JBurg] 참조) 및 속성 문법 파서 생성기(예: ANTLR)를 포함하여 다양한 형태로 존재한다. ANTLR은 파싱 단계에서 동시 유형 검사, 상수 전파 등에 사용될 수 있다.
프로그래밍 언어의 컴파일러를 개발하는 데에는 많은 기술과 노력이 필요하다. 이를 지원하기 위해, 언어의 구문 등 정의로부터 컴파일러를 생성하는 컴파일러 생성기 (컴파일러 컴파일러라고도 함)가 연구되었다. 그 과정에서 입력을 처리하는 구문 분석기를 자동 생성하는 프로그램이 개발되어 널리 실용화되었는데, 이것이 바로 파서 생성기이다.
파서는 입력을 인수로 받아 분석 결과를 반환하는 함수로 간주될 수 있다. 프로그래밍 언어에서 함수를 조합하는 능력(고차 함수)이 있다면, 연산자 (콤비네이터)를 통해 파서를 조립할 수 있다. Parsec과 같은 파서 콤비네이터 라이브러리가 구현 및 공개되어 사용되고 있다.
2. 3. 최근 동향 (2000년대 이후)
최근에는 파서 콤비네이터, Packrat 구문 분석 등 새로운 파싱 기법이 등장하고 있다. 파서 콤비네이터는 함수형 프로그래밍 언어에서 파서를 함수로 조합하는 방식을 제공한다. Packrat 파서는 파싱 표현 문법(PEG)을 기반으로 한 파싱 기법으로, 모호성이 없는 문법 분석에 강점을 가진다.[3]3. 종류
파서 생성기는 파싱 알고리즘에 따라 다양한 종류로 나뉜다.
1964년 최초의 컴파일러 컴파일러 중 하나인 META II는 스택 머신 코드를 생성하고 자체 소스 코드 및 기타 언어를 컴파일할 수 있었다.
벨 연구소의 초기 유닉스 버전에는 C 프로그래밍 언어 코드를 출력하는 lex 및 yacc 시스템이 있었다. 이들의 현대 GNU 버전은 flex와 bison이다.
컴파일러 컴파일러는 코드 생성을 위한 문법에 따라 구문 트리를 타일링하는 데 사용되는 하향식 재작성 기계 생성기([http://jburg.sourceforge.net/ JBurg] 참조) 및 속성 문법 파서 생성기(예: ANTLR)를 포함하여 다양한 형태로 존재한다.[3]
META I과 META II는 UCLA의 D. 발 쇼르에 의해 개발되었다. 이후 Schorre 기반 메타컴파일러들이 등장했으며, 각 메타컴파일러는 언어 분석 및/또는 코드 생성에 대한 개선 사항을 추가했다.
프로그래밍에서 프로그래밍 언어 이름을 컴파일러와 프로그래밍 언어 모두를 지칭하는 데 사용하는 것이 일반적이며, 문맥에 따라 그 의미가 구별된다. 예를 들어, META II는 컴파일러이자 언어이다.
Schorre 계열 메타컴파일러의 메타언어는 내장된 출력 변환 구문을 가진 하향식 문법 분석 구문을 사용하는 함수형 프로그래밍 언어이다. 구문 방정식은 다음과 같다.
```
```
여기서 `
프로그래밍 언어를 분석적으로 하향식으로 정의하는 것은 자연스럽다. 예를 들어, 프로그램은 다음과 같이 정의할 수 있다.
```
program = $declaration;
```
이는 프로그램을 0개 이상의 선언 시퀀스로 정의한다.
초기 컴파일러의 문자 집합은 제한적이었다. 문자 '/'는 대체(또는) 연산자에 사용되었고, "A 또는 B"는 A / B로 작성되었다. 괄호 ( )는 그룹화에 사용되었다.
```
A (B / C)
```
위는 A 다음에 B 또는 C가 오는 구문을 설명한다.
Generators Language는 Lisp과 유사한 의미 체계를 가지고 있었다. 구문 분석 트리는 재귀적인 리스트로 간주되었다. Generator Language 함수의 일반적인 형태는 다음과 같다.
```
함수이름(첫번째_구문분석_규칙) => 첫번째_생성_코드_생성기
(두번째_구문분석_규칙) => 두번째_생산_코드_생성기
(세번째_구문분석_규칙) => 세번째_생산_코드_생성기
...
```
생성기 호출은 구문분석_규칙에서 사용될 수 있다. 예를 들면 다음과 같다.
```
expr_gen(ADD[expr_gen(x),expr_gen(y)]) =>
<AR + (x*16)+y;>
releasereg(y);
return x;
(SUB[expr_gen(x),expr_gen(y)])=>
<SR + (x*16)+y;>
releasereg(y);
return x;
(MUL[expr_gen(x),expr_gen(y)])=>
.
.
.
(x)=> r1 = getreg();
load(r1, x);
return r1;
...
```
즉, 구문 분석 트리가 (ADD[
프로그래밍 언어의 컴파일러를 개발하는 데에는 기술과 노력이 필요하다. 이를 지원하기 위해, 언어의 구문 등 정의로부터 컴파일러를 생성하는 컴파일러 생성기(컴파일러 컴파일러)가 연구되었다. 그 과정에서 입력을 처리하는 구문 분석기를 자동 생성하는 프로그램(파서 생성기)이 개발되어 널리 실용화되었다.
3. 1. LL 파서 생성기
LL 파서는 하향식 파싱의 일종이다. LL 파서 생성기는 좌측 재귀를 처리하지 못하는 단점이 있다.[3]
대표적인 LL 파서 생성기는 다음과 같다.
파서 생성기 | 설명 |
---|---|
ANTLR | PCCTS가 전신이다. |
JavaCC | |
Coco/R |
3. 2. LR 파서 생성기
LR 파싱은 상향식 파싱의 일종으로, LL 파싱보다 더 강력한 문법을 처리할 수 있다.대표적인 LR 파서 생성기는 다음과 같다:
- yacc
- GNU Bison
- SableCC
1970년대부터 개발된 yacc는 "Yet Another Compiler Compiler"의 약자이지만, 실제로는 파서 생성기이다. yacc의 상위 호환으로 GNU 프로젝트의 bison이 있다.
3. 3. 파서 콤비네이터
PEG 파서는 입력을 받아 분석 결과를 반환하는 함수로 볼 수 있다. 프로그래밍 언어에서 함수를 조합하는 기능(고차 함수)을 활용하면, 연산자(콤비네이터)를 통해 파서를 조립할 수 있다. 이러한 방식을 파서 콤비네이터라고 하며, 다음과 같은 파서 콤비네이터 라이브러리가 구현 및 공개되어 사용되고 있다.- Parsec - Haskell용 파서 컴비네이터 라이브러리
- Scala Standard Parser Combinator Library
3. 4. Packrat 파서 생성기
파싱 표현 문법(PEG)은 문맥 자유 문법 대신 사용할 수 있는 모호성이 없는 문법 분석 기법이다. Packrat 파서는 PEG를 기반으로 파싱을 수행하며, 이를 위한 파서 생성기가 구현되어 공개되고 있다.대표적인 Packrat 파서 생성기는 다음과 같다.
- PackCC - C용 (좌재귀 지원)
- XPEG - C++용
4. 메타컴파일러
메타컴파일러는 컴파일러의 모든 측면을 설명하는 특수 메타프로그래밍 언어를 입력으로 받아 컴파일러를 생성하는 도구이다. 이는 컴파일러 작성을 위한 도메인 특화 언어의 주요 예시이며, 특정 문제의 사양에 적합한 도메인 특화 대상 언어에 대한 번역기 제작 비용을 줄여준다.
메타컴파일러의 메타언어는 일반적으로 강력한 문자열 및 기호 처리 언어이므로, 광범위한 기타 소프트웨어 엔지니어링 및 분석 도구 생성을 포함하여 범용 애플리케이션에 강력하게 적용될 수 있다.
메타컴파일러는 ''일반적으로 자체 메타언어로 작성된'' 메타프로그램이거나 기존 컴퓨터 프로그래밍 언어로 작성된 메타프로그램이다. 자체 메타언어로 작성된 메타컴파일러가 자체를 컴파일하는 과정은 셀프 호스팅 컴파일러와 동일하다.
대표적인 메타컴파일러로는 META II, TREE-META, CWIC 등이 있다.
초기 Schorre 메타컴파일러인 META I과 META II는 UCLA의 D. 발 쇼르에 의해 개발되었다. 이후 다른 Schorre 기반 메타컴파일러들이 등장했으며, 각 메타컴파일러는 언어 분석 또는 코드 생성에 대한 개선 사항을 추가했다.
Schorre 계열 메타컴파일러의 메타언어는 내장된 출력 변환 구문을 가진 하향식 문법 분석 구문을 사용하는 함수형 프로그래밍 언어이다. 구문 방정식은 다음과 같다.
`
이는 '성공' 또는 '실패'를 반환하는 컴파일된 ''테스트'' 함수이다. `
4. 1. META II
META II는 최초의 메타컴파일러 중 하나로, 구문 방정식과 출력 생성을 결합한 독특한 방식을 사용했다. 각 규칙은 선택적으로 검사, 연산자, 출력 생성으로 구성된다. 규칙은 입력 프로그램 소스 문자 스트림의 일부를 일치시키려고 시도하며 성공 또는 실패를 반환한다. 성공하면 입력이 일치하는 문자를 넘어 진행되고, 실패하면 입력이 진행되지 않는다.
출력 생성은 구문 규칙에서 직접 어셈블리 코드 형식을 생성했다.
4. 2. TREE-META
TREE-META는 트리 구성 연산자를 도입하여 추상 구문 트리 생성을 지원했다. 트리 구성 연산자는 입력을 추상 구문 트리로 직접 변환하는 문법 규칙에 사용되었다. 구문 분석되지 않은 규칙은 트리 패턴과 일치하는 테스트 함수이기도 하다. 추상 구문 트리를 출력 코드로 변환해야 하는 경우, 구문 분석되지 않은 규칙이 문법 규칙에서 호출된다. 추상 구문 트리 구축 및 구문 분석되지 않은 규칙을 통해 구문 분석 트리를 분석하여 로컬 최적화를 수행할 수 있었다.[3]
출력 생성을 구문 분석되지 않은 규칙으로 이동함으로써 문법 분석과 코드 생성 간에 명확한 분리가 이루어졌으며, 이는 프로그래밍을 더 쉽게 읽고 이해할 수 있도록 했다.[3]
4. 3. CWIC
CWIC는 1968년부터 1970년까지 시스템 개발 공사(System Development Corporation)에서 어윈 북(Erwin Book), 듀이 발 쇼르(Dewey Val Schorre), 스티븐 J. 셔먼(Steven J. Sherman)이 개발한 컴파일러 개발 시스템이다. CWIC는 구문, 생성기, MOL-360의 세 가지 도메인 특화 언어로 구성되어 있으며, 각 언어는 번역의 특정 측면을 간단하게 설명하도록 설계되었다.
언어 | 설명 |
---|---|
구문(Syntax) | 문법 변환 공식을 사용하여 소스 프로그램 입력을 목록 구조로 변환한다. 파싱된 표현식 구조는 규칙에 생성기 호출을 배치하여 생성기로 전달된다. 트리는 첫 번째 요소가 노드 객체인 목록으로 표현된다. |
생성기(Generator) | 언파스, 패턴 매칭, 규칙, 그리고 LISP 2와 유사한 언어로 작성된 출력 프로덕션으로 구성된 이름이 지정된 일련의 변환 규칙이다. 번역은 IBM 360 바이너리 머신 코드로 이루어졌다. 생성기 언어의 다른 기능은 출력을 일반화했다. |
MOL-360 | 1968년에 개발된 IBM System/360 컴퓨터 제품군을 위한 독립적인 중급 구현 언어로, 기본 지원 라이브러리를 작성하는 데 사용되었다. |
CWIC 저자들은 메타컴파일러가 컴파일러 구축의 비창의적인 측면을 자동화하여 컴파일러 구축 작업을 돕는다고 설명한다. 이를 통해 특정 문제 사양에 적합한 언어를 설계할 수 있으며, 이러한 언어에 대한 처리기 생산 비용을 줄여 문제 해결을 언어 설계로 시작하는 것이 경제적으로 가능하게 된다.
5. 결론
프로그래밍 언어의 컴파일러 개발에는 많은 기술과 노력이 필요하다. 이러한 과정을 돕기 위해, 언어의 구문 정의로부터 컴파일러를 자동으로 생성하는 컴파일러 생성기(컴파일러 컴파일러라고도 함)가 연구되었다. 이 과정에서 입력값을 처리하는 구문 분석기를 자동으로 생성하는 프로그램, 즉 파서 생성기가 개발되어 널리 사용되고 있다.[1]
참조
[1]
서적
Compilers : principles, techniques, & tools
https://www.worldcat[...]
2007
[2]
논문
A Syntax Directed Compiler for ALGOL 60
1961-01
[3]
간행물
SIS: A Compiler-Generator System Using Denotational Semantics
Dept. of Computer Science, University of Aarhus, Denmark
1978-06
[4]
웹사이트
Tony Brooker and the Atlas Compiler Compiler
http://curation.cs.m[...]
2016-04
[5]
학회자료
The genesis of attribute grammars
https://www.dcs.warw[...]
Springer-Verlag
[6]
학술지
Eli: A complete, flexible compiler construction system
[7]
학술지
A syntax improving program
[8]
웹사이트
ANTLR
http://www.antlr.org[...]
[9]
웹사이트
JavaCC
https://javacc.dev.j[...]
[10]
웹사이트
Coco/R
http://www.ssw.uni-l[...]
[11]
웹사이트
SableCC
http://sablecc.org/
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com