[ 고급 언어의 기계어 변환 및 실행 ]
# 프로그램 빌드 과정 / 컴파일 과정
1) 고급 언어 프로그램(source file)이 컴파일러에 의해 컴파일되어 어셈블리 프로그램으로 변환시킨다.
** 컴파일러 : 고급언어로 작성된 명령어를 기계어로 변환하는 프로그램
2) 어셈블리 프로그램은 어셈블러를 통해 기계어 프로그램(object file)으로 변환된다.
** 어셈블러 : 어셈블리어를 기계로 변역하는 프로그램
** 어셈블리어 : 기계어를 의미있는 단어로 바꾸어 사람들이 이해하기 쉽게 만든 언어
3) 이미 내장되어 있는 기계어 프로그램(object, library file)과 링커를 통해
링킹되어 실행파일(executable file / .exe)이 생성된다.
** 링커 : 여러 object file 및 library file 을 하나의 executable file로 만든다.
** 링커를 통해 많은 모듈 중 한개를 변경할 때 다른 파일들을 재컴파일 할 필요 없이
해당 파일만 재컴파일하고 다시 실행파일을 만들 수 있다.
4) exe파일을 OS의 로더를 통해 메모리에 깔고
이 프로세스에 필요한 context가 생기면서 프로그램이 수행가능해진다.
** 로더 : OS의 한부분으로 메인 메모리에 오브젝트 파일에 있는 내용들을 올리고
context를 만들어 프로그램을 수행시킬 수 있도록 한다.
// 로더는 컴퓨터 내부로 정보를 들여오거나 로드 모듈을 디스크 등의
보조기억장치로부터 주 기억장치에 적재하는 시스템 솦웨어
** 고급언어 : 인간이 이해하기 가장 쉬운 언어
** 어셈블리 언어: 0과 1의 조합을 상징적인 코드로 변환하여 인간의 이해도를 향상
** 기계어 : 0과 1의 조합으로 이루어져 있으며 컴퓨터가 직접 이해 가능한 언어
+ executable file이 잘 실행되면 각 함수의 변수가 빠짐없이, 중복없이 잘 정의되었다는 뜻.!
+ 큰 프로그램을 만들 때 계속해서 소스파일안에 extern을 이용하면 잘못 선언했을 때 일이 커짐
따라서 헤더파일을 생성하여 만약 선언을 잘못했을 때 관련된 모든 파일을 수정하지 않아도 되도록 한다.
+ <object file>에서 변수, 함수의 위치는 모르지만 type은 알 수 있다.
+ <executable file>에서 변수, 함수등의 위치를 알 수 있다.
↓
+ a.o 파일에서는 a.c에서 정의하지 않고 사용하는 외부변수의 자료형을 알 수 있다.
+ a.o 파일에서는 a.c에서 정의하지 않고 사용하는 외부 변수의 위치를 알 수 없다.
# 전처리기 (c preprocessor)
전처리기는 반복되는 값이나 작업을 미리 정의할 때 사용하며
컴파일 옵션 설정이나 조건부 컴파일도 가능
+ '#' 으로 시작하는 명령문
# library
컴퓨터 프로그램이 사용하는 비위발성 자원의 모임
(구성데이커, 문서, 모움말 자료. 미리작성된 코드, 함수, 클래스, 자료형 등이 있다.)
+ 헤더 파일에는 라이브러리 함수의 선언만 있고
실제 함수의 정의는 라이브러리 파일에 있는 것이 보통이다.
# 컴파일과 링킹의 차이
[ # static linking 과 Dynamic linking ]
+ static linking: 정적 링킹/ 실행파일(.exe)을 만들 때 라이브러리를 포함하여 만든다.
- 실행 파일의 크기가 커짐
- 동일한 라이브러리를 각각의 프로세스가 메모리에 올리므로 메모리 낭비
- 컴파일 시간이 단축됨
- 직접 구현한 코드를 라이브러리화시키므로 기술 유출 방지
+ Dynamic linking: 동적 링킹/ 실행 가능한 목적 파일을 만들 때 프로그램에서 사용하는
모든 라이브러리 모듈을 복사하지 않고 해당 모듈의 주소만을 가지는 것
- 라이브러리가 실행시 link됨
- 라이브러리가 이미 메모리에 있으면 그 루틴의 주소로 가고 없으면 디스크에서 읽어옴
- 계속 점프하기 때문에 성능상 overhead
- 메모리의 요구사항이 적다.
- 버전업된 library를 따로 신경 쓸 필요 없이 사용할 수 있다.
== 두개를 섞어서 사용함 – 링커는 정적 링킹 / 로더는 동적 링킹
[ # Static library 와 Shared library ]
+ Static library : 컴파일 및 링크 시 실행파일 내에 라이브러리 함수가 포함되어 만들어짐
- 정적 라이브러리를 필요로 하는 프로그램의 경우 배포 파일의 사이즈가 커짐
- 실행 속도가 빠르고 배포에 제약이 없음
+ Shared library : 컴파일 및 링크 시 실행파일 내에 라이브러리 함수의 위치 정보만 매핑하여
실행 시 호출되는 시점에 라이브러리 파일로부터 메모리에 적재되어 실행
- 실행파일뿐만 아니라 동일한 라이브러리 파일이 있어야 소프트웨어 실행가능
- 실행시 로드되므로 느림
- 컴파일시 복잡한 초기 bookkeeping작업으로 느리다.
- 많은 프로그램이 동일 라이브러리 호출 시 한 카피만 메모리에 적재되므로 메모리 효율이 좋음
+ a.o 파일에서는 a.c에서 사용한 static library 함수의 코드를 포함하지 않는다.
+ a.out (.exe) 파일에서는 a.c에서 사용하는 shared library의 코드를 포함하지 않는다.
( 정보만 포함되어 실행파일이 메모리에 로드되고 이 함수를 필요로 하면 그제야 호출)
+static library에 있는 함수를 사용하면 링커를 통해 .exe파일에는 삽입, .o에는 삽입X
'about COMPUTER > 컴퓨터 시스템' 카테고리의 다른 글
# 06. 하드웨어와 운영체제(1) / 컴퓨터 시스템 구조 (0) | 2020.10.15 |
---|---|
# 05. 운영체제 OS (0) | 2020.10.15 |
# 03. Procedure Call in MIPS (0) | 2020.10.09 |
# 02. MIPS의 ISA (0) | 2020.10.09 |
# 01. Instruction + ISA (Instruction Set Architecture) (0) | 2020.10.09 |
댓글