공부하는 스누피
[컴퓨터구조] 프로그램 번역과 실행 과정 본문
1. 컴파일러
- C 프로그램을 어셈블리 언어 프로그램으로 바꾼다.
- 예전에는 어셈블리 언어로 프로그램을 작성하였으나 메모리 성능이 좋아지면서 컴파일러가 어셈블리 언어 프로그램을 직접 생성한다.
2. 어셈블러
- 어셈블리 언어 프로그램을 기계어로 번역한다.
- 어셈블러가 독자적인 명령어를 제공해 번역과 프로그래밍을 간편하게 해줄 수 있는데, 이런 명령어를 의사명령어(pseudoinstruction)라 한다.
ex) ANDI 명령어는 ADD에 I를 붙임으로써 기존 명령어와 형식도 다르고 opcode도 다르다는 것을 상기시킨다. (두 명령어는 수치 피연산자를 사용한다는 점에 있어서 다르다)
- 각 명령어를 이진수로 바꾸기 위해서는 레이블(명령어)에 해당하는 주소를 모두 알아야 한다.
- 사용되는 심벌과 주소를 심벌 테이블(symbol table)에서 찾는다.
=> 심벌 테이블은 알려진 전역변수나 함수의 주소값을 해시 테이블로 저장한다.
3. 링커
- 따로따로 어셈블된 기계어 프로그램을 하나로 연결해주고, 실행 파일을 생성한다.
- 각 루틴마다 컴파일 하는것이 아니라서 더 빠르다.
- 동작
a) 코드와 데이터 모듈을 메모리에 심벌 형태로 올려놓는다.
b) 데이터와 명령어 레이블의 주소를 결정한다.
c) 외부 및 내부 참조를 해결한다.
- 주소를 결정한다는 점에 있어서 에디터와 같은 역할을 해서 링크 에디터라고도 부른다.
4. 로더
- 실행 프로그램을 메인 메모리에 적재해서 실행할 수 있게 해준다.
- UNIX 동작과정
a) 실행 파일 헤더를 읽어서 텍스트와 데이터 세그먼트의 크기를 알아낸다.
b) 텍스트와 데이터가 들어갈 만한 주소 공간을 확보한다.
c) 실행 파일의 명령어와 데이터를 메모리에 복사한다.
d) 메인 프로그램에 전달해야 할 인수가 있으면 스택에 복사한다.
e) 레지스터를 초기화하고 스택 포인터는 사용 가능한 첫 주소를 가리키게 한다.
f) start-up 루틴으로 분기해서 인수를 인수 레지스터에 넣고 메인 루틴을 호출한다. 메인 추틴이 끝나고 start-up 루틴(기동루틴)으로 복귀하면 exit 시스템 호출을 사용하여 프로그램을 종료시킨다.
+ 동적 링크 라이브러리(dynamically linked library, DLL)
프로그램 실행 전에는 라이브러리가 링크되지도 않고 적재되지도 않는다.
링커/로더는 원하는 라이브러리 루틴을 찾을 필요 없이 바로 간접 분기하면 된다.
+ 자바 프로그램 번역과 실행 단계
1. 컴파일러
- 자바 프로그램을 자바 바이트코드 명령어로 컴파일한다.
2. 자바 가상머신(JVM)
- 자바 바이트코드를 실행한다.
- 인터프리터라서 이식성이 좋다. (느리다는 단점이 있다)
3. JIT(just in time) 컴파일러
- 프로그램이 실행되는 동안 번역하는 컴파일러이다.
- 자주 사용되고 있는 메소드가 어디 있는지 찾아낸 후 컴파일한다.
- 자바의 이식성을 유지하면서 실행 속도를 높여준다.
(참고)
David A. Patterson, John L. Hennessy (2018). Computer Organization and Design (ARM Edition)
'CS > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조] 논리회로 (0) | 2020.11.12 |
---|---|
[컴퓨터구조] 부동소수점 (0) | 2020.11.10 |
[컴퓨터구조] 2의 보수 표현법 (two's complement) (0) | 2020.11.07 |
[컴퓨터구조] 계산 문제 모음 (0) | 2020.11.07 |
[컴퓨터구조] 컴퓨터의 구성 요소 (0) | 2020.11.07 |