CS

컴파일 파고들기

kark 2025. 4. 22. 11:56
728x90

컴파일이 뭔가요?


사람이 이해하기 쉬운 코드로 구성된 고수준언어를 컴퓨터가 이해할 수 있는 저수준 언어 기계어 또는 중간언어로 번역하는 과정을 의미합니다.


 

왜 기계어와 중간언어로 나뉘는건가요?


프로그램 빌드시 중간언어로 번역하는 컴파일 과정이 한번 발생되며, 프로그램 실행 시 준비되어 있던 중간언어를 CPU가 이해할 수 있게 번역하는 컴파일 과정이 일어납니다.


 

왜 굳이 두번으로 나뉘는건가요? 그냥 한번에 기계어로 끝내면 되는거 아닌가요?


우선 CPU 마다 이해할 수 있는 기계어가 전부 다릅니다. 이에따라 고수준언어를 기계어로 바로 번역하게 될 경우

모든 CPU 마다 다른 빌드작업이 필요하게 됩니다.

그에 반면 중간언어로 컴파일을 미리 준비해놓고 이를 실행환경에 맞게 약간의 컴파일 과정으로 유연성을 확보할 수 있습니다.

 

또한, 중간언어에서 기계어로 번역할 경우 실행환경에 맞는 최적화 과정이 일어나는데 미리 기계어로 번역할 경우 환경정보를 고려하지않은 컴파일을 미리 수행했으므로 동적으로 발생되는 최적화의 효율성을 확보하지 못하게 됩니다.


 

여기서 말하는(동적 최적화, 중간언어 -> 기계어) 최적화는 뭔가요?


중간코드에서 기계어로 컴파일하는 과정중에는 실행환경,성능을 고려한 동적인 최적화 과정이 발생됩니다.

대표적으로 레지스터 할당, 인라인 함수화, 명령어 재배치, 런타임 타입지정 과 같은 최적화가 있습니다.


 

이전 컴파일 단계의 고수준언어 -> 중간언어 컴파일 과정의 최적화는 뭔가요?


해당 과정의 컴파일 과정은 어휘분석, 구문분석, 의미분석, 중간코드 생성, 최적화 과정이 있으며 이 과정에서 최적화 단계는 중간코드생성, 최적화 단계에서 적용되며 이때 불필요한 연산을 제거하거나 CPU 파이프라인 스톨을 방지하는 명령어 재배치 같은 최적화가 발생됩니다.


 

CPU 파이프라인스톨은 뭔가요?


CPU는 싱글코어 더라도 클럭 주기에 따라 명령어를 파이프라인 구조로 겹쳐 실행해 동시에 여러 명령어를 처리할 수 있습니다.

하지만 명령어간 데이터 의존성이 있는 경우 먼저 실행하고 있는 명령어의 결과를 기다려야 하는데, 이때 CPU 파이프라인이 멈추는 현상이 발생되며 이를 파이프라인 스톨이라 합니다.


 

'CS' 카테고리의 다른 글

클래스 파고들기  (0) 2025.04.24
컴파일의 각 단계 파고들기  (0) 2025.04.22
오버로드, 오버라이드(가상테이블 개념) 파고들기  (0) 2025.04.21
Static 파고들기  (0) 2025.04.18
절차지향 프로그래밍 POP  (0) 2025.02.13