언어 구현과 컴파일

컴퓨터는 내 코드를 어떻게 알아들을까?

사이에 있는 것

프로그램은 하드웨어 위에 바로 놓이지 않습니다

맨 아래 하드웨어가 알아듣는 말은 기계어뿐입니다. 그 위에 운영체제가 있고, 다시 그 위에 언어를 돌아가게 하는 층이 놓입니다. 내 프로그램은 맨 위에서 돕니다.

교재는 맨 아래 하드웨어를 베어 머신, 바로 위층을 매크로 명령어 인터프리터라고 부릅니다.

방법 셋

알아듣게 하는 방법은 세 가지

언어를 컴퓨터에서 돌아가게 만드는 방법을 구현 방법(implementation method)이라고 합니다. 내가 쓴 코드인 소스 프로그램을 미리 번역하느냐, 바로 실행하느냐로 갈립니다.

컴파일 ① 앞 단계

글자를 조각으로, 조각을 구조로

컴파일(compilation)은 소스를 기계어로 번역하는 일입니다. 먼저 글자들을 어휘 단위로 끊고(어휘 분석), 그 구조를 파스 트리(parse tree)라는 나무로 나타냅니다(구문 분석).

어휘 단위는 뜻이 있는 가장 작은 조각입니다. 나무는 간단히 그린 예시이고 2강, 3강에서 다룹니다.

컴파일 ② 뒤 단계

뜻을 확인하고 기계어를 만듭니다

의미 분석에서 타입을 검사하고 중간 코드(소스와 기계어의 중간 형태)를 만듭니다. 최적화로 군더더기를 덜고, 코드 생성에서 기계어를 내놓습니다. 번역은 느리지만 미리 다 해 두어 실행은 빠릅니다.

심벌 테이블(symbol table)의 내용은 예시입니다.

앞과 뒤

컴파일 앞뒤에도 할 일이 있습니다

컴파일 전에 전처리기(preprocessor)가 소스의 글자를 바꿔 놓습니다. 컴파일 뒤에는 필요한 코드를 이어 붙이는 링킹(linking)과 메모리에 올리는 로딩(loading)을 거쳐야 실행됩니다.

지시문은 C에서 #include처럼 #으로 시작하는 줄입니다. 컴파일러가 낸 기계어를 목적 코드, 실행 파일을 로드 모듈이라고도 합니다.

다음 편

번역을 건너뛰고 바로 실행할 수는 없을까요?

9편번역 없이 바로 실행하면? 1강 목록