460 likes | 958 Views
COMPILER. 김 영 균 ygkim@cespc1.kumoh.ac.kr. Contents. 1. 컴파일러 개론 2. 형식언어 3. 정규언어 4. 어휘분석 5. Context-free 문법 6. 구문분석 7. LL 구문분석 8. LR 구문분석. 1. 컴파일러 개론. 프로그래밍 언어 개념 컴파일러의 구조 컴파일러 자동화 도구. 1. 컴파일러 개론. 언어 번역기 (Language Translator) - 고급언어로 작성된 프로그램이 컴퓨터에서 실행 될 수
E N D
COMPILER 김 영 균 ygkim@cespc1.kumoh.ac.kr
Contents 1. 컴파일러 개론 2. 형식언어 3. 정규언어 4. 어휘분석 5. Context-free 문법 6. 구문분석 7. LL구문분석 8. LR구문분석
1. 컴파일러 개론 프로그래밍 언어 개념 컴파일러의 구조 컴파일러 자동화 도구
1. 컴파일러 개론 언어 번역기(Language Translator) - 고급언어로 작성된 프로그램이 컴퓨터에서 실행 될 수 있는 형태로 번역 해 주는 프로그램 컴파일러(Compiler) - 언어 번역기의 일종 - 고급 언어 프로그램을 입력으로 - 의미적으로 동등한 - 직접 기계(컴퓨터)에서 실행될 수 있는 형태로 - 번역하는 일을 수행 효과적 구현 - 기능적으로 독립적인 각 단계로 분할 - 모듈(Module) 단위로 작성
1. 1 프로그래밍 언어 언어(Language) - 의사 전달의 수단 - 자연언어(Natural Language)와 인공언어(Artificial Language)로 구분 자연언어(Natural Language) - 자연발생적, 문법이 복잡 - 한국어,영어,일어,불어,독일어... - 어휘가 방대 - 의미적 중의성 허용, 학습에 많은 시간이 소요됨. - 번역가가 번역, 통역관이 통역
1. 1 프로그래밍 언어 인공언어(Artificial Language) - 에스페란토어 1887년 폴란드의 안과의사인 자멘호프 박사가 창안, 공포한 국제어 현재 전 세계 120개국에서 3,000여만명이 사용 중립 공통어(국제어) 체계적이고, 비교적 문법이 단순 - 컴퓨터 언어(Computer Language) : 인간과 컴퓨터 사이를 연결 . 프로그래밍 언어(Programming Language) 문법이 명확, 어휘의 수가 적음, 비교적 단기간에 학습 가능, 의미가 명확 컴퓨터에 작업을 지시하기 위해 사용
1. 1 프로그래밍 언어 프로그래밍 언어(Programming Language) - 사용목적에 따라 구분 . 특수목적 언어(Special purpose programming language) 컴퓨터의 특정한 응용에 적합하도록 고안된 언어 모의실험(simulation)용 언어 : CSMP, GPSS DBMS에서 제공하는 질의어(Query language) : SQL . 일반 목적 언어(General purpose programming language) 대부분의 프로그래밍 언어 C, C++, JAVA, BASIC, FORTRAN, COBOL, PASCAL, ADA PROLOG, LISP … - 형태와 기능에 따라 구분 . 저급언어(Low-level language) : 기계어, 어셈블리어 . 고급언어(High-level language) : C, PASCAL, C++, ADA, ...
1. 1 프로그래밍 언어 저급 언어 - 초창기에 사용된 언어 . 상당히 복잡, 배우고 사용하기에 어려움(단점) . 생산성(Productivity)이 떨어짐(배우기 어렵고, 디버깅이 난이함) . 이식성(Portability)이 동일 CPU를 사용하는 경우만 가능 . 기계 종속적(Machine-dependent) . 컴퓨터 구조에 관한 지식을 요구, 프로그래머의 생각을 표현하는데 부자연스러움 - 기계어(Machine Language) . 0과 1의 조합으로 수행의 의미를 표현 컴퓨터 기종마다 다름, 8086/Pentium, 68000, Z-80 - 어셈블리어(Assembly Language) . 기계어의 단점을 약간 보완, 기호(Mnemonic)를 사용 . 10110101의 기계어를 ADD라는 명령 기호로 표기 등. . 기호를 기계어로 번역하는 어셈블러(Assembler)라는 번역기 필요
1. 1 프로그래밍 언어 고급 언어 - 장점 . 생산성(Productivity)이 높음 . 이식성(Portability)이 우수 . 기계 독립적(Machine-independent) 특정 컴퓨터의 구조에 대해 모르고도 프로그래밍 가능 -단점 . 수행 속도가 느림 (기계어나 어셈블리 코드로 된 프로그램보다) . 메모리를 많이 차지 . 수행 가능한 기계어로 번역 해주는 번역기가 필요 . 너무 많은 고급언어가 존재 - 대표적인 언어 1960년대 COBOL, FORTRAN 1970년대 PASCAL, C 1980년대 ADA
1. 1 프로그래밍 언어 고급 언어- COBOL - 1960년대 초, CODASYL 위원회에서 고안, 발표 - COmmon Business Oriented Language의 약자 - 업무용으로 사용된 언어 - 표준화 된, ANSI COBOL 고급 언어- FORTRAN - FORmula TRANslation의 약자 - 1960년대 초에 J. Backus를 중심으로 개발된 언어 - 과학 계산용 언어 - 표준화 된, FORTRAN 77이 널리 사용됨 고급 언어- ALGOL - ALGOrithmic Language - 1960년 ALGOL60, 1968년 ALGOL68, 수치계산용 언어 - 언어의 구조, 의미가 명료, 제어 구문 구조 우수, 후속 언어에 많은 영향을 줌
1. 1 프로그래밍 언어 고급 언어- Pascal - 1970년대 초, N. Wirth가 고안 - ALGOL 기반의 언어 - 여러가지 자료형 제공, 자료 구조, 알고리즘 표현에 많이 사용 고급 언어- C - B언어를 기반으로 1974년경에 D. M. Ritchie가 개발 - 시스템 프로그래밍 언어을 위한 효율적인 언어 운영체제 개발(UNIX), 컴파일러 설계, ... - 1988년 ANSI C가 제정, 널리 사용됨 - 후속 언어인 객체 지향의 C++가 개발됨
1. 1 프로그래밍 언어 고급 언어- Ada - 1980년대, 미국방성(DOD)에서 발표한 언어 - 실시간 응용(real-time applications)에 적합하도록 설계된 언어 - 최초의 프로그래머인 August Ada(시인 바이런의 딸)의 이름을 따서, Ada로 명명한 것으로 유명 - 신뢰성(reliability), 단순성(simplicity), 모듈화(modularity), 효율성(efficiency)등의 특징을 가짐 - package - generic features - 분리 컴파일(separated compile) - 다중 처리(multi-tasking) 고급 언어- C++ - 1983년경에 B. Stroustrup이 개발한 언어 - C언어에 클래스(Class) 개념을 추가, OOP개념을 지원 - Class, Inheritance, Polymorphism 특징을 가짐 - 현재 많은 소프트웨어들이 C++로 개발되어 지고 있음
1. 1 프로그래밍 언어 좋은 프로그래밍 언어의 요건 (1) 언어의 개념이 명료, 문법적인 구조(syntax)와 그에 따른 의미(semantic)가 일관성이 있고 단순해야 함 (2) 프로그래머의 생각을 자연스럽게 표현 고급언어, 자료구조 (3) 프로그램의 호환성, 신뢰성, 모듈화, 효율성 등이 우수 고급언어, (4) 언어의 확장성이 우수 (5) 좋은 프로그래밍 환경 예) 통합 개발 환경(IDE, Integrated Development Environment) Visual Programming 환경
1. 2 번역기와 컴파일러 번역기(Translator) 한 프로그래밍 언어로 쓰여진 프로그램을 입력으로 받아 그와 동등한 의미를 갖는 다른 프로그래밍 언어로 된 프로그램을 출력하여 주는 시스템 프로그램 - 입력되는 프로그램: 원시 프로그램(Source program) 원시 프로그램을 기술한 언어 : 원시 언어(source language) -출력되는 프로그램: 목적 프로그램(Object program) 목적 프로그램을 기술한 언어: 목적 언어(Object Language, target language) - 컴파일러 원시 언어 : 고급언어, 목적 언어:어셈블리어, 기계어로 번역하는 번역기
데이터 실행 컴퓨터 원시 프로그램 목적 프로그램 실행 프로그램 컴파일러 로더 라이브러리 결과 1. 2 번역기와 컴파일러 원시 프로그램이 컴파일러를 통해 수행되는 과정 - 실행 가능한 프로그램으로 바뀌면, 필요시 반복 실행 가능 - 로드 모듈(load module) 로더(loader)의 출력인 실행 가능한 프로그램(executable program), 주기억 장치의 사용자 영역에 적재, 운영체제와 실행 환경(run-time environment)의 지원하에 실행, 결과 출력
1. 2 번역기와 컴파일러 크로스 컴파일러(Cross-Compiler) - 원시 프로그램을 컴파일러가 수행되고 있는 기계에 대한 기계어로 번역하는 것이 아니라, 다른 기종에 대한 기계어로 번역하는 컴파일러 B기종에 대한 목적 프로그램 원시프로그램 A기종에서 수행되는 크로스 컴파일러 Ex) VAX 컴퓨터에서 수행되는 C언어 컴파일러가 80386 MPU를 위한 코드를 생성하는 경우 - 수행은 B기종에서 실행하거나, 그 기종에 대한 코드 인터프리터(또는 emulator)가 있어야 함. - 새로운 기종에 필요한 컴파일러를 설치할 때 사용하는 기술
1. 2 번역기와 컴파일러 어셈블러(Assembler) 어셈블리 언어로 쓰여진 프로그램을 입력으로 받아 기계어 프로그램 으로 바꾸어 주는 번역기, ex) MASM 인터프리터(Interpreter) 원시 언어를 특수한 형태의 중간언어로 변환, 중간언어를 입력으로 받아 목적언어로 변환하지 않고 직접 실행, 결과를 출력해 주는 프로그램, ex) BASIC - 대개, 대화식(Interactive)으로 수행 - 소프트웨어 개발 및 Debugging 이 용이 - 컴파일러 방식 보다 수행 속도가 느림 - 개발시스템, 교육용 시스템에서는 인터프리터가 더 능률적 혼합한 방식 등장 Visual Basic 6.0의 경우 개발 시에 인터프리터 방식으로 작동 최종 개발 종료 시에 컴파일 하여 실행 가능한 .EXE화일 형태로 생성해서 사용
1. 2 번역기와 컴파일러 프리프로세서(전처리기, Preprocessor) 프로그래밍 언어에 유용한 기능들을 추가, 언어를 확장 시켜 주는 역할 이경우, 프로그래밍 언어를 프리프로세서의 기본 언어(Base Language)라 하고, 프리프로세서의 지시문(directive)이 모두 처리되어 확장된 프로그램은 기본 언어에 대한 언어 번역기를 불러서 번역. Ex) C언어의 #define, #include문들 MASM의 매크로 확장 기능들 확장된 원시 프로그램 목적 프로그램 원시프로그램 프리프로세서 번역기 전처리기의 실행 과정
1. 2 번역기와 컴파일러 프리프로세서의 기능 1) 매크로 치환(Macro substitution) 유사한 원시 코드를 매크로로 정의, 필요할 때마다 확장하여 프로그래머의 생산성을 증가 Ex) C언어의 #define문 2) 라이브러리 포함(Library Inclusion) 컴파일 시간에 필요한 컴파일 시간 라이브러리(compile-time library) 들을 포함하는 것. 포함된 라이브러리들은 원시프로그램과 함께 하나의 프로그램으로 컴파일 됨. Ex) C언어의 #include문 3) 조건부 컴파일(Conditional compile) 조건에 따라, 원시 프로그램의 일부분을 선택적으로 삽입, 삭제할 수 있는 기능을 의미 서로 조금씩 다른 기능을 갖는 프로그램들을 하나의 파일에 프로그래밍 가능. Ex) C언어의 #if~#endif문
어셈블리어 또는 기계어 프로그램 컴파일러 원시 프로그램 어셈블러 어셈블리 프로그램 기계어 프로그램 인터프리터 수행결과 원시 프로그램 프리프로세서 지시문이 있는 프로그램 프리프로세서 지시문이 수행된 프로그램 프리프로세서 1. 2 번역기와 컴파일러 번역기 요약
1. 3 컴파일러의 일반적 구조 컴파일러 A Compiler is a computer program which translates other programs written in a particular high-level programming language into executable code for a specific target computer. 컴파일러의 개략적 구조 원시프로그램 전단부(Front-end) 중간코드 후단부(Back-end) 목적프로그램 전단부: 각 언어당 하나씩 필요, 문법 이론(Grammar theory)에 의해 잘 정립되어 있음 후단부: 경험적인 방법을 통해 구현, 계속적인 연구가 진행
1. 3 컴파일러의 일반적 구조 컴파일러의 일반적 구조 원시프로그램 목적프로그램 전단부 후단부 중간 코드 중간 코드 생성 목적 코드 생성 어휘 분석 토큰 구문 분석 코드 최적화 테이블 관리
1. 3 컴파일러의 일반적 구조 어휘분석기 - 원시 프로그램을 읽어 들여 일련의 토큰(token)을 생성 하는 일 수행 원시프로그램 어휘분석기 일련의 토큰 - 토큰(token) : 문법적으로 의미를 갖는 최소의 단위, 프로그램은 토큰의 열로 구성 - 토큰의 형태 일반형태 : 프로그래머가 프로그래밍할 때 사용하는 명칭과 상수들 특수형태 : 언어를 정의할 때 언어 설계자가 결정하는 지정어(Keyword), 연산자기호, 구분자(delimiter) 등. Ex) A:=B+3; A, :=, B, +, 3, ; 등 여섯개의 토큰으로 위의 문장을 분리
오류 메세지 또는 구문구조 일련의 토큰 구문분석기 1. 3 컴파일러의 일반적 구조 구문 분석기(Syntax analyzer) 구문분석기는 파서(Parser)라고도 함, 어휘분석기(Lexical Analyzer)의 출력인 토큰(token)들을 받아 원시 프로그램에 대한 오류를 검사(error checking), 올바른 문장에 대해서 구문구조(syntactic structure)를 만듬. 구문구조를 트리 형태로 표현 - 파스 트리(Parse tree) - 구문 트리(Syntax tree, Abstract Syntax tree) 대부분의 컴파일러에서 구문 트리 형태 사용 := A + B 3 Ex) A:=B+3의 구문 트리의 예
1. 3 컴파일러의 일반적 구조 중간 코드 생성(Intermediate code generation) - 컴파일 과정의 세번째 단계 - 파서의 출력인 구문 트리를 입력으로 받아 의미 검사(Semantic checking)를 행하고 그에 해당하는 중간 코드를 생성. 중간 코드 생성기 구문트리 중간코드 의미 분석 단계 - 컴파일러에 따라 독립된 의미 분석 단계를 가짐 - 언어의 특성, 목적기계(Target machine), 컴파일러 구현자 (compiler implementor)에 따라 다른 구조를 가짐 - 형 검사(type checking) 각 연산자(operator)가 원시 언어의 정의에 맞는 피연산자(operand)를 가지는가를 검사. Ex) 실수가 배열의 첨자로 사용되었을 때 오류로 간주 실수와 정수의 혼합 연산 시 정수를 실수로 변환하는 형 변환(type conversion)기능 수행.
최적화된 코드 코드 코드 최적화기 1. 3 컴파일러의 일반적 구조 코드 최적화(Code Optimization) - 중간 코드 생성 단계에서 생성된 중간 코드들은 코드 최적화(Code Optimization) 단계의 입력으로 사용 될 수 있다. - 최적화 과정은 선택적인 단계(optional phase)로 생략 가능 - 같은 의미를 유지하면서, 코드를 보다 더 효율적으로 만듬 코드 실행 시 기억 공간이나 실행시간을 절약 - Precode optimization 중간 코드를 이용하여 최적화를 수행, 그 위치는 목적 코드 생성 전에 행하여 짐 Postcode optimization 목적 코드 생성 후에 목적 코드를 최적화하는 방법으로 기계 의존적인 최적화 방법 - 최적화 되는 관점에 따라, 지역최적화와 전역최적화로 구분
1. 3 컴파일러의 일반적 구조 지역최적화(local optimization 또는 peephole optimization) 지역 최적화는 기본 블록(basic block)내에서 행해지며, 부분적인 관점에서 일련의 비효율적인 코드들을 구분해 내고, 좀더 효율적인 코드로 개선하는 방법 지역최적화 방법에 의해 (1) 컴파일 시간 상수 연산(constant folding) (2) 중복된 load, store명령문 제거 (3) 식(expression)의 대수학적 간소화(algebraic simplification) (4) 연산 강도 경감(strength reduction) (5) 불필요한 일련의 블록(null sequence)삭제 등의 효과를 얻음 전역최적화(global optimization) - 흐름 분석 기술(flow analysis technique)을 이용 기본 블록들 사이에 최적화를 행하는 것 - 공통 부분식(Common subexpression)의 축약, - 루프 내에서 값이 변하지 않는 코드(loop invariant code)를 루프 밖으로 이동 (code motion) - 도달 될 수 없는 코드(unreachable code)의 제거 등
중간코드 목적코드 목적 코드 생성기 1. 3 컴파일러의 일반적 구조 목적 코드 생성기 - 중간코드를 입력으로 받아 그와 의미적으로 동등한 목적 기계(Target machine)에 대한 코드를 생성 - 목적코드 생성기가 목적코드를 생성하기 위하여 행하는 일 (1) 목적 코드 선택 및 생성 중간 코드의 의미와 일치하는 기계 명령어들을 효과적으로 선택 (2) 레지스터의 운영 고속의 계산이 가능한 소수의 레지스터들을 효율적으로 사용, 실행 속도 개선 (3) 기억 장소 할당 각 변수에 대한 기억 장소 할당 (4) 기계 의존적인 코드 최적화 연속적인 명령어들을 의미적으로 동등한 하나의 명령어, 처리속도가 빠른 명령어로 대체, 기계어 코드의 성능을 향상 시키는 방법
1. 3 컴파일러의 일반적 구조 심벌 테이블(Symbol table) - 원시 프로그램에 나타난 모든 자료에 대한 정보들을 가지고 있어야 함 Ex) 변수의 타입에 관한 정보 ( 정수형, 실수형, 문자형, …) 배열의 크기에 관한 정보, 함수의 인수(argument)가 몇 개 필요한지, 어휘 분석 단계와 구문 분석 단계에서 위의 정보들이 수집 되어, 심벌 테이블에 저장 - Error Handling routine . 컴파일러가 원시 프로그램의 오류를 발견, 사용자에게 알려 줌 . 어휘 분석 단계 원시 프로그램의 토큰이 철자가 틀리는 경우가 발생, . 구문 분석 단계 괄호가 빠지는 것과 같은 문법 규칙에 대한 오류가 발생
1. 3 컴파일러의 일반적 구조 단일 패스와 다중 패스 컴파일러 - 패스(Pass) 컴파일러가 행하는 크고 복잡한 일을 기능적으로 독립적인(Functionally independent) 여러 단계들로 나누어 쉽게 구현 컴파일러의 하나 이상의 단계들을 모아 패스(Pass)라 하는 하나의 모듈(Module)로 묶을 수 있음. 하나의 패스는 원시프로그램, 또는 그 전 패스의 출력을 읽어 들여 그 패스를 이루고 있는 단계의 기능에 따라, 입력을 변환, 중간 화일에 저장, 중간 파일에 저장된 출력결과가 다음 패스의 입력으로 진행. - 초창기의 컴파일러는 단일 패스 컴파일러(Single Pass Compiler) - 패스의 개수 사용하는 목적 기계(Target machine), 프로그래밍 언어에 따라 결정 - 다중 패스 컴파일러(Multi-Pass Compiler) 단일 패스 컴파일러보다 작은 기억 공간 요구. 작은 기억 공간을 가진 컴퓨터에서, 다중 패스 컴파일러가 유리 단일 패스 컴파일러보다 컴파일 속도가 느림, 대부분의 컴파일러는 다중 패스 컴파일러
언어표현 의미표현 또는 기계표현 컴파일러-컴파일러 컴파일러 원시프로그램 목적코드 1. 4 컴파일러 자동화 도구 컴파일러 생성기(Compiler generator) - 프로그래밍 언어와 컴퓨터 구조가 다양해짐에 따라 많은 컴파일러가 필요 - N개의 언어를 M개의 기계에 구현하려 할 때, N*M개의 컴파일러가 필요 - 컴파일러 제작을 도와 주는 도구들이 필요 하게 되었음 - 컴파일러 생성기(Compiler generator) 또는 컴파일러-컴파일러(Compiler-Compiler) 프로그래밍 언어와 목적 기계에 대한 표현 또는 의미 표현(semantic description)을 이용, 그 언어를 목적 기계의 코드로 번역해 주는 컴파일러를 생성 컴파일러-컴파일러의 기능
1. 4 컴파일러 자동화 도구 컴파일러 생성기(Compiler generator) - 실제로는, 번역기 제작 시스템(Translator writing system)은 어휘분석, 구문분석, 코드생성과 같이 컴파일러의 한 단계(Phase)만을 취급 - 만들어진 컴파일러의 단계(Phase)는 다른 자동화 도구에 의해 생성된 단계와 통합하여 구현될 수 있음
생성기-생성기 메타언어 생성된 테이블/프로그램 입력 출력 구동기 1. 4 컴파일러 자동화 도구 자동화 도구의 기능 - 메타 언어 생성될 단계의 기능을 묘사하는 메타 언어(Meta Language)를 입력으로 받아 각 단계가 사용하게 될 테이블(또는 프로그램)을 출력 필요한 컴파일러 단계를 구현하기 위해, 프로그램을 작성하는 것이 아닌, 그 모듈을 위한 행동을 메타 언어로 기술 해 줌 - 구동기(Driver routine) 는 생성된 테이블을 이용하여 그 단계에서 수행해야 할 일을 처리
1. 4 컴파일러 자동화 도구 어휘 분석기 생성기(Lexical Analyzer Generator) 원시 프로그램 토큰표현 어휘 분석기 생성기 어휘 분석기 토큰 - 어휘 분석기를 자동으로 생성하는 도구 . 토큰에 대한 표현을 입력으로 받아 기술된 형태의 토큰을 찾아내는 어휘 분석기를 만든다 . 생성된 어휘 분석기는 입력 프로그램에서 토큰들을 구분해 내는 일을 한다. . 토큰을 기술하는 방법으로는 일반적으로 정규 표현(regular expression)을 사용
1. 4 컴파일러 자동화 도구 어휘 분석기 생성기(Lexical Analyzer Generator) - 대표적인 어휘분석기 생성기의 예) . UNIX 운영체제에서 수행되는 Lex, 1975년 벨연구소의 Lesk와 Schmidt에 의해 발표된 소프트웨어 도구(software tool) . 토큰의 형태를 묘사한 정규 표현들과 각 정규 표현이 매칭되었을 때 처리를 나타내는 수행 코드로 구성된 입력을 받아 어휘 분석의 일을 처리하는 프로그램을 출력 정규표현+ 수행코드 Lex 원시프로그램 Lex.yy.c . Lex.yy.c가 어휘 분석 일을 담당하도록 생성된 프로그램
파서 생성기 문법 표현 입력 파싱 테이블 파서 1. 4 .2 파서 생성기(Parser Generating Sytem:PGS) - 파서 생성기 . 언어의 문법 표현(grammar description) 으로부터 파서(구문 분석기)를 자동으로 생성하는 도구 . 문법 표현으로는 보통 context-free문법을 사용 . 언어의 문법 표현으로 부터 파서 생성기는 파서를 제어하는 테이블을 생성 . 이 테이블을 이용, 주어진 문장에 대한 문법적인 검사, 모든 언어에 대해 파서 부분은 동일하고, 테이블만 다른다. . 새로운 언어에 대한 파서를 만들기 위해서는 단지 문법 표현만 바꾸면 됨.
정규 표현과 수행코드 문법 규칙과 수행코드 Lex YACC 입력 토큰 출력 Lex.yy.c Y.tab.c <어휘 분석> < 구문 분석> Lex와 YACC의 기능 1. 4 .2 파서 생성기(Parser Generating Sytem:PGS) - 파서 생성기 . 컴파일러를 구현하는데 있어서 꼭 필요한 도구 - YACC(Yet Another Compiler-Compiler) . 1975년, 벨 연구소의 S.C. Johnson을 중심으로 개발된 파서 생성기 . UNIX운영 체제하에서 수행되는 도구, YACC는 파서만 생성, 스캐너는 Lex를 사용, 생성
1. 4 .2 파서 생성기(Parser Generating Sytem:PGS) - 파서 생성기 . y.tab.c가 YACC로부터 생성된 프로그램으로 문법 규칙에 의해 기술된 언어의 문장에 대해 구문 검사(Syntax checking)를 하며, 문법 규칙과 결합된 코드를 필요할 때마다 수행 Lex와 YACC의 수행 코드는 일반적으로 C언어로 작성
1. 4 .3 코드생성의 자동화 - 파서 생성기 . 코드 생성(code generation)은 중간언어(intermediate language:IL)를 목적 기계 언어(Target machine language:TML)로 바꾸는 컴파일러의 과정 . 기계 정형화(machine formalization)를 통하여 자동적으로 구성 . 목적 기계의 명령어들을 나타낸 테이블을 사용하여 기계 독립적인 코드 생성 알고리즘 (code generation algorithm; CGA)을 고안하는 방법 . 코드 생성 과정을 기계 종속적인(machine dependent)부분과 독립적인(independent)부분으로 나누어 정형화하는데 목적을 두고, . template matching또는 테이블을 이용한 방법(table driven method)에 의해 코드를 생성. . 코드 생성 과정을 자동화 기계 독립적인 CGA와 CGA 가 사용하는 테이블을 기계 표현(machine description)으로부터 자동적으로 유도 하는 것을 의미
1. 4 .3 코드생성의 자동화 - 코드 생성에 관한 과거의 연구 . 첫째는 패턴 매칭 코드 생성(pattern matching code generation)이고, 다른 하나는 테이블을 이용한 코드 생성(table driven code generation)이다. - 패턴 매칭 코드 생성(pattern matching code generation) 기계 종속 테이블(machine dependent table)과 코드 생성 알고리즘을 분리해서 코드 생성 과정을 정형화 . 테이블 구성을 위해 적용되는 알고리즘과 기계 표현(machine description)의 일반성 면에서 조금씩 다름 . 패턴 매칭 코드 생성에서는 목적 코드를 생성하기 위해 경험적인 검색 알고리즘(heuristic search algorithm)을 사용. 테이블을 이용한 코드 생성에서는 context-free파싱 이론으로부터 유도된 결정적 알고리즘 (deterministic parsing algorithm)을 사용
언어와 기계에 대한 표현 PQCC PQC 파서 원시 프로그램 1. 4 .4 컴파일러-컴파일러 시스템 - 코드 생성에 관한 . PQCC(Production-Quality Compiler-Compiler)팀과 ACK(Amsterdam Compiler Kit)팀에 의해 시도 . PQCC와 ACK는 컴파일러 개발 과정을 자동화 하기 위한 도구임 . PQCC 카네기 멜론 대학에서 Wulf를 중심으로 개발, 컴파일러-컴파일러 시스템을 구성하려는 연구 언어와 목적 기계에 대해 목적 코드를 생성, 최적화하는 컴파일러의 한 부분을 생성하는 시스템 컴파일러의 전단부가 잘 정립된 반면 후단부는 미비한 상태 번역기 제작 시스템(translator writing system)을 구현하려면 체계적인 후단부가 필요 PQCC시스템
1. 4 .4 컴파일러-컴파일러 시스템 - PQCC 트리 형태의 중간 언어인 TCOL을 사용 언어와 목적 기계에 대한 정형화된 표현을 입력 PQC(Production quality compiler)라고 부르는 기초 코드 생성기와 최적화기가 사용하는 테이블을 만들어 냄 - ACK 컴파일러의 후단부를 자동화하기 위한 도구 이식성과 재목적성이 매우 높은 컴파일러를 만들기 위한 실질적 도구 각 언어에 대한 전단부가 중간 언어인 EM 코드를 생성 EM코드는 가상적인 스택 기계에 근거를 둔 일종의 어셈블리어 중간 언어에 대한 최적화 과정을 거친 후에, 후단부에 의해 목적 프로그램으로 변환
원시 프로그램 프리프로세서 후 단 부 부분 최적화 총괄 최적화 전단부 전단부 기계 독립적인 테이블 목적 기계 최 적 화 범용 어셈블러 링 커 1. 4 .4 컴파일러-컴파일러 시스템 ACK의 구성 각 언어 당 하나씩 존재 - 8개 부분으로 구성 (1) 프리프로세서(preprocessor) (2) 전단부(front-end) (3) 부분 최적화기 (peephole optimizer) (4) 총괄 최적화기 (global optimizer) (5) 후단부(back-end) (6) 목적 기계 최적하기 (target machine optimizer) (7) 범용 어셈블러와 링커 (universal assembler/linker) (8) 응용 패키지(utility package) 각 기계 당 하나씩 필요 기계 종속적인 테이블 실행 프로그램
1. 4 .4 컴파일러-컴파일러 시스템 ACK는 8개 부분으로 구성 (1) 프리 프로세서(preprocessor) (2) 전단부(front-end) . 각 언어 당 하나씩 존재 . ACK에서 제공하는 전단부는 FORTRAN, Pascal, BASIC, Modular-2, Occam 등 (3) 부분 최적화기(peephole optimizer) (4) 총괄 최적화기(global optimizer) (5) 후단부(back-end) . Intel 8086/80286/80386, . Motorola 68000/68020, Zilog Z80/Z8000, Vax시스템, Sparc, Sun2, Sun3등 (6) 목적 기계 최적하기(target machine optimizer) (7) 범용 어셈블러와 링커(universal assembler/linker) (8) 응용 패키지(utility package)