sswu
컴파일러 중간
hi._.0seon
2022. 10. 4. 23:40
반응형
컴파일러
- Analysis (분석)
- Synthesis (합성)
1. 분석
1) 구문 분석
position := initial + rate * 60
분석과 유사한 작업
- Structure editor 편집기
- IDE
- Pretty printers 코드 예쁘게 출력해줌
- 컴파일러 처럼 문법을 알아야 예쁘게 출력 가능
- Static Checkers
- 컴파일러와 유사하지만, 합성 파트가 없음
- 나중에 오류일 가능성이 있는 부분에 대해 오류 메시지를 띄워줌
(런타임까지 가지 않음)
- Interpreters
- source program -> target program
- 오른쪽의 표현 식들이 재귀적으로 계산됨(?)
- 명령어를 실행하기 위해 자주 사용됨
컴파일러와 유사한 작업
- Text formatter
- 타이핑된 텍스트로부터 입력 스트림으로 들어온 문자들을 받는다.
- Silicon Compilers
- 소스 언어를 가짐
- 언어의 변수 -> 입력 신호에 대응
(메모리 위치에 있는게 아니라 논리 신호(0, 1) 또는 스위칭 회로의 신호 그룹을 나타낸다.)
- Query Interpreters
- 범용언어(C++, Java,,,) 안에 SQL 쿼리를 넣을 수 있음
- JDBC,,
The Context of a compiler
실행 가능한 타겟 프로그램을 만들이 위해 몇가지 다른 프로그램이 필요할 수 있다.
소스 프로그램은 별도의 파일에 저장된 모듈로 나눌 수 있다.
소스 프로그램을 수집하는 작업은 때때로 프리프로세서라고 불리는 별개의 프로그램에 맡겨진다.(#include)
프리프로세서는 매크로를 소스 언어에서 번역
# define MAX 10
int a = MAX; -> int a = 10;
1.2 Analysis of the source program
어셈블러가 기계어 코드로 변환한 다음 일부 라이브러리 루틴과 함께 기계에서 실제로 실행되는 코드로 연결되는 어셈블리 코드를 만듭니다.
라이브러리 ->
- skeleton source program
- 프로그램 뼈대
- preprocessor (전처리기)
- #ifdef이 호출함, #define 등을 처리
- #include 파일들을 가져와서 삽입함
- Compiler
- 일단 어셈블리어로 번역
- 바로 기계어로 번역하는 것보다 쉬워서 중간 언어를 둠
- 결과로 기계에 맞는 어셈블리어가 나옴
- assembler
- 메모리 재배치 가능한 기계어 코드로 번역함
- 상대 주소로 된 메모리 주소를 사용함
- loader, link-editor
- 이때 오브젝트 파일들과 라이브러리를 묶어 실행 가능한 프로그램으로 결합?
- 로딩하면서 실행할 기계어 파일로 바뀜 -> absolute machine code (주소값이 항상 고정인 기계어 파일)
PC: 특수목적 레지스터
fetch - decode - execute
target code --> 목표 기계에 맞는 코드
object code -> 기계어로 번역되서 바로 실행가능
1) Lexical Analysis (어휘 분석)
-> Scanning, Linear Analysis (선형 분석)
- 어휘분석 시에는 문법적으로 올바른지를 체크하지는 않음
- token 단위로 자름
- 입력 스트림으로 들어오는 문자열을 읽어들어 집합적인 의미를 갖는 문자 시퀀스를 group으로 묶음
토큰 그룹
- position
- :=
- initial
- +
- rate
- *
- 60
2) Syntax Analysis (구문 분석)
-> Parsing, Hierarchical Analysis (계층 분석)
- 문장 구조를 분석함
- 타동사 앞에 목적어가 있는지, 이런걸 체크
- 토큰이 집합적 의미를 갖는 중첩된 컬렉션으로 계층적으로 그룹화 됨
- 소스 프로그램의 토큰을 컴파일러가
3) Semantic Analysis (의미 분석)
- 타입들이 말이 되게 쓰이고 있는지를 체크함
- 프로그램의 구성 요소가 서로 의미있게 맞는지 확인하기 위해 특정 검사를 수행
반응형