C 언어는 무엇으로 만드나
일단 우리가 생각해 보아야 할 것은 "언어"가 실체인가 하는 점입니다. "너 영어 좀 하냐?", "난 국어는 제대로 알아요", "불어로 써봐" 등 일상의 표현에서는 마치 언어가 실제로 존재하는 대상 같습니다. 하지만 "그럼 국어는 도대체 어디에 있니?"라고 질문을 하게 되면 우리는 막막해 집니다. 국어사전에? 어문규정에? 문법책에? 우리 머리 속에? 아니면 이걸 모두 합한 것이 국어인가? C언어라는 것도 비슷한 면이 있습니다. 차이가 있다면 C 언어는 인공언어(Artificial Language)이기 때문에 규칙이 명확하다는 점 뿐이죠. 우리는 컴퓨터에서, 프로그래밍 언어와 그 언어의 구현(보통은 컴파일러), 그리고 그 언어로 표현된 소스코드, 이 세가지를 개념적으로 구분해야 합니다.
따라서, C언어는 C언어라는 추상적인 개념일 뿐, 어떤 프로그램이나 소스가 아닙니다. C언어는 문서로 정리하여 표준으로 인정받는 것으로 끝이며, C언어는 사람의 머리로 만듭니다. 사실 이 질문은 한국어는 무엇으로 만드나? 하는 질문과 같습니다. 한국어를 처음 만들 때 다른 언어를 통해 한국어를 정의한 것은 아니겠지요.
C 언어로 작성한 소스코드를 어떻게 실행 프로그램으로 만드나
C 컴파일러를 이용하여 특정 환경(platform)에서 실행할 수 있는 실행프로그램을 만듭니다. c compiler는 c언어로 작성된 소스코드를 읽어서 정해진 결과물(실행파일)을 생성해 내는 프로그램이고, 가장 널리 쓰이는 gcc(GNU C Compiler)의 경우 c언어로 작성되어 있으나, 어떤 언어를 이용해 c compiler를 만들어내어도 무방합니다.
C 컴파일러가 먼저냐, C 언어가 먼저냐
C 컴파일러를 C 언어로 작성한다면, 그럼 C compiler의 소스코드는 누가 compile하여 실행프로그램을 만들어내는지 의문을 갖게 됩니다. gcc의 경우, 거의 모든 플랫폼에 대해 이미 compile된 실행파일 형태의 gcc를 배포합니다. 새로운 platform A가 나타나는 경우, 그 환경에 맞는 실행프로그램을 이미 널리 쓰이는 platform B에서 만들어냅니다. 이것을 두고 cross-platform compile이라고 하는데, 예를 들어 windows용 gcc에서 linux용 gcc를 만들어낼 수 있고, linux용 gcc에서 solaris용 gcc를 만들어낼 수 있습니다.
태초의 C 컴파일러는 누군가 어떻게 만들었을 것 아닌가
cpu가 이해할 수 있는 실행파일, 즉 기계어코드를 거의 곧바로 만들어낼 수 있는 assembler를 이용해 간단한 c compiler를 만든 후, 이것을 이용해 제대로 된 c compiler를 만들어내면 될 것입니다. 아버지의 아버지의 아버지를 거슬러 올라가면 Computer Science/Engineering의 역사를 모두 훑어나가게 될 것입니다. 라고 보통 생각하기 쉽지만, 최초의 C 컴파일러는 켄 톰슨에 의해서 C 언어로 작성되었답니다.
그렇다면 그것은 이론적인 컴파일러겠군요!
그럼 어셈블러는 뭘로 만들었나
위의 최초의 C 컴파일러 예처럼, 모든 프로그래밍 언어는 프로그래밍 언어로 만듭니다. 결국 어셈블러는 어셈블리어, 기계어, C 언어등의 프로그래밍 언어로 만듭니다. 이 경우 최초 1회 닭이 먼저냐 알이 먼저냐와 유사한 문제가 발생하는데 이런 문제를 bootstrapping 문제라고 합니다. 즉, 아직 존재하지 않는 프로그래밍 언어 Z가 있을 때, 프로그래머가 Z문법으로 Z를 프로그래밍 한다면 최초 1회 Z를 어떤 방법으로든 컴퓨터에 메모리에 존재케 한다음 실행시켜서 Z를 생성해 내게 해야 합니다. 현재에는 거의 발생하지 않겠죠. 왜냐하면 이미 다른 프로그래밍 언어들이 많이 존재하니까 그것들을 이용해서 프로그래밍 하면 되니까 말입니다.
기계어란 무엇인가?
기계어란 CPU 라는 복잡한 전기 스위치의 묶음을 제어하기 위한 전기신호를 일련의 0과 1의 적절한 조합으로 나타낸 언어이다. 이 기계어는 CPU가 이해할 수 있기 때문에 (다시 말해, 그대로 CPU의 다리를 통해 신호를 흘려넣어 주기만 하면 되기 때문에) 특별한 번역기 (어셈블러/컴파일러/인터프리터 등)가 필요하지 않다.
그럼 0과1은 뭐로 만들었나
전기로 만들었다. 기본 전압 (0 V라 하자) 보다 높은 전압 (예를 들어, +5 V) 을 1이라 정의하였고, 기본 전압과 동일한 전압을 0이라 한 것이다.