Windows 프로그래밍
Windows 프로그래밍 (Windows Programming)
D 언어는 Windows에서도 32비트 MSCOFF와 64비트 MSCOFF 프로그램, 콘솔 프로그램, GUI 프로그램, 그리고 DLL까지 폭넓게 지원해요. 이 장은 그중에서도 Windows 프로그래밍을 어떤 식으로 잡아가는지, 콘솔 프로그램의 시작점이 어떻게 만들어지는지를 중심으로 설명할게요.
본문
이 장은 32비트 MSCOFF, 64비트 MSCOFF, 콘솔 프로그램, GUI 프로그램, 그리고 DLL을 다루는 Windows 프로그래밍에 관한 내용이에요.
모든 콘솔 프로그램 (All Console Programs)
D 콘솔 프로그램은 D 링키지(linkage)를 가진 함수를 모듈 레벨에 main이라는 이름으로 두는 방식으로 지정돼요. 컴파일러가 이것을 발견하면 core.internal.entrypoint._d_cmain 믹스인 템플릿이 추가되도록 트리거되는 거죠. 그 _d_cmain 템플릿은 다음과 같은 모습이에요.
template _d_cmain()
{
extern(C)
{
int _d_run_main(int argc, char **argv, void* mainFunc);
int _Dmain(char[][] args);
int main(int argc, char **argv)
{
return _d_run_main(argc, argv, &_Dmain);
}
// Solaris는 알 수 없는 이유로 main()과 _main()을 모두 요구한다
version (Solaris)
{
int _main(int argc, char** argv)
{
return main(argc, argv);
}
}
}
}
그 안에 있는 main 함수는 extern(C)로 표시되어 있기 때문에, C 콘솔 프로그램의 엔트리 포인트가 돼요. 실행 파일은 C 실행 파일로 시작해서, C 런타임 라이브러리가 초기화된 다음에 C main() 함수가 호출되는 흐름을 타요.
C 런타임 라이브러리는 초기화 과정에서, 그리고 C main()을 호출하기 전에 pragma(crt_constructor)로 표시된 모든 D 함수를 실행해요. 이 함수들이 실행되는 순서는 따로 정해져 있지 않아요.
그다음 C main 함수는 D 런타임 라이브러리의 _d_run_main 함수를 호출하면서 argc와 argv, 그리고 _Dmain의 주소를 넘겨줘요. 컴파일러는 소스 코드에 있는 D main 함수를 _Dmain으로 이름을 바꾼답니다.
_d_run_main은 그제서야 D 런타임 라이브러리를 초기화하고, argc와 argv를 args로 변환한 뒤, D main 함수를 호출해요.
D main 함수가 반환되면 제어권은 다시 _d_run_main에게 돌아오고, 여기서 D 런타임 라이브러리를 종료한 뒤 C main으로 돌아가요. 그러면 다시 C 라이브러리가 C 런타임 라이브러리를 종료하고 프로그램을 끝내는 구조예요.
C 런타임 라이브러리는 종료 과정에서 pragma(crt_destructor)로 표시된 모든 D 함수를, pragma(crt_constructor)들이 실행됐던 순서의 역순으로 실행해요.
Windows 32비트·64비트 MSCOFF 프로그램 (Windows 32 and 64 bit MSCOFF Programs)
32비트와 64비트 MSCOFF 프로그램은 Associated C Compiler로 Microsoft Visual C/C++ 컴파일러를 사용하고, 오브젝트 파일을 MSCOFF 형식으로 생성하며, Microsoft 링커로 링크해요.
콘솔 프로그램 (Console Programs)
Windows GUI 프로그램 (Windows GUI Programs)
DLLs
더 알아보기 (Learn more)
이 장은 공식 D 언어 사양의 'Windows Programming' 챕터를 한국어로 번역한 자료예요. 콘솔 프로그램의 생성과 시작점, .exe가 아닌 DLL 형태로의 배포까지 Windows에서 D를 쓰는 전반적인 그림을 이해하는 데 도움이 되어요.