컴파일

내위키

Compile.

원래 여러 출처에서 자료를 따 와서 편집한다는 뜻을 가지고 있지만 지금은 컴퓨터 용어로 가장 친숙하다. 고급 프로그래밍 언어로 만든 프로그램을 실제 컴퓨터에서 실행할 수 있는 기계어, 중간 코드, 또는 다른 프로그래밍 언어로[1] 번역하는 것을 뜻한다. 프로그램을 기계어로 번역하는 방법은 크게 두 가지로 컴파일과 인터프리트가 있다. 컴파일은 전체 프로그램 코드를 번역해서 실행 가능한 기계어 코드를 만드는 반면, 인터프리트는 프로그램을 실행시켜서 그 순서에 따라 나오는 명령어를 즉석에서 번역해서 실행시킨다. 컴파일이 문서를 통으로 받아서 싹 번역해서 주는 것이라면 인터프리트는 한줄 한줄씩 통역하는 것에 가깝다. 사실 인터프리트(interpret)라는 말이 원래 '통역'을 뜻하는 말이다. 컴파일을 해 주는 프로그램을 컴파일러(compiler), 인터프리트를 해 주는 프로그램을 인터프리터(interpreter)라고 한다.

컴파일 방식을 사용하는 가장 대표적인 언어라면 뭐니뭐니해도 C. 자바도 컴파일 방식이지만 정확히는 중간 코드인 바이트코드를 만드는 부분까지만 컴파일러고, 바이트코드를 다시 기계어로 번역해서 실행하는 과정은 인터프리트에 가까웠다. 다만 이제는 속도 향상을 위해서 바이트코드→기계어 번역 과정에서 JIT 컴파일 방식을 사용하고 있다.

컴파일의 가장 큰 장점이라면 뭐니뭐니해도 속도다. 프로그램을 싹 번역해서 실행할 수 있는 파일을 만들어 주므로 프로그램을 실행할 때 그때 그때 명령어 단위로 번역하는 인터프리터보다 속도가 우월하다. 똑같은 문서를 미리 번역해 놔서 그걸 그냥 죽 읽기만 하는 것과, 원본 문서를 놓고 한 줄씩 번역하면서 읽는 것과, 어느 쪽이 속도가 더 빠를지는 말하나 마나다. 그래서 인터프리트 방식으로 실행하던 방식을 사용하던 프로그래밍 언어들도 이른바 JIT 컴파일이라는 방식을 사용한다.

인터프리트와 컴파일을 절충하는 방식도 있는데, 예를 들어 컴파일 방식의 언어를 디버그할 때에는 한 줄 한 줄 실행해가면서 결과를 추적하는 기능이 있다. 이는 컴파일을 하면서 기계어 파일 안에 디버그 정보를 심어 놓는 방식으로 역추적이 가능하도록 한 것이다. 다만 이렇게 컴파일을 하면 실행 파일에 디버그 정보가 들어가므로 파일 크기가 커지고 실행 속도도 느려진다. 또한 프로그램에 바뀌는 부분이 있을 때마다 전체를 컴파일하지 않도록 프로그램을 여러 조각으로 나눠서 변화한 조각만 컴파일하는 분할 컴파일, 또는 바뀐 부분만 추가로 컴파일하는 증분 컴파일 방식도 있다. 단 증분 컴파일은 프로그램을 자주 고치는 디버그용으로만 쓰는데, 처음의 실행파일을 그대로 둔 상태에서 변한 부분만 다시 컴파일해서 위에 붙여 놓는 방식이라 파일 크기가 계속 커지기 때문이다.

각주

  1. 예를 들어 타입스크립트는 컴파일 하면 자바스크립트 파일이 나온다. C++도 처음에는 컴파일하면 C 파일이 나왔고 이걸 다시 컴파일하는 방식으로 실행 파일을 만들었다.