오늘은 컴파일러에 관해서 이야기 해 보도록 하겠습니다.

컴파일러란?
컴퓨터는 멍청합니다.
겉보기의 화려한 UI(User Interface)와는 달리 실제로는 '0'과 '1' 단 두가지만을 알고 있는 녀석입니다.

그러다보니 사람이 컴퓨터에게 어떠어떠한 행동을 하라는 프로그램을 짜 주기 위해서는 '0'과 '1'로 이루어진 기계어로 컴퓨터에게 알려줘야만 합니다. 하지만 사람들이 하고 싶은 이야기를 모두 '0'과 '1'로 표현하자니 프로그램을 짜기 어려운 것은 물론이고, 소스에 문제가 생겼을 때에 어느 지점에서 문제가 생겼는지 아는 것이 사실상 불가능했습니다.

따라서 사람들은 '0'과 '1'의 배열을 약어로 끊어서 'move', 'jump'등의 약어로 적은 뒤 프로그램에 의해서 기계어로 변환을 시켰습니다. 이 프로그램이 어셈블러(assembler)이고, 이 약어들이 규격화되어 어셈블리어 라는 언어가 되었습니다.

그러나 이 명령어들은 기계어들을 축약해 놓은 것에 지나지 않습니다. 위에서 언급했다 시피 컴퓨터는 멍청하기 때문에 기계어로 입력되는 명령어라는 것이 변수 c에  변수 a + b의 값을 저장하라는 명령을 내릴 때에

'너는 c라는 이름의 변수를 생성한 뒤에 a라는 변수의 주소를 따라가서 저장되어 있는 값을 c라고 아까 만든 변수의 주소에 가서 값으로 저장해라. 그리고 b라는 변수의 주소를 따라가서 그 안에 있는 값과 c변수에 있는 값을 더해서 c변수에 저장해라'

정확한 커리큘럼은 아니지만 이런 방식으로 적어주어야 했습니다. 이는 컴퓨터와 같은 멍청한 존재와의 대화 방식이었기에 기계어와 어셈블리어는 저급 언어(Low lever language)라고 불렀습니다. 때문에 사람들은 더 쉽게 프로그램을 작성하기 위해서 또 다른 프로그램을 만들어내기 시작합니다. 예를들어

c = a + b;

라고 프로그램을 짜면 '너는 c라는 이름의 ~'라는 예전의 명령과 동일하게 번역을 해주는 프로그램을 만들었습니다. 이는 'Low level language'에 비해서 훨씬 사람이 이야기하는 방식에 가까운 방식이었으므로 고급 언어(High level language)라 불렸고 사람들에게 널리퍼져 지금까지도 쓰이고 있습니다.
이때 고급 언어를 저급 언어로 번역하는 것을 컴파일이라고 하고, 컴파일을 해주는 프로그램을 '컴파일러'라고 부르게 되었습니다.

따라서 대다수의 프로그램들은 아래와 같은 절차를 통해서 만들어지게 됩니다.

고급언어(프로그래밍 언어)로 쓰여진 프로그램 -> 컴파일러 -> 기계어 프로그램

or

고급언어로 쓰여진 프로그램 -> 컴파일러 -> 어셈블리어 -> 어셈블러 -> 기계어 프로그램

즉 컴파일러는 고급 언어를 저급 언어로 번역을 해주어 컴퓨터가 이해할 수 있게 해주는 프로그램이다. 라고 이해를 하면 될 것 같습니다. 상당수의 컴파일러들은 자체적으로 어셈블러를 가지고 있어서 따로 어셈블러를 이용하지 않고 컴파일 작업을 해서 실행 할 수 있는 파일(윈도우의 경우에는 exe 파일)로 결과 값을주고, 우리는 이 exe 파일을 실행함으로서 작성한 프로그램을 사용할 수 있게 됩니다.

다음번에는 인터프린터에 대한 내용을 가지고 돌아오도록 하겠습니다.
이번 주말까지 컴파일러와 인터프리터의 비교에 대한 내용까지 올릴 생각이니
조만간 또 만나요 ^^

Posted by 청음