메모리의 구조과 프로그램 완성과정2015. 6. 3. 19:03
메모리의 구조를 통해 프로그램 완성 과정에 대해 이해하여 보자
< 스택의 관점에서 쓰여졌습니다 >
프로그램 완성 과정에 대해 이해하기 전에, 메모리 구조를 먼저 살펴봅시다.
코드 영역 : 소스코드
스택 영역 : 지역변수 (메모리 크기가 결정되어 있는 요소들)
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 |