시스템 프로그램의 종류
1. compilation system (번역 시스템)
2. Operating system (운영체제)
3. Runtime system (런타임 시스템)
4. Hardware consideration (하드웨어 고려)
① Compilation System (번역 시스템)
01 언어 계층 구조
번역 시스템의 concept은 언어 계층 구조로, high-level 언어를 기계어로 바꿔주는 시스템이다.
02 전체적인 구조와 6가지 중요 구성요소
1. Editor : 편집기를 사용해서 C 프로그램을 만든다.
- C File : 만들어진 C 프로그램은 input으로 compiler에 들어간다.
2. Compiler : C 프로그램을 어셈블리어로 바꾼다.
- Error Msg : 에러가 있으면 에러 메시지를 출력한다.
- ASM File : 어셈블리어로 바뀐 파일은 input으로 Assembler에 들어간다.
3. Assembler : 어셈블리어를 기계어로 바꾼다.
- Relocatable Object File : 재배치 가능한 오브젝트 파일. Linker에 input으로 들어간다.
4. Linker : 내가 만든 오브젝트 파일과 다른 오브젝트 파일, 라이브러리를 합친다.
- Executable Object File : 수행 가능한 오브젝트 파일. 바이너리 파일(기계어)으로 시스템에 올라가서 수행이 가능하다.
5. Loader : 디스크에 있는 내용을 메모리에 올린다.
- input data → 컴퓨터 프로그램 → results
6. debugger : 수행하고 있는 프로그램의 상태를 체크하고 버그를 잡는다.
03 언어 계층 구조와 번역 시스템의 전체적인 구조 사이의 관계
high-level language : C File
assembly language : ASM File
machine language : Relocatable object file, executable object file
< Relocatable object file과 executable object file >
- 둘 다 binary이다. (이진수로 구성되어 있음)
- Relocatable object file (재배치 가능) : 아직 주소, 외부 참조가 확정되지 않은 상태이다. 즉, 이진수로 만들어지긴 했지만 혼자서는 수행될 수 없고, 언젠가는 재배치되어야 하는 기계어이다.
- executable object file (수행 가능) : 혼자 동적으로 수행이 가능한 기계어이다. 즉, 주소가 결정되어 메인 메모리 상에 어디로 올라갈지도, 외부참조도 결정이 된 상태이다. linking이 완료된 object이다.
04 리눅스에서의 예시
- $ : Shell, 명령어 해석기 (Command Interpreter)
- ls : 사용자가 입력한 명령어를 해석해서 처리한다.
- vi : editor, 편집기를 실행한다.
- gcc : compiler, 컴파일-어셈블-링킹을 모두 한꺼번에 수행한다.
- ./a.out : 실제 a.out을 수행한다. (executable object file은 리눅스 상에서 디폴트로 a.out이라는 이름으로 만들어진다.)
- / : 리눅스에서 디렉토리를 구분할 때 사용한다.
- . : 현재 디렉토리
① vi hello.c
② gcc hello.c
③ ./a.out
→ 리눅스를 사용해서 시스템 프로그래밍을 배우는 이유는 편집기, 컴파일러 등의 시스템 프로그램을 직접 손으로 작성해서 실행해볼 수 있기 때문이다.
① vi hello.c : 편집기 실행
① 수행 후 : hello.c 파일 만들어짐
②-1 gcc -S hello.c : 컴파일만 수행
②-1 수행 후 : hello.s (어셈블리) 파일 만들어짐
②-2 as -o hello.o hello.s : 어셈블러(어셈블리어→기계어)만 수행
②-2 수행 후 : hello.o (재배치 가능한 오브젝트) 파일 만들어짐
②-3 …./collect2/…. : 링커만 수행
②-3 수행 후 : a.out (실행 가능한 오브젝트) 파일 만들어짐
③ ./a.out : a.out 실행
Q1) hello.c와 hello.s의 차이점은?
- .c는 high-level 언어이고, .s는 어셈블리 언어이다. 즉, 언어 계층구조의 차이가 있다.
Q2) hello.o와 a.out의 차이점은?
-.o는 재배치 가능한 기계어이고, a.out은 실행 가능한 기계어이다.