Game!



메모리의 구조를 통해 프로그램 완성 과정에 대해 이해하여 보자


< 스택의 관점에서 쓰여졌습니다 >








프로그램 완성 과정에 대해 이해하기 전에, 메모리 구조를 먼저 살펴봅시다.





코드 영역 : 소스코드


스택 영역 : 지역변수 (메모리 크기가 결정되어 있는 요소들)

cf) 메모리 구조의 스택과 자료구조의 스택은 전혀 별개!

데이터 영역 : static, 전역변수 (메모리 크기가 결정되어 있는 요소들)


힙 영역 : 동적할당








사진 출처 : http://windy.tistory.com/




기본적인 프로그램이 만들어지는 과정 입니다.




짚고 넘어가야 할 부분 !


1. 프로그램 작성 -> 2. 컴파일 -> 3. 링크 과정까지는 빌드 과정입니다! (컴파일러 역할 : 기계어로 번역)

그래서 할당되지 않습니다.



4. 실행파일 생성 후, 우리가 F5 를 누르는 행위, 게임 시작 등의 행위를 하면 램에 실행파일이 올라가서 실행이 됩니다.

이때 ! 기계어로 번역된 명령어를 통해 메모리에 할당이 되는 것입니다




1. 프로그램 작성 부분은 우리가 흔히 하는 비주얼스튜디오를 켜서 문법에 맞게 코드를 만드는 것입니다.



여기서 주목해야 할 부분은 2. 컴파일 부분 입니다.


컴파일 시간에는 소스코드를 해석하면서 기계어로 번역을 합니다.


기계어로 번역된 것은 명령어로 적혀있습니다.


그리고 마지막에 .obj 확장자로 목적(오브젝트)파일이 만들어집니다.


이 오브젝트 파일은 실행가능한 파일이 아닙니다. 실제 어떤 코드인지는 알 수없고,

그냥 기계어로 명령어만 적혀있습니다



★ 메인 함수도 함수 !! 메인문에 적혀있는 변수들도 "지역변수" 입니다



예시 1.



컴파일러가 컴파일 시간에서, 소스코드를 해석하고 있는데


함수 안에 int num = 5; 라는 지역변수 문장을 만났습니다.


그러면 컴파일러는 


"메모리 구조인 스택에 int(4바이트)의 메모리를 할당하고, 이 메모리에 num이라는 이름을 붙이세요"

라는 명령이 기계어로 적히게 됩니다.



참고)

int num = 5; 라는 문장에서 = 5 , 즉 num 에 5 가 대입되는 것은 런타임(프로그램 실행도중) 때, 대입됩니다!





예시 2.


컴파일러가 컴파일 시간에서, 소스코드를 해석하고 있는데


함수 안에서 char arr[20]; 이라는 지역변수 문장을 만났습니다.


그러면 컴파일러는 


"메모리 구조인 스택에 char(1바이트)의 메모리를 20개 연결해서 할당하고, 첫 주소값에 arr이라는 이름을 붙이세요"

라는 명령이 기계어로 적히게 됩니다. 


!!명령어만 적힙니다!!



★ 중요한 점 ★

char arr[20]; 에서 배열의 크기는 꼭 상수여야 합니다! 


//char arr[num]; //에러!!


왜냐하면, 컴파일 시에 메모리의 종류와 사이즈를 스택에 할당하라는 명령을 적어야하는데


사이즈를 변수(num)로 하면, num의 값인 사이즈는 런타임때 결정되기 때문에


즉, 컴파일은 사이즈가 얼마인지 알 수 없습니다. 그래서 명령어에 적을 수 없으므로 에러가 뜨게됩니다!!


만약 배열의 크기를 변수를 통해 만들고싶으면 동적할당 을 사용하시면 됩니다!





예시 3.


컴파일러가 컴파일 시간에서, 소스코드를 해석하고 있는데


함수 안에서 static int a = 3; 이라는 전역변수 문장을 만났습니다.


그러면 컴파일은



"메모리 구조인 데이터에 int(4바이트)의 메모리를 할당하고, 이 메모리에 a라는 이름을 붙이세요"

라는 명령이 기계어로 적히게 됩니다.






3. 링크 과정에서는 함수 구현 코드를 명령어로 번역한 오브젝트 파일과, 앞에서 컴파일한 오브젝트를 연결하는 작업입니다.


즉, 두 목적파일을 연결하는 과정입니다

'CS' 카테고리의 다른 글

컴퓨터와 프로그램 메모리  (0) 2022.05.02
배열 할당 : 메모리 상태  (0) 2015.11.06