Python must be a DLL … そうでしたっけか

pythonXX.dll とリンクすることに違和感はなく、そういうことではなくその理由付けのはなし。

Python C API を使ったいわゆる「埋め込み Python」は linux/Windows ともに一通りやってるんだけど、そういえば Python 全体を抱え込んだり、静的リンクを試みようとしたことはなかったな。

Python 3.4 翻訳の話です。

「Windows 上の Python FAQ」に少し未訳が残っていたので訳そうとしてたんだけど、

Do _not_ build Python into your .exe file directly. On Windows, Python must be a DLL to handle importing modules that are themselves DLL’s.

ん? そうだっけ?

DLL を動的ロードするのに必要な要件を満足するのに Python がいつでも pythonXX.dll でねばならぬ、と言ってるわけなんだけれど、「DLL でないと DLL をダイナミックにロード出来ない」理由が今ひとつ思い当たるものがない。なんかあったっけか? 「自分の名前」とか「自分のハンドル(HINSTANCE)」が必要だから、というのはそんなには理由にならなくて、たぶんどうにでもなる。それ以外になんかあったかなぁ? あるいはあれか。DLL お決まりのスタートアップコード(DLLMain だっけ?)に依存した処理なのかいね。

まぁいいか…。こんなもん「受け容れてください」以上のもんではないし。












18:30 追記
このパラグラフに続く2つの翻訳が誤っていた。Windows プログラミングを知らない(かつ C も多分知らない)人が翻訳してしまったのだろう、load-time/run-time を「静的/動的」と誤訳してしまっていた。今直したけれど、単に「load-time/run-time」と英語に戻しただけ。

Transifex では「コメント」を入れれるので(本当はレビュー用みたいだが)そこに:

Load-time / Run-time は動的・静的の違いを表すのではない。動的・静的ならば Dynamic/Static である。

Load-time では、OS の「ローダが」DLL のロードを行うので、DLL 不在時に「DLLが存在しない」旨のエラーを起こす。Run-time では LoadLibrary で明示的に「アプリケーション自身が」ロードを行うので、エラー処理の責任はアプリケーションにある。

一方、「Dynamic Link」とは、「DLL として分割されたライブラリ」をリンクすることそのもの。「Static Link」はリンクする相手はもはや DLL ではなく、これとリンクするとライブラリは EXE 内に「埋め込まれる」。

Python の「.lib」「.dll」の前者の「.lib」は直後の説明がまさにそうしているように、「DLL をロードするためのライブラリ」(インポートライブラリ)であって、「static library」のそれとはまったくの別物。(つまり実効コードを一切含まない、ただのシンボルテーブル。)

Load-time / Run-time は訳さないほうが良い。のでそう修正しておく。

と入れておいた。