컴퓨터 cpu는 0, 1에 대해서만 처리할 수 있다는 것을 알고 계신가요 ?
그것은 사실이며 컴퓨터가 이해할 수 있는 유일한 신호입니다.
0 과 1 로 이루어진 언어를 기계어라고 합니다. 아주 오래전 컴퓨터가 최초로 만들어진 시기에는 0 과 1 조합으로 프로그램을 작성하기도 하였습니다.
사람이 작성한 프로그래밍언어를 컴퓨터가 이해할 수 있는 기계어로 번역해주는 과정인 컴파일, 그리고 이를 수행하는 컴파일러, 인터프리터에 대해 쉽게 알아보겠습니다.
컴파일러와 인터프리터는 뭘까요 ?
컴파일러(Compiler) 는 많이 들어보았는데 인터프리터(Interpreter)는 생소할 수 있습니다.
컴파일러와 인터프리터는 프로그래밍 언어를 컴퓨터가 이해할 수 있는 기계어로 번역한다는 점은 비슷할 수 있습니다. 다시 말해 (프로그래밍 언어 == 고급언어)는 컴퓨터가 이해하지 못합니다.
print("Hello world!!")
그러면 화면에 "Hello world!!" 라는 문구를 출력시킬때 사용된 (고급언어 == 코드)를 컴퓨터는 어떻게 이해하고 결과를 출력 해주는 걸까요?
여기서 컴파일러와 인터프리터의 개념이 사용될 수 있습니다.
컴파일러는 우리가 작성한 코드 = 고급언어 를 컴퓨터가 이해할 수 있는 기계어로 번역, 바꿔주는 역할을 합니다.
프로그래밍 언어에서 기계어로 바꿔주는 과정에서 assemble 어셈블을 거치게 되는데 여기서 문제가 발생합니다.
어셈블리어는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어입니다. 그리고 컴퓨터 구조에 따라 사용하는 기계어가 달라지며, 기계어에 대응되어 만들어 지는 어셈블리어도 각각 다르게 됩니다. 다시 말해 새로운 아키텍쳐가 적용된 CPU가 나올때 마다 매번 그에 맞는 어셈블리어로 다시 작성해야 했으며 이로인해 통일된 언어체계가 필요해진 것이며 저희가 아는 C, C++ 등의 고급언어가 나오게 된 것입니다. 하지만 컴퓨터는 이 고급 언어를 바로 이해하지 못하여 번역, 바꿔주는 과정이 필요했고 이가 컴파일 입니다.
컴파일 과정에는 2가지의 방식(Compiler, Interpreter)이 있습니다.
컴파일러(compiler)는 전체를 스캔 후 실행 가능한 코드로 컴파일 뒤 실행파일을 생성시킵니다. 이때 코드들의 명령들을 순서에 맞게 프로세서에 전달하여 최적화를 시킵니다.
장점은 컴파일의 속도는 빠르지 않을 수 있지만 컴파일을 마친 실행파일은 더 빠르게 실행됩니다. 그러므로 규모가 큰 경우에는 효과적입니다. (뒤에서 다루겠지만 인터프리터는 한 줄씩 이해하고 실행합니다) 그리고 컴파일 후 생성된 실행코드는 더 효과적이고 최적화되어 있습니다.
단점은 컴파일된 파일은 운영체제에 의존적입니다. 즉 Window, Mac, Linux 에 따라 다시 컴파일을 해야할 수 있습니다. 그리고 개발, 버그를 수정하는 과정에서 더 많은 노력이 필요할 수 있습니다. (코드가 바뀔때 마다 다시 컴파일을 해야하므로) 이러한 compiler 를 사용하는 언어는 C, C++, 등이 있습니다.
인터프리터(Interpreter)는 코드를 한 줄씩 번역하고 전달, 실행이 됩니다. 이는 코드가 끝날 때까지 실행되며 작업 중 에러 발생시 중지되며 에러를 표시합니다. 그러므로 개발자는 에러가 난 부분을 비교적 쉽게 파악할 수 있습니다. 그리고 추가적인 실행파일을 생성하지 않습니다.
장점은 에러발생 시 쉽게 수정이 가능하다는 점이 있습니다.
단점은 한 줄씩 번역하고 전달, 실행이 되다보니 코드 규모가 클 경우 컴파일에 비해 비교적 느립니다.
이러한 Interpreter를 사용하는 언어는 Python, Javascript 등이 있습니다.
이렇게 컴파일, 컴파일러, 인터프리터에 대해서 알아보았습니다. 컴파일러, 인터프리터가 비슷해 보이면서도 서로 확연하게 다르다는 것을 알 수 있었습니다. 둘 사이의 가장 큰 차이점은 실행파일을 생성하는 것에 있는 것 같습니다.
코딩을 할때에는 크게 신경을 쓰지 않는 부분이 될 수 있지만 컴파일 과정이 가지는 장단점에 대해 이해하고 코드를 구현하는 것도 좋은 개발자가 되는 방법 중 하나라고 생각됩니다.
참고 : https://cbw1030.tistory.com/276 , https://developer.mozilla.org/ko/docs/Glossary/Compile