こんにちは。今回は最も普及しているPythonの処理系CPythonのソースを読んでいるとmain関数を見つけたので、少しだけそのことを書こうと思います。
main関数とは
C言語を書いたことがある人ならば誰でも知っているであろうmain関数。
これはプログラムで始めに実行される関数です。(厳密には違うらしい?)
コマンドの引数などはここで受け取ります。
CPythonはC言語で書かれているのでmain関数があるのは当然なんですが、あれほど大きいプロジェクトでも基礎通りなんだな~と感心したのでこの記事を書こうと思いました。
main関数の実装
CPythonのレポジトリのPrograms/python.cにあります。
/* Minimal main program -- everything is loaded from the library */
#include "Python.h"
#ifdef MS_WINDOWS
int
wmain(int argc, wchar_t **argv)
{
return Py_Main(argc, argv);
}
#else
int
main(int argc, char **argv)
{
return Py_BytesMain(argc, argv);
}
#endif
#ifdef MS_WINDOWS
があるので、Windowsはwmain関数でそれ以外は普通にmain関数が呼ばれるみたいです。
wmainとはワイド文字のコマンドライン引数に対応したmainらしいです。
どうしてこのような実装にしたのかはわからないです...
wmainとmainはそれぞれPy_Main, Py_BytesMain関数を呼び出しているのですが、その内部では両方がコマンドライン引数の情報を_PyArgv構造体に入れてpymain_main関数を実行していました。興味がある方は処理を追ってみてください。
参考