Compiler 란
컴파일러는 high-level의 프로그래밍 언어로 쓰여진 프로그램을 특정 target computer에 맞는 object 파일로 번역해주는 프로그램이다.
어떤 유저는 프로그램을 만들 때 프로그래밍 언어를 통해서 프로그램을 개발하게 된다. 여기서 그렇게 작성된 코드를 src 라고 하면 src를 특정 하드웨어에 맞는 기계어로 적힌 그러한 컴퓨터에 맞게 번역을 해주는 것을 컴파일러라고 생각하면 된다.
C 언어로 쓰인 src를 해석하면 C compiler 같이 이해하면 된다.

컴파일러 구조
src 가 컴파일러의 frontend 로 가게 되면 immediate code, representation 같은 중간 코드들이 나오게 되고 이것을 back-end 가 처리하게 된다.
이때 front-end는 특정 프로그래밍 언어로 쓰여진 src가 입력으로 들어오므로 이것에 종속될수밖에 없어 language dependent part라 보면 되고 back-end는 이를 번역에 하드웨어에 맞는 기계어로 바꿔줘야 하므로 machine dependent part 일 수 밖에 없다.
따라서 사람들은 src에 종속적인 부분과 machine에 종속적인 부분을 잘 활용해보는 방법을 생각해보게 되고 front-end를 machine에 무관하게, 반대로 back-end는 src에 무관한 형태로 만들어보는 시도를 하게 된다.

컴파일러 모델중 ack 모델이 있다.
src와 machine에 따로 종속되게 front와 back을 분리하여 컴파일러를 구성하게 되면 많은 이점이 나타나는데 그 중에 back-end 부분을 사용하지 않고 가상적(Virtual)으로 만든 interpreter를 통해서 src을 exe하게 실행시켜 호환성을 만드는 방법이다. 대표적으로 JAVA이다. back-end를 사용하지 않는다는 의미는 target machine에 종속적인 object를 만들지 않는다는 의미이고 즉, 인터프리터를 통해 machine에 종속적이지 않게 src를 실행시킬수 있다는 뜻이다. front-end가 만든 중간코드 수준에서 공유를 하여 실행되며 자바에서는 이를 byte code라 한다.

고급언어를 구현하는 방법에는 크게 두가지 방법을 쓰는데
컴파일러는 번역을 하고 실행시킨다는 특징이 있고 인터프리터와는 다르게 object파일이 만들어지므로 이는 기계어로 적혀있어 컴퓨터가 바로 이해할수있다. 그래서 실행속도가 굉장히 빠르다. 번역자체는 시간이 좀 걸린다.
인터프리터는 target에 맞는 object를 만들지 않고 수행하게끔 해준다. 즉 소프트웨어적으로 해석하여 실행하므로 속도는 컴파일러에 비해 느리다. 간단한 코드면 한줄한줄 빨리 쓰고 빠르게 테스트하면서 코드를 진행해나갈수있지만 실행은 컴파일러에 비해 오래걸린다.
이 각각의 장점을 가져온 hybrid 방법도 있다.

컴파일러가 4개의 언어에 대해서 번역을 하는 front부분과 3개의 machine으로 object를 만들어주는 부분이 하나의 load가 아니라 구분되어 있다면 12가지의 경우로 우리는 개발이 가능하게 될수있다.
그래서 우리는 이러한 cross 한 성격의 컴파일러를 이용한다면 플랫폼이 달라도 개발이 가능해진다.
예를 들어서 pc로 안드로이드 앱을 개발하려고 한다. pc로 만들어진 object는 원래는 해당 pc에서만 동작하게 개발되지만 만약 안드로이드에서 돌아가는 앱을 pc에서 개발하게 된다면 이를 cross compiler 라 할 수 있다.
물론 그렇게 만들어진 object는 안드로이드에서 돌아가겠지만 시뮬레이터등을 통해서 pc에서 테스트해볼수도 있다.
예)
1. L언어로 작성되고 L언어를 B머신의 기계어로 번역하는 컴파일러 프로그램을 머신 A에서 L언어를 A머신의 기계어로 번역하는 컴파일러를 통해 컴파일을 시킨다
2. 그러면 A머신의 기계어로 작성되고 L언어를 B머신의 기계어로 번역하여 A머신에서 돌아가게 하는 컴파일러 프로그램이 A 머신에 생긴다. 지금 만든 프로그램으로 다시 한번 더 1번을 컴파일을 한다.
3. 그러면L언어로 작성되고 L언어를 B머신의 기계어로 번역하는 컴파일러 프로그램이 'A머신의 기계어로 작성되고 L언어를 B머신의 기계어로 번역하여 A머신에서 돌아가게 하는 컴파일러 프로그램을 통해서 B머신의 기계어로 작성되고 L언어를 B머신으로 번역하는 컴파일러 프로그램을 만들 수 있다.
4. 이를 한번 더 B머신에서 다시 컴파일하자
5. 최종. B머신의 기계어로 작성되고 L언어를 B머신으로 번역하는 컴파일러 프로그램이 완성되었다.
6. bootstrp된 컴파일러 탄생. A 머신에서 만들어진게 아니라 B머신에서 B컴파일러를 만들어 부트스트랩된 컴파일러가 된다.
A머신에서 B컴파일러와 B머신의 B컴파일러는 조금의 차이가 있다.
이러한 과정을 부트스트랩 컴파일러의 크로스컴파일을 통해서 부트스트랩하는 과정이다 라 표현한다.

전처리기는 src를 번역하기전에 쓰여진 전처리를 하여 좀더 확장하는 기능을 가진다.
macro 처리, 상수처리, include 등등의 작업을 한다. src가 늘어나는 효과가 있다.