Chapter 01 컴퓨터 시스템으로의 여행

1.1 정보는 비트와 컨텍스트로 이루어진다.

C 프로그램은 프로그래머가 에디터로 작성한 소스 프로그램으로 생명을 시작하며, 텍스트 파일로 저장된다. 소스 프로그램은 0또는 1로 표시되는 비트들의 연속이며, 바이트라는 8비트 단위로 구성된다. 각 바이트는 프로그램의 텍스트 문자를 나타낸다.

아스키 문자들로만 이루어진 파일들은 텍스트 파일들은 텍스트 파일이라고 부른다. 다른 모든 파일들은 바이너리 파일이라고 한다.

1.2 프로그램은 다른 프로그램에 의해 다른 형태로 번역된다.

소스파일은 인간이 그 형태로 바로 이해하고 읽을 수 있기 때문에 고급 C 프로그램으로 일생을 시작한다. 그러나 시스템에서 실행시키려면, 각 C 문장들은 다른 프로그램들에 의해 저급 기계어 인스트럭션들로 번역되어야 한다. 이 인스트럭션들은 실행가능 목적 프로그램이라고 하는 형태로 합쳐져서 바이너리 디스크 파일로 저장된다. 목적프로그램은 실행가능 목적 파일이라고도 부른다.

gcc 컴파일러는 소스파일을 읽어서 실행파일로 번역한다. 번역은 4개의 단계를 거쳐서 실행되는 데, 이 네 단계를 싱행하는 프로그램들(전처리기, 컴파일러, 어셈블러, 링커)을 합쳐서 컴파일 시스템이라고 부른다.

Untitled

전처리 단계

전처리기는 C프로그램을 #문자로 시작하는 디렉티브(directive)에 따라 수정한다. 예를 들어 #include <stdio.h>는 전처리기에게 시스템 헤더 파일인 stdio.h를 프로그램 문장에 직접 삽입하라고 지시한다. 그 결과 확장자가 .i 인 새로운 C 프로그램이 생성된다.

컴파일 단계

컴파일러는 전처리기가 생성한 텍스트 파일 ( .i ) 을 텍스트 파일인 ( .s ) 로 변역하며, 이 파일에는 어셈블리어 프로그램이 저장된다. 어셈블리어는 여러 상위수준 언어의 컴파일러들을 위한 공통의 출력 언어를 제공하기 때문에 유용하다.

어셈블리 단계

어셈블러가 텍스트 파일( .s ) 을 기계어 인스트럭션으로 번역하고, 이들을 재배치 가능 목적프로그램의 현태로 묶어서 ( .o ) 라는 목적파일에 그 결과를 저장한다. 이 파일은 main함수의 인스트럭션들을 인코딩 하기 위한 17바이트를 포함하는 바이너리 파일이다.

링크 단계

프로그램이 C컴파일러에서 제공하는 표준 C 라이브러리에 들어 있는 함수를 호출하는 것에 주목할 필요가 있다. 함수는 이미 컴파일된 별도의 목적파일에 들어 있으며, 이 파일은 목적파일과 어떤 형태로든 결합 되어야 한다. 링커 프로그램이 이 통합작업을 수행한다. 그 결과로 파일은 실행가능 목적파일(즉, 실행파일)로 메모리에 적재되어 시스템에 의해 실행된다.

1.3 컴파일 시스템이 어떻게 동작하는지 이해하는 것은 중요하다.

hello world! 를 출력하는 간단한 프로그램의 경우 컴파일 시스템이 정확하고 효율적인 기계어 코드를 만들어 줄 거라고 기대할 수 있다.