# 1. 컴파일러의 개요 ## 1.1 컴파일러의 필요성 * 언어의 종류 * 형식언어 => 프로그래밍 언어 * 자연언어 ### 매개변수 * 매개변수 종류 * 형식 매개변수: 파라미터 * 실 매개변수: 인자 * 매개변수 전달 방법 * 참조 호출: call by reference * 값 호출: call by value * 이름 호출: 파라미터 자체가 인자로 치환되는 것 #### 매개변수 전달 방법 예제 * 다음을 각각 참조, 값, 이름 호출로 호출하면? ``` Begin Integer A, B: Procedure F(X, Y, Z); Integer X, Y, Z; Begin Y := Y + 2; Z := Z + X; End F; A := 3; B := 5; F(A + B, A, A); PRINT A // <= 결과무엇? END ``` * 참조 * `Y`와 `Z`가 `A`를 가리킨다는 것만 잘 알고 있으면 된다 * 따라서 `PRINT A`는 `13`을 출력 * 값 * 이건 뭐... 당연히 `3`을 출력 * 이름 * `F(X, Y, Z)`가 `F((A + B), A, A)`로 변하는 것 * 따라서 다음과 같아진다 * `Y := Y + 2` => `A := A + 2` => `A := 5 + 2` * `Z := Z + X` => `A := A + (A + B)` => `A := 5 + (5 + 5)` * 답은 `15` ## 1.3 번역기의 종류 * 어셈블러 * 대부분 _two-pass-assembler_ 로 구성된다 * first pass: 어셈블리 코드로 기호표를 작성 * second pass: 이를 bit로 표시 # 2. 간단한 컴파일러의 구조 ## 2.1 컴파일러의 논리적 구조 * 다음 순서로 진행되겠지 1. 어휘분석: 토큰화 2. 구문분석: 파스 트리 3. 의미분석 4. 중간코드 생성 5. 최적화 7. 목적코드 생성 8. 목적 프로그램 * 구문분석에서 parse tree 만드는거 나온다고 *