컴파일러와 인터프리터 (Compiler and Interpreter)
쉽게 풀면
외국어로 된 책을 우리말로 옮기는 두 가지 방법을 생각해 봅시다. 하나는 번역가가 책 전체를 미리 다 번역해서 완성된 번역본을 건네주는 방식입니다. 처음 번역하는 데 시간이 걸리지만, 완성된 후에는 누구나 빠르게 읽을 수 있습니다. 이것이 컴파일러의 방식입니다. 컴파일러는 사람이 쓴 코드 전체를 한 번에 기계어로 번역해 실행 파일을 만들고, 이후에는 그 실행 파일을 바로 실행합니다. 다른 하나는 통역사가 그 자리에서 한 문장씩 통역해 주는 방식입니다. 미리 준비하는 시간은 짧지만, 매번 말할 때마다 즉석에서 통역해야 하므로 상대적으로 느립니다. 이것이 인터프리터의 방식입니다. 인터프리터는 코드를 한 줄씩 읽으면서 그때그때 바로 해석하고 실행합니다. C나 C++는 주로 컴파일러를, 파이썬이나 자바스크립트는 주로 인터프리터를 사용합니다.
왜 중요한가
컴파일러와 인터프리터의 구분은 단순한 실행 방식의 차이를 넘어, 프로그래밍 언어 설계와 시스템 성능 연구 전반의 밑바탕이 되는 개념입니다. 새로운 언어나 도구를 제안하는 논문에서는 그것이 컴파일 방식인지 인터프리터 방식인지, 혹은 둘을 절충한 방식인지에 따라 실행 속도, 이식성, 개발 생산성이 크게 달라지므로 이를 먼저 명시하는 경우가 많습니다. 또한 임베디드 시스템, 딥러닝 프레임워크, 프로그래밍 언어 이론(PL) 연구처럼 실행 성능과 개발 편의성 사이의 균형이 중요한 분야에서는 이 개념이 최적화 기법이나 실행 엔진 설계를 논의하는 출발점으로 자주 등장합니다.
논문에서는 이렇게 쓰입니다
이 문장은 연구에서 개발과 실험의 편리함을 위해 인터프리터 언어를 쓰면서도, 속도가 중요한 부분은 컴파일러 언어로 미리 번역해 성능을 높였다는 뜻입니다. 소프트웨어 구현 방법을 설명하는 컴퓨터과학·공학 논문에서 자주 볼 수 있는 서술 방식입니다.
딥러닝·AI 시스템 분야 논문에서 흔히 볼 수 있는 서술로, 실험할 때는 한 줄씩 바로 실행되는 인터프리터 방식이 디버깅에 유리하지만, 실제 서비스에 배포할 때는 미리 컴파일해 두는 편이 실행 속도에서 유리하다는 점을 대비시켜 설명하고 있습니다.
프로그래밍 언어 및 도구 개발 연구에서 자주 등장하는 표현으로, 인터프리터 기반 구현이 새로운 언어나 문법을 실험적으로 설계하고 빠르게 반복 검증하는 데 유리하다는 점을 강조하고 있습니다.
조금 더 깊게 보면
실제로 많은 현대 언어는 순수한 컴파일러나 순수한 인터프리터 한쪽만 쓰지 않고, 소스 코드를 중간 표현인 바이트코드로 먼저 변환한 뒤 이를 가상 머신에서 해석 실행하는 절충 방식을 사용합니다. 자바의 JVM이나 파이썬의 바이트코드 실행이 대표적인 예입니다. 여기서 한 걸음 더 나아가 JIT(Just-In-Time) 컴파일이라는 기법도 논문에서 자주 언급되는데, 이는 프로그램을 실행하는 도중에 자주 반복 실행되는 코드 구간을 그때그때 기계어로 컴파일해 인터프리터 방식의 유연함과 컴파일러 방식의 속도를 함께 얻으려는 접근입니다. 논문을 읽을 때는 저자가 말하는 실행 방식이 정적 컴파일인지, 순수 인터프리터인지, 아니면 바이트코드나 JIT을 활용한 혼합 방식인지를 구분해서 보면 성능 비교나 최적화 논의를 훨씬 정확하게 이해할 수 있습니다.
주의할 점
컴파일러 방식이 항상 더 좋고 인터프리터 방식이 항상 더 나쁜 것은 아닙니다. 컴파일된 프로그램은 실행 속도가 빠른 대신 코드를 고칠 때마다 다시 번역(재컴파일)해야 하고, 인터프리터 방식은 실행이 상대적으로 느린 대신 코드를 수정하자마자 바로 결과를 확인할 수 있어 개발과 디버깅이 편리합니다. 실제로는 두 방식을 섞어 쓰는 언어도 많으며, 이는 타입 시스템이 언제 오류를 검사하는지와도 밀접하게 연관됩니다.