프로그래밍

 3198, 1/160 회원가입  로그인  
   dadumvu
   안녕하세요~ C를 다시 공부하고 있는데 함수 호출 원리에 대해 문득 궁금한 점이 생겼어요!

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=2974 [복사]


C에서 함수를 만나면 함수 정의부로 가서 함수를 실행하잖아요

그런데 어쨌거나 저쨌거나 함수 정의부가 소스 하단에 위치하니까 컴파일러 돌릴 때 일단 컴퓨터가 소스 전체를 위에서 아

래로 읽어서(실행은 하지 않고) 함수 정의부가 어디에 위치해 있는지 기억해둔 다음에 나중에 함수를 만나면 그쪽으로 가

서 읽는건가요?;;

그러니까... 질문의 요지는

컴파일을 돌릴때

1. 소스를 다 읽고

2. 함수 정의부가 어디에 있는지 기억

3. 소스를 처음부터 다시 읽음

4. 실행

이런식으로 두번 일하는 건가... 궁금했어요~

죄송합니다 저급한 질문해서 ㅠㅠ

  Hit : 5247     Date : 2011/04/30 04:20



    
T3ddyB34r 음 이거 설명을 어떻게 해야하지... 2011/04/30  
gg0gg0ma vc++ 컴파일러 로 코딩을 하시는거면

디버깅 모드에서 브레이크 포인트를 거신후에 스텝오버로 하나씩하나씩 실행해보면

질문자의 궁금증을 풀수있으실꺼에여 :)
2011/04/30  
Prox 실제 컴파일과정을 예를들어 설명해볼께요


int add(int,int); // 네 이게없으면 에러가나죠.. prototype을 알려주기위해 함수선언!
//int인자 두개를 받고, int결과를 내놓네요

main() {
int i=add(3,5); //호출하는 부분
}

int add(int a, int b) { //정의부분
return a+b;
}


이걸 위에서부터 아래로 1차적으로 컴파일하면.. (어셈블리어지만 매우 간단하게 표현해볼께요)

//(main 시작주소)
push 5
push 3 //push로 인자를 넘겨줍니다
call (add) //함수 호출! 근데아직 이부분을 컴파일하는 순간엔 add의 주소를 모릅니다.
mov [i],eax //결과값을 i에 저장
exit program

//(add 시작주소)
mov eax,인자1 //eax에다가 인자1의 값을 저장하고
add eax,인자2 //eax에다가 인자2를 더하고
return //돌아감 (즉 eax=(인자1)+(인자2)가 됨)


여기까지 컴파일한 다음에는 add의 주소를 알고 있죠?
그래서 아까
call (add) <- 주소를 몰라서 빈칸으로 남겨뒀던 부분을 실제 주소로 채워주고
컴파일을 마무리하면 됩니다. ^^
2011/05/03  
Prox 컴파일러가 굳이 두번 일을 안해도 되는거같죠?
컴파일중에 주소를 모르는 함수를 호출하게되면
"call xxx" 이렇게 컴파일하되, 주소를 나타내는 부분은 일단 빈칸으로 남겨놓고요.
컴파일을 끝까지 진행하면서 여러 함수들의 주소(main,add 등등..)를 따로 기억해놓고
마무리과정에서.. 빈칸으로 남겨두었던 부분만 찾아 메꿔주면 됩니다.
2011/05/03