본문 바로가기
about COMPUTER/컴퓨터 시스템

# 04. 프로그램 컴파일 과정 (고급언어가 실행되기 까지)

by saniii 2020. 10. 15.

[ 고급 언어의 기계어 변환 및 실행 ]

 

# 프로그램 빌드 과정 / 컴파일 과정

 

 

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를 만들어 프로그램을 수행시킬 수 있도록 한다.

// 로더는 컴퓨터 내부로 정보를 들여오거나 로드 모듈을 디스크 등의

   보조기억장치로부터 주 기억장치에 적재하는 시스템 솦웨어

** 고급언어 : 인간이 이해하기 가장 쉬운 언어

** 어셈블리 언어: 01의 조합을 상징적인 코드로 변환하여 인간의 이해도를 향상

** 기계어 : 01의 조합으로 이루어져 있으며 컴퓨터가 직접 이해 가능한 언어

 

+ 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 

 

 

 

댓글