프로그램은 다른 프로그램에 의해 다른 형태로 번역된다.

ORCASUIT·2023년 10월 22일
0

개요

일반적으로 컴파일, 인터프리트, 트랜스파일 등의 과정을 통해 소스 코드가 다른 형식이나 언어로 변환되거나 실행되는 것을 의미함. 여기에는 여러 단계와 여러종류의 '프로그램'이 개입할 수 있음.


컴파일 시스템

  1. 컴파일러: 고급 프로그래밍 언어로 작성된 소스 코드를 기계어나 바이트코드로 변환, 예를들어, C 컴파일러는 C언어로 작성된 코드를 기계어로 변환함.

  2. 인터프리터: 소스 코드를 실시간으로 읽어 해석하고고 실행함. Python 인터프리터는 Python 코드를 해석하여 실행.

  3. 트랜스파일러: 한 고급 프로그래밍 언어로 작성된 코드를 다른 고급 프로그래밍 언어로 변환. 예를들어 TypeScript를 JavaScript로 변환할 수 있음.

  4. 어셈블러 : 어셈블리 언어로 작성된 코드를 기계어로 변환함.

  5. 링커 : 여러 개의 컴파일 된 파일을 하나의 실행 파일로 합침.

  6. 옵티마이저 : 코드를 더 효율적이거나 빠르게 실행될 수 있도록 변환함.

  7. 전처리기 : 코드에 포함된 매크로나 디렉티브를 해석하여 실제 코드로 대체, 예를들어 C언어 전처리기는 '#include' 나 '#define' 등을 처리함.

이러한 방식을 통해 원래의 프로그램은 다야한 형태와 용도로 '번역' 되거나 '변환' 됨. 이 과정들은 대게 다른 '프로그램'에 의해 수행되며, 이렇게 하여 프로그램이 실행되거나 다른 시스템에서 사용될 수 있음.


Q"순서대로 작동하는가?"

A "아니오. 위에서 언급한 프로세스들은 모두 독립적인 단계. 
특정한 순서로 진행되어야 하는 것은 아님. 
그러나 일반적으로 소프트웨어 개발 흐름에서는 특정한 순서가 존재할 수 있음."

C언어의 컴파일 순서

  1. 전처리기 : '#include', '#define' 등의 전처리 지시어를 처리함.
  2. 컴파일러 : 전처리가 완료된 소스 코드를 어셈블리 언어나 중간 코드로 변환
  3. 어셈블러 : 필요하다면 어셈블리 코드를 기계어로 변환
  4. 링커 : 여러개의 오브젝트 파일을 하나의 실행파일로 합침

이런 순서는 프로그래밍 언어나 개발 환경, 프로젝트으 요구사항에 따라 달라질 수 있음. 또한 인터프리터 언어인 Python과 같은 경우에는 컴파일 단계가 없거나 ('.pyc' 파일을 생성하는 것처럼) 선택적일 수 있음.

C 문장들은 다른 프로그램들에 의해 저급기계어 인스트럭션들로 번역되어야 함 이 인스트럭션은 실행가능 목적 프로그램이 알고 하는 형태로 합쳐져서 바이너리 디스크파일로 저장됨. 목적 프로그램은 실행가능 목적파일이라고도 부름.

컴파일러 드라이버는 유닉스 시스템에서 다음과 같이 소스파일에서 오브젝트 파일을 번역함
linux> gcc -o hello hello.c

여기서 GCC 컴파일러 드라이버는 소스파일 hello.c를 읽어서 실행파일인 hello로 번역하고 위의 4단계 (전처리기 - 컴파일러 - 어셈블러 - 링커 ) 거치고 이를 '컴파일 시스템'이라 부름.


C 컴파일 시스템의 단계

Source Code (.c) : 개발자가 작성한 원시 코드


Preprocessor : #include 등 디렉티브 처리를 맡음


Modified Source Code (.i or .ii) : 전처리된 코드


Compiler : 전처리 된 소스코드가 어셈블리 코드로 변환


Assembly Code (.s) : 컴파일러에 의해 생성된 어셈블리 코드


Assembler : 어셈블리 코드를 기계어로 변환


Object Code (.o or .obj) : 이진 형식의 오브젝트 파일


Linker : 여러 오브젝트 파일과 라이브러리를 하나의 실행 파일로 묶음


Executable (.exe, a.out, etc.) : 최정적으로 실행 가능한 파일이 생성.


이걸 왜 알아야 하나?
컴파일 시스템이 어떻게 동작 하는지 이해하는 것은 중요하다.

0개의 댓글