아메리카노가 그렇게 맛있답니다 여러분

프로그래밍 언어는 크게 해석 방식과 컴파일 방식으로 나뉜다.


해석은 인터프리터라 불리는 프로그램이 중간에서 코드를 번역해주는 방법이며 이때 코드는 매우 다양합니다.

자바스크립트나 PHP의 경우 텍스트(Plain-Text)를 번역하는 방식이고, 자바의 경우 바이트코드(ByteCode)라 불리는 것을 번역하는 방식입니다.

(자바8의 경우 JIT이란 방식을 채택하여 완전한 해석 언어로 보기 힘들 수 있습니다.)


보통은 텍스트이기 때문에 파일을 열어서 읽기 간편하다는 점이 장점으로 꼽히며 텍스트 파일이므로 인터프리터에서 자기자신의 코드를 스스로 변경하는 것도 가능합니다. 또한 해석은 행 단위로 진행되기 때문에 바로바로 결과를 볼 수 있으며 오류가 존재해도 오류가 일어나는 행 이전 부분은 정상적으로 실행됩니다. 무엇보다 행 단위로 진행되기 때문에 컴파일된 프로그램보다 메모리를 적게 차지합니다.


단점으로는 프로그램이 인터프리터에 종속된다는 점과 해석의 속도 & 효율성입니다.

해석이란 과정 자체가 OS 위에서 도는 프로그램이 실행하기 때문에 OS 위에서 바로 돌 수 있는 컴파일 방식보다 Runtime 때 속도 저하를 유발할 수 있습니다. Runtime 때 오래 걸리는 것은 상당히 문제가 될 수 있는데, 사용자 경험(UX)에 직접적인 영향을 줍니다. '이 프로그램은 느려터졌어' 라는 인식이 박힐 수 있습니다. 그렇기 때문에 Runtime은 CompileTime보다 값비쌉니다.

효율성 역시 문제가 되는데 메모리를 적게 차지하는 것이 단점이 되기도 합니다. 반복되는 문장을 매 번 해석하는 것은 비록 해석 시간이 짧다고 하더라도 속도에 긍정적인 영향을 끼친다고 할 수 없습니다. (html을 생각하면 쉽다. 자바스크립트라면 funtion 단위로 읽을 듯함.)



컴파일은 gcc와 같은 컴파일러가 프로그램을 어셈블리로 된 중간파일로 변환한 후 링커가 링크하여 프로그램을 만드는 방법입니다.

[컴파일의 정확한 단계]

1. 전처리기(Pre-Processor)가 #include, #define과 같은 구문들을 변환해줍니다.

2. 어셈블러(Assembler)가 특정 코드를 어셈블리로 변환해주고 중간파일(Intermediate File)을 내놓습니다. (어셈블리는 기계어와 1:1 매칭됨)

3. 링커(Linker)가 중간파일에서 사용된 외부 함수들을 연결(link)해줍니다. 연결하기 전의 중간파일은 0000... 처리되어 있습니다.


해석과 달리 OS 위에서 바로 돌기 때문에 성능 문제가 프로그래머의 비효율적 설계를 제외하면 일어나지 않습니다.


프로그램이 커질수록 컴파일 시간이 늘어나기 때문에 중간 확인이 어려울 수 있으며 인터프리터 언어와 달리 메모리에 모든 프로그램이 올라가고 플랫폼에 종속적이게 됩니다..만 사실상 성능 문제에서 자유롭다는 장점이 크기 때문에 다들 크게 신경쓰지 않습니다.