컴파일 기법이란
- 고급 언어로 작성된 프로그램을 바로 실행 할 수 있는 프로그램으로 변환하는 방식이다
- 소스 코드로 작성해 놓은 것을 컴퓨터가 알아들을 수 있는 언어로 바꾸는 과정
- 컴퓨터는 바이너리 즉 기계어만 이해한다
- 소스 코드를 목적 프로그램으로 변경 시켜야 한다
- 번역이 완료되면 빠르게 실행 시킬 수 있는 장점이 있다
컴파일 단계
어휘 분석(lexical analysis)
- 원시 프로그램을 토큰 단위로 자르고, 토큰과 관련된 정보를 구문 분석 단계로 전달 한다.
구문 분석(syntax analysis)
- 어휘 분석 단계에서 전달 받은 토큰들이 문법적으로 옳은지 검사
- 오류가 없다면 파스 트리라 불리는 구조를 생성한다
중간 코드 생성 단계
- 중간 코드
- 소스 코드를 기계어로 번역하기 전, 번역기가 이해가 쉬운 추상화 된 코드를 말한다
- 기계어보다는 고수준이며 언어와 기계 아키텍처에 독립적이다
- 좋은 예시로 자바의 중간 코드는 JVM에 의해 생성된 바이트 코드이다
- 문법적인 오류가 아닌 의미적인 오류를 검사
- 중간 코드 생성 단계에 사용되는 언어는 중간 언어라 한다
- 중간 언어는 특정 기계어나 아키텍처에 종속 되지 않는다
최적화 단계
- 중간 코드에서 불필요한 코드를 제거 및 효율적인 코드로 개선
- 중간 코드의 크기를 줄이고 실행 속도를 빠르게 한다
코드 생성 단계
- 최적화 된 중간 코드로부터 해당 컴퓨터가 인식 할 수 있는 목적 프로그램 생성
- 컴파일 된 .C 소스 코드를 분석하고 최적한 결과를 기반으로 기계어 코드를 생성해 오브젝트 파일에 저장하는 단계
- 윈도우 : Obj
- 리눅스/유닉스 : .o
링킹 : 코드 생성 다음 단계는 뭘까?
링킹 단계는 컴파일 과정이 끝난 후에 이루어지며, 링커(linker)라는 별도의 프로그램이 사용됩니다. 링킹 단계에서는 다음과 같은 작업이 이루어집니다:
- 오브젝트 파일 결합: 컴파일러가 생성한 여러 오브젝트 파일(.obj 또는 .o 파일)을 결합합니다. 이 과정에서 코드와 데이터가 하나의 실행 가능한 파일에 병합됩니다.
- 라이브러리 연결: 필요한 라이브러리와 오브젝트 파일을 연결합니다. 이를 통해 사용자가 작성한 코드와 이미 존재하는 라이브러리 코드가 하나의 실행 가능한 파일에 포함됩니다.
- 심볼 해석: 링커는 프로그램에서 사용되는 함수나 변수의 주소를 결정합니다. 이 과정에서 프로그램의 심볼(예: 함수 이름)이 메모리 주소로 대체됩니다.
- 재배치: 링커는 메모리 주소를 기반으로 프로그램의 코드와 데이터를 재배치합니다. 이 과정을 통해 모든 참조가 올바른 주소를 가리키게 됩니다.
- 실행 가능한 파일 생성: 오브젝트 파일과 라이브러리를 결합한 후, 실행 가능한 파일(예: .exe 또는 ELF 파일)이 생성됩니다.
링킹 단계를 거쳐 최종적으로 실행 가능한 파일이 생성되며, 이 파일은 사용자가 작성한 코드와 필요한 라이브러리가 포함되어 있는 상태입니다.
728x90
'Computer Science > 프로그래밍 언어론' 카테고리의 다른 글
명령형 언어 (0) | 2023.03.26 |
---|---|
하이브리드 기법이란? (0) | 2023.03.26 |
해석 기법이란? (0) | 2023.03.26 |
참조 투명(referential transparency) (0) | 2023.03.14 |
꼬리 재귀(tail recursion) (0) | 2023.03.14 |