우선 내가 이해하고 있는 큰 그림을 적어볼게.
- 소스 코딩
- 컴파일 (전처리포함)
- 어셈블
- 링킹 (사실 어셈블~링킹 부분에 대해 명확히 알지 못함)
- 바이너리 생성!됨! ㅋ
- -------
- 실행함
- data 영역에 binary code (기계어) 올라감
- ir pc 지랄하면서 알아서 섹스함. control u nit하고 alu 하고 섹스함 (몰라 책에서일케읽엇어)
다좋다 이거야.
그런데 api라는거 있잖아.
그건 어디서 해석되는거지?
리눅스/윈도우 서로 다른 C library 를 가지고 있다고 알고있는데
2->3으로 갈때 (소스코드에서 어셈블리어될때) api를 해석해서 api를 호출하는데에다가
군데군데 알아서 assembly를 넣는건가
아니면
3->4 로 갈때 하는건가? (윈도우 dll이 어셈블리인가 아님 기계어인가... 거기서 참조하니까.. 그 dll에 따라 달라지겠군 ?)
글이 많이 장황한가??
그래도 너무 공부하고싶었는데 이제좀알아간다...
알려주라... os의 api는 어디에서 추가됨? 어디서 추가되든 일단 컴파일은 OS에 종속적인거지? api를 쓴다면말이야
api는 무엇인가요? 아니 api는 무엇의 약자입니까?
음...... 그래도모르겠어요 한양대 acm 수상자님 ㅠ
링크할 때 api나 표준 라이브러리의 바이너리파일(이미 컴파일되어 있다)하고 연결되고 표준 라이브로리 파일도 os마다 다르지. 컴파일도 당연히 종속적이니까 크로스컴파일이란 것도 생겼죠.
컴파일 때는 헤더파일만 보고 맞나 확인하고 dll은 프로그램 실행 중에 가져다 연결&해제
감사합니다 너무나 궁금했어요 ㅎㅎㅎ 아 링킹때 하는군요.. 링킹이 뭐하는지 자세히 안봤어서.... 감사함니다 공부열심히할게요!!!
dll 은 다이나믹 링크 라이브러릐 약자엿죠 맞아맞아
acm수상자 나쁜사람....... 코딩하다가 세미콜론빼먹어라....
아 링크할 때 라이브러리의 obj랑 연결한대요.
소스파일을 나눠놨으면 그것도 연결하고
소스파일 나눠놓은건 컴파일때 가져오는걸로 알고있는데요?! 전처리기에서 인클루드를 다 처리하지않나요? 아, 나눈게아니라 같은 프로젝트 안에 있는거 말씀이시겠군요~ 리눅스에서는 makefile로 윈도우에서는 vc가답이곸ㅋㅋ 리눅스를 쓰지않는이상 gcc로하지않는이상 obj의 존재를 알긴힘들죠 . . . .
미안합니다. 술먹고있어서
네 링크때 os의 api가 모여잇는 obj와 링킹시키겠쬬~? 그런데 또 궁금해지는건 필요한 api들만 obj에서 빼갈까요 아니면 그냥 obj자체를 다 넣어버릴까요 ..... 후자면 좀 거시기하지않나요 . !?
괜찮아요... 형님 좀 쉬엄쉬엄공부하세요.. 제가 형님 발톱이라도 닦아드리려면 ... 전 열심히뛰어야합니다..
삼댕님께서 자세히 설명해주셨지만 덧붙혀 설명드리자면 함수A가 있다고 가정합시다. 아주 간단히 말하면 ^^; 컴파일타임에는 함수A의 프로토 타입만보고 컴파일을 하지만 함수 A에서 어떤 내용의 코드를 실행하는지 모릅니다. 함수 A에서 createwindow함수를 실행한다고 가정합시다
ABI에 대해서 알아보는게 좋을 듯 하다
API만 있는게 아니라 ABI도 있어
그러면 소스코드를 컴파일 한 목적코드 즉 오브젝트코드에서는 링크타임에 그 함수A의 내용인 createwindow함수의 구현부와 목적코드를 링크해서 최종적으로 기계어로 만듭니다. 링크에는 모든 곳을 한번에 링크하여 연결하는 정적링크 방식이 있고 그때그때 필요한 동적링크 방식이 있습니다 자바의 jvm같은 경우 바이트코드를 바이너리코드로 바꾸는 과정에서
동적링크 방식을 사용하는 걸로 알고있는데 c스타일은 네이티브를 바로 기계어로 바꾸는거라 저도 이 부분은 자세히 모르지만 정적 링크 비중이 높을거라 생각되네요. 그래서 결론은 api와의 결합은 컴파일이 끝나고 링크타임에서 결정된다는 거네요. 술을 마셔서....
정정합니다. jvm은 바이트코드를 네이티브로 입니다.