Program Execution 관련 System Software
- 컴파일러: 고급 언어 프로그램을 기계로 번역
- 어셈블러: 어셈블리어 프로그램을 기계어 프로그램으로 번역(ex: MIPS)
- 링커: 여러 object file 및 library file을 하나의 executable file로 묶음
- 로더: executable file 및 object file을 메모리에 올림
- 상용 컴파일러 소프트웨어(gcc, visual c)가 컴파일러, 어셈블러 링커 등을 포함하므로 해당 소프트웨어를 사용하여 소스 파일 → 실행 파일 변환 한 번에 가능
- 로더 기능은 유닉스, 윈도우 등의 운영체제에 포함되어 수행
Programming Language
1. 고급 언어(High Level Language)
- 인간이 이해하기 가장 쉬운 언어(=자연어에 가까움)
- machine independent
- machine language/assembly language로 변환시켜 주는 compiler나 interpreter 등의 소프트웨어 필요
- ex) BASIC, C, JAVA, C++, etc.
2. 어셈블리어(Assembly Language)
- 0과 1의 조합을 상징적인 코드로 변환하여 인간의 이해도를 향상시킨 언어
- 기계어와 1대 1로 mapping(↔ 고급 언어 한 문장은 어셈블리어나 기계어 여러 문장으로 변환)
- machine dependent
3. 기계어(Machine Language)
- 컴퓨터가 직접 이해할 수 있는 언어
- machine dependent
- 0과 1로 구성됨
Separate Compile(부분 컴파일)
one.c
- 컴파일은 되지만 실행 불가(func() 함수가 선언되어 있지 않으므로)
two.c
- main 함수가 없으므로 실행이 무의미하지만(a, b가 선언되어 있지 않으므로 사용 불가할 것) 컴파일 가능
↓
one.c와 two.c를 묶어서 실행
- two.c 에 func() 함수가 정의되어 있으므로 one.c에서 func() 사용 가능
- one.c에 a, b가 선언되어 있으므로 two.c 에서 a, b 선언 가능
extern
해당 변수나 함수가 외부에 정의되어 있음을 표시
외부에 정의된 것을 가져다 쓸 것이므로, 현재 파일에 정의가 없어도 일단 컴파일이 가능해짐
※ one.c의 static int c = 5; 를 int c = 5;로 변경한다면?
two.c 와 링크하여 실행하면 c가 2번 정의되었으므로 오류
static int c라면 one.c에서만 사용되는 c임을 의미하므로(해당 파일 내에서만 참조 가능) two.c와 링크해도 오류가 발생하지 않는다.
Symbol Table
컴파일러는 object 파일을 만들 때 symbol table을 유지한다. 함수를 호출하면 이와 관련된 메모리 주소들을 이 symbol table에 유지하다 함수return 시 이 symbol들을 주소 값으로 치환하게 되는데, 위의 경우 file.c에 정의되어 있는 x나 y 같은 변수들은 그 주소를 알 수 있는 반면 z(extern int)의 주소는 알 수 없다.
이때 file.c를 다른 파일과 링크하게 되면 비어 있었던 z의 주소를 찾을 수 있으므로, 온전한 실행 파일을 만들 수 있다.
'보관 > 시스템 소프트웨어' 카테고리의 다른 글
vi editor (0) | 2024.12.06 |
---|---|
System Software and Program Execution(2) (0) | 2024.10.17 |
Procedure Call in MIPS(3) (0) | 2024.10.16 |
Procedure Call in MIPS(2) (0) | 2024.10.16 |
Procedure Call in MIPS(1) (0) | 2024.10.16 |