コーディング奇約 #02 -動きを理解して決めていますか?-
「開放」と「解放」はどちらを使うのか?
プログラミング用語としての「カイホウ」は、「開放」と「解放」と、どっちが正しいんだろう、という話。
英語の「free」も「release」も、ともに対応する日本語は「解放」らしいです。
じゃあ「解放」だろうって? 本当にそうなんだろうか?
「解放」は、ある場所に縛られているものの束縛を解いて、自由に動けるようにすることです。
「開放」は、ある場所を広く開け放って、他のものがそこに入れるようにすることです。
ちなみに、「開放」の英語は「open」のようです。
メモリの「カイホウ」はどうでしょうか。実は、Windows のメモリは、どちらの挙動も行います。
Windows APIには、Alloc / Free 関数と、Lock / Unlock 関数があります。GlobalFree と GlobalUnlock、HeapFree と HeapUnlock、VirtualLock と VirtualUnlock。
余談ですが、面白いことに、それぞれの「Unlock」の意味はどれも違います。
- GlobalUnlock は、メモリアドレスの束縛を解いて、メモリブロックを移動可能にすること。
- HeapUnlock は、ヒープメモリブロックではなくヒープのロックを解いて、そのヒープに対するメモリの割り当て / カイホウを許可すること。
- VirtualUnlock は、その仮想メモリページがページングファイルにスワップアウトされるのを許可すること。
閑話休題。
メモリの Free は、個人的には「開放」の方が近いように思えるのです。しかし、「解放」でも間違いではないかも…と思います。
「開放」の場合、開け放つのは場所ですから、あるメモリアドレスです。一方「解放」の場合は、そのアドレスに存在するオブジェクトを解放するわけです。
この操作は表裏一体で、まずその場所を占めているオブジェクトを「解放」しなければ、その場所自体を「開放」することができません。
しかし、解放されたオブジェクトは、どこかへフラフラ移動してしまうのではなく、そのまま消えてしまいます。地縛霊が成仏するみたいですね(なんという例えか!)。
言葉の違和感は、コンピュータと現実との相違から生まれているようにも思います。
人間は、何かに束縛されているとき、解放されると自由になります。人間が自由であるべきかどうかというのは哲学的に難しい問題なので置いといて、人間には「束縛された状態」と「解放された状態」の2つがあるわけです。
しかし、メモリ上のオブジェクトにはそれがありません。オブジェクトはメモリを離れて存在することはできません。自由な状態がないがために、「解放」という言葉に違和感を感じるわけです。
が、「自由であること」と「束縛されていないこと」はイコールではないと考えれば、直感的ではないものの、納得できないことではありません。
メモリの「カイホウ」が「解放」か「開放」かは、どちらでも間違いではないような気がします。少なくとも、Windows API を使って、まずメモリを確保し、その上にオブジェクトを構築するという手段では。
ただし、生のメモリブロックの確保を意識しない、ガベージコレクタを備えた言語の文脈では、明らかに「解放」が正解です。その場合、プログラマはオブジェクトを「解放」することはあっても、メモリを「開放」することはないからです。
2つ目の余談となりますが、「開放」の訳語が「open」であるというのもなかなか新鮮です。
プログラミングにおける「open」とは、一般的に、「占有的に利用するために開く」場合が多いからですね。