C♭Compiler
- C♭는 한정된 process와 메모리를 사용하는 C언어의 Subset
- C++의 현대적 기능과 구조를 사용 가능한 장점을 가진 언어
- 특히 이 책에서는 X86 계 CPU에서 동작하는 Linux를 Target
- 쉽게 구할 수 있는 Linux S/W
- 쉽게 접할 수 있는 x86계 H/W
- 선행지식
- C♭은 C언어를 바탕으로 하고, 어셈블러를 이해하기 위해서는 C 기본지식 필요
- 컴파일러가 Java로 만들어지므로 compiler의 이해를 위해 Java 기초 지식 필요
- Linux Shell의 기본 커맨드인 cd, ls, cp.mv에 대한 지식
Compiler 란?
- 프로그래밍 된 소스 코드를 다른 형식으로 바꾸어주는 S/W
- Compiler로 소스 코드를 변환하는 과정을 가리켜 Compile이라 부름
- Ex) C언어의 GCC (GNU Compiler Collection), Java의 Javac
- 이 책에서는 한 개의 컴파일러만 설명하게 되며 실제 컴파일러를 만들며 얻은 지식은 다른 언어에서도 유용하게 사용될 것이다.
C♭(C플랫) 컴파일러
- PC용 Linux에서도 동작이 가능하다.
- 가상 소프트웨어나 KNOPPIX등을 사용해 쉽게 리눅스 환경 구축 가능
- 실제로 컴파일 해서 실행해 보는 것이 학습을 돕는다
- C언어로는 컴파일러를 만들기 어렵고, 이해하는 것도 어렵다.
- C언어를 단순화하고 현대적인 기능을 넣어 편하게 만든 언어.
컴파일이란?
Hello.c와 같이 1개의 파일로 한 개의 실행파일을 만들 때는 gcc 명령 한 번으로 끝나지만 내부에서는 4단계를 거치게 된다.
- Preprocess
- (좁은 의미의) Compile
- Assemble
- Link
위의 작업 전체를 Compile이라 하는 경우도 있지만 엄밀하게는 2단계 좁은 의미의 컴파일만이 진짜 ‘compile’이다.
4단계 전체를 합쳐 부를 때는 빌드(Build)라고 한다.
#어셈블 어셈블리 언어란 기계어를 인간이 읽기 쉽게 텍스트 형식으로 변환한 언어
- 어셈블리 소스코드 확장자는 *.S
- 어셈블리 소스 소코드를 어셈블러에 의해 기계어로 변환시키는 과정을 어셈블
- 이 출력 결과물을 Object file 이라 하며 확장자는 *.o
링크
오브젝트 파일을 최종적으로 사용할 수 있게 변환하는 작업
- 라이브러리를 결합시키는 과정이다.