컴파일러

1 Compiler

어떤 프로그래밍 언어로 쓰여진 소스 파일을 다른 언어로 바꾸어주는 번역 프로그램.

대부분 고수준 언어를 기계어로 번역하는 프로그램을 일컫지만 엄밀히는 어떤 언어 A를 B로 바꾸면 그게 컴파일러다. SchemeC언어로 번역한다든지, 심지어 기계어를 C언어로 번역하더라도(!) 컴파일러라고 칭할 수 있다. 이 경우 기계어를 대상 언어로 번역하는 컴파일러와의 구분을 위하여, 각각 전자를 트랜스컴파일러(transcompiler)나 소스간 컴파일러(source-to-source compiler), 후자를 디컴파일러(decompiler)라고 많이 부른다.

초기엔 어떤 프로그램을 작성하기 위해서는 컴퓨터 위에서 바로 돌아가는 기계어를 통하여 프로그래밍을 했다. 그러나 이런 과정은 생산성, 기기 간 호환성[1], 디버깅 등 모든 면에서 효율적이지 않기 때문에 컴퓨터 공학의 발전과 더불어 많은 부분이 추상화된 고수준 언어를 작성하고 이를 번역기를 통해 기계어로 번역하기 시작했는데, 이 번역기가 바로 컴파일러이다. 현재 많은 프로그램컴파일러를 통하여 전체를 기계어로 번역하여 실행하므로 프로그램 개발에 필수적인 툴 중에 하나다.

반면에 소스를 한꺼번에 번역하지 않고 명령 하나하나를 실행할 때마다 해석하여 계산하는 방법도 있는데 이 해석기를 인터프리터라 해서 따로 분류한다. 컴파일러가 번역기라면 인터프리터는 통역기인셈.

재밌는 것은 컴파일러도 결국 하나의 언어로 짜여진 프로그램이라는 점. 따라서 원리상 C언어 프로그램이 C언어를 번역하는 일이 가능하다. 이 경우, C 컴파일러를 사용하기 위하여 이 컴파일러를 컴파일하는데 C 컴파일러가 필요하다(..) 심지어 최근 버전의 gcc 컴파일러의 경우 C++을 사용하기 때문에 C 컴파일러를 컴파일하는데 C++ 컴파일러가 필요하다. 이런 현상을 부트스트래핑(bootstrapping)이라고 한다. 언어를 최초 설계할 때만 사용 가능한 다른 언어로 짜여진 컴파일러의 도움을 받은 이후로는 언어를 번역하는 컴파일러가 자기 자신의 언어로 짜여질 수 있다. 얼핏보면 모순적이지만 맨 처음에만 다른 언어의 도움을 받는다면 충분히 가능하다. 일반적으로 고수준 언어로 갈수록 생산성이 높아지므로 이런 접근은 컴파일러를 작성하는데 들이는 비용을 효과적으로 줄일 수 있다. 일례로, GHC라는 Haskell 컴파일러는 최초에 Lazy ML이라는 다른 언어로 작성되었다가, 자기 자신의 언어인 Haskell로 재작성 되었다.

원칙적으로 컴파일러는 프로그램을 기계어로 바꾸기만 할 뿐 이를 바로 실행이 가능하게 하지는 않는다. 여러 소스 파일에서 나온 결과물을 합치고 라이브러리도 포함시키는 등 별도의 작업을 거쳐야 실행이 가능해지는데 이를 수행하는 프로그램이 링커이다. 하지만 보통은 그냥 뭉뚱그려 컴파일러라 부르는 경우가 많다. 또한 요즘은 그냥 프로그램 하나만 돌리면 컴파일과 링킹을 한 번에 끝낼 수 있게 되어 있다. 물론 내부적으로는 컴파일러와 링커가 따로 있어서 이를 이용하는 경우가 많지만.

단점은 수정이 용이하지 않다는 점이다. 수정 사항이 발생하면 다시 컴파일을 해야 되는데, 작은 프로그램일 경우에는 문제가 되지 않지만 컴파일이 몇 시간씩 걸리는 덩치 큰 프로그램에서는 문제가 된다. 특히 수정 사항이 빈번하게 발생할 경우에는 큰 문제가 된다. 이 때문에 수정 사항이 빈번하게 발생할 것 같은 부분은 인터프리터를 쓰는 스크립트 언어로 따로 빼 두는 기법을 많이 사용한다.[2] (인터프리터는 속도는 느리지만 수정이 간단하다는 장점이 있다.)

어셈블리어를 번역하는 프로그램은 컴파일러라 하지 않고 따로 어셈블러라 한다.

요즘 컴파일러들은 기계가 프로그램을 빠르게 돌릴 수 있도록 적절한 최적화 작업을 하고 프로그래머가 실수할만한 부분을 경고하는 등 갈수록 똑똑해지는 추세이다.

OS와 함께 프로그래머의 스킬트리에서 최상위에 군림하는 스킬. 운영체제와 컴파일러를 스스로 만들 수준이 되면 일단 프로그래머 스킬트리는 전부 다 최소 한개씩은 찍은 것이다. 거기서 더 나가면 최적화 가 있는데 이건 컴파일러의 보조 스킬. 대학교 컴퓨터공학 커리큘럼의 가장 마지막(4학년)에 있는 과목이기도 하다. 이걸 제작하려면 하드웨어와 소프트웨어 전부를 이해하고 있어야 하고 자료구조와 알고리즘에 대한 심도 깊은 이해와 함께 전산수학에도 능해야 한다. 그래서 컴파일러 1렙을 찍으면 취직 퀘스트는 통과를 못 하는 게 이상할 정도가 된다.

C 등의 고급 언어에서 CPU의 인스트럭션 하나로 해결할 수 있는 복잡한 기능(?)을 사용할 경우 특정 함수를 호출하면 컴파일러가 함수를 호출하는 명령을 넣어 주는 것이 아니라 그냥 그 자리에 어셈블리를 사용한 것과 동일하게 기계어 코드를 때려박는 경우가 있는데 이것을 intrinsic, 혹은 built-in function이라고 한다(인라인 함수와는 다르다). Compare-And-Exchange의 예를 들어(현대적인 CPU는 대부분 지원한다) a값이 m인 경우 n으로 바꾸는 코드의 경우 x86 CPU는 cmpxchg 인스트럭션 하나로 해결이 가능하다. 이러한 경우 컴파일러가 지원하는 인트린식을 사용하면 된다. RISC에서 pesudoinstruction[3]을 사용하는 것과 반대의 개념으로 볼 수 있다.

int a, b;
...
b = CAS(&a, 10, 20);
....
  • C 코드
int CAS(int* pos, int oldval, int newval)
{
int oldpos = *pos;
if(*pos == oldval)
*pos = newval;
return oldpos;
}
  • 어셈블리 코드(x86-64)
CAS:
movl %edx, %eax
lock
cmpxchgl %esi, (%rdi)
ret
  • 어셈블리 코드(x86 32비트) (built-in function 을 사용하지 않은 경우)
CAS:
mov ecx, dword ptr[esp + 4]
mov eax, dword ptr[ecx]
push eax;
mov ebx, dword ptr[esp + 12];
cmp ebx, eax;
jne endpoint;
mov dword ptr[ecx], dword ptr[esp + 16];
endpoint:
pop eax;
ret 16;
  • 어셈블리 코드(x86) (built-in function 을 사용한 경우)
CAS:
mov ecx, dword ptr[esp + 4]
mov eax, dword ptr[ecx]
mov ebx, dword ptr[esp + 8];
mov edx, dword ptr[esp + 12];
cmpxchg ebx, edx;
mov dword ptr[ecx], esp;
ret 16;
  • VC++ intrinsic
b = _InterlockedCompareExchange(&a, 20, 10);
  • gcc built-in function
b = __sync_val_compare_and_swap(&a, 10, 20);

참 쉽죠?

인텔의 x86 CPU는 삼각함수로그 등의 실수연산을 CPU가 바로 지원해주기 때문에 x86용 컴파일러는 대부분의 수학 함수를 인트린식으로 지원한다.

2 아사미야 키아의 만화

일본 만화 / 목록일본 애니메이션 / 목록
· · · · · · · · · · · · ·
숫자 · 라틴 문자
· · · · · · · · · · · · ·
숫자 · 라틴 문자

전뇌(컴퓨터)세계에서 날아온 컴파일러, 어셈블러, 인터프리터 등의 루틴이라는 존재들의 여성들을 중심으로 한 코미디 만화. 연애 노선도, 개그 노선도, 스토리성도 애매한 작품이었다. 속편으로는 연애 노선이 약간 늘어난 어셈블러OX 가 있다. 주인공인 컴파일러는 작가가 그린 또 다른 작품인 사일런트 메비우스 0에 잠시 등장하기도 했고 현재 연재중인 히메가미 가젯에도 등장한다.[4]

뮤직 클립 영상과 OVA도 만들어졌다.음의 장과 양의 장,그리고 컴파일러 파스타 총 3종.

음의 장은 개그 요소가 전혀 없는 진지한 일상,양의 장은 개그&연애요소 라는 상반된 분위기가 특징. 파스타는 본편 처럼 정신 없는 분위기.

  1. 예를 들어서 ARM 아키텍쳐 대상으로 작성된 프로그램은 x86 아키텍쳐에서 안돌아가는 식으로.
  2. 대표적으로 LLVM
  3. 어셈블리 명령어는 있지만 실제 바이너리를 까보면 어러 명령어의 집합으로 나오는 경우
  4. 히메가미 가젯 5편 말미에 컴파일러가 등장한다.