흔히들 말하는 말이지만 은근 헷갈리고 정확하게 알지못하는것 같아 이 기회에 한 번 정리해 보려고 한다.
컴파일
은 C나 JAVA등의 개발 언어로 작성된 소스코드를 컴퓨터가 인식할 수 있는 기계어 코드로 변환하는 것을 의미한다. 이러한 일련의 과정을 컴파일타임
이라고 부르기도 한다. 그리고 이러한 과정을 실행시켜주는 것을 컴파일러
라고 하는 것이다.
이렇게 단순히 말하면 기억하기 힘들 수 있으니 간단히 생각해보자. 컴파일(Compile)이란 단어는 단순히 엮다, 편집하다의 뜻을 가진 영단어이다. 즉, 기존의 소스코드를 다른 언어로 바꿔주는 일종의 번역과정인 셈이다. 때문에 어떤 언어를 다른 언어로 바꿔준다면 그것을 컴파일러라고 말할 수 있는 것이다.
이러한 컴파일과정을 거치는 언어들은 컴파일 단계와 실행 단계가 분리되어 있으며, 컴파일은 단 한번만 수행된다. (실행프로그램을 만드는 것은 링커가 수행한다. 다시말해 컴파일->링킹 과정을 통해 실행파일이 생성된다.) 컴파일 단계와 실행 단계가 분리되어 있기 때문에 실행자체의 속도는 빠른편이라고 할 수 있다. 단, 프로그램이 바뀌면 작은변화라도 그때마다 다시 컴파일을 해주어야 한다는 단점이 있다.
대표적인 컴파일언어로는 C,C++,C#,JAVA 등이 있다.
런타임
은 컴파일과정을 마친 프로그램이 실행되어 동작하는 실행환경을 말한다. 단어 그대로의 뜻이라고 보면 된다. Javascript
로 짠 코드를 브라우저내부에서 실행하고 있다면, 런타임은 브라우저가 되는 것이다.
이미 앞서 살펴본 단어의 뜻을 기준으로 한번 살펴보자.
컴파일타임에러라고 하면, 컴파일을 하는 과정에서 문제가 생겼다고 볼 수 있다. 한마디로 번역이 안된다는 뜻이다. 그렇다면 어떤 문제가 생긴것일까?
컴파일러에는 문제가 없다고 가정해보자. 그렇다면 다른 언어로 바꿀 수 없는것은 번역할 소스코드가 잘못 적힌 경우일 것이다. 그렇다! 우리가 흔히 겪을 수 있는 Syntax Error
나 Type Check Error
가 바로 컴파일타임에러의 대표적인 예시이다.
그렇다면 런타임에러는 어떤 경우일까? 단어를 보고 생각하면 실행프로그램까지는 완성되었지만, 실행하는 과정에서 문제가 생긴것으로 보인다. 즉, 소스코드를 해석하는 것 자체는 가능했지만, 실행할 수는 없는 상황인 것이다. 대표적인 예시를 보면 바로 이해가 갈 것이다.
런타임에러의 예시로는 Divide By Zero Error
나 잘못된 배열참조에러
, 메모리 부족에러
등이 있다.
지금까지 일반적으로 쓰이는 컴파일과 런타임의 정의에 대해 알아보았다. 그리고 컴파일과정을 거치는 언어의 단점도 확인했다. 간단하고 자주바뀌는 프로그램을 작성해야하는 상황이라면 컴파일언어는 꽤 불편할 것이다. 코드의 크기가 커질수록 단순한 변화라도 컴파일과정은 시간이 길게 소요될 것이니 말이다. 이를 위해 나온것이 인터프리터
이다.
인터프리터(Interpreter)의 사전적의미는 통역가이다. 우리는 가끔 TV나 유튜브등을 통해 통역가들이 일하는 모습을 본 적이 있다. 통역가들은 누군가가 말을하면, 그것을 듣고 즉각 번역하여 알려주곤한다. 다음 말을 한다면 통역가는 또 번역해서 알려줄 것이다.
인터프리터는 코드를 한 줄씩 읽어 내려가며 실행하는 프로그램이다. 통역가 그 자체인 것이다. 때문에 컴파일과정을 거치는 것이 아니라, 실행단계인 런타임에 코드를 한줄씩 변환 후 실행하게 된다. 컴파일과정 자체가 없고 매 실행마다 인터프리트 단계를 거치게 된다. 때문에 실행시간 자체는 컴파일언어에 비해 느려지게 되었다. 그럼에도 프로그램 수정이 간단해진다는 큰 장점때문에 Javascript
,Python
,Ruby
등 다양한 언어들이 애용하는 방식이다.