作者:黄兢成
链接:https://www.zhihu.com/question/27656256/answer/943130123
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
句柄的英文是 handle。在英文中,有操作、处理、控制之类的意义。作为一个名词时,是指某个中间媒介,通过这个中间媒介可控制、操作某样东西。
这样说有点抽象,举个例子。door handle 是指门把手,通过门把手可以去控制门,但 door handle 并非 door 本身,只是一个中间媒介。又比如 knife handle 是刀柄,通过刀柄可以使用刀。
跟 door handle 类似,我们可以用 file handle 去操作 file, 但 file handle 并非 file 本身。这个 file handle 就被翻译成文件句柄,同理还有各种资源句柄。
计算机领域很多英文词,直接从日常词中引申而来。比如 fork,日常用词就是个叉子,在 unix 中引申成创建新进程(进程分叉了)。socket 日常用词是插座(连起来用于通电),引申成联网的标记信息(连起来用于通信)。英文是很日常,很容易理解的词,有时翻译成中文反而难以理解了。
---------------------------------
句柄这个翻译有点奇怪。据维基百科,句柄 的条目。
David Gries所著的《Compiler Construction for Digital Computer》(1971)有句话
A handle of any sentential form is a leftmost simple phrase.
该书中译本,《数字计算机的编译程序构造》(仲萃豪译, 1976 版)翻译成
任一句型的句柄就是此句型的最左简单短语。
这可能是句柄一词最早的出处。
这里确实是在讨论句子。在这里句柄是个意译的合成词,两个字分拆开,“句柄”中的“柄”,用法就类似于,“刀柄”中的“柄”。用在此处是适当的。
但以后将各种资源 handle, 都翻译成句柄时,就有点滥用了。
---------------------------------
具体到代码实现,handle 通常是某个数字标记,通过标记操作资源。这个标记在不同的场合有不同的叫法,有时叫 ID,有时叫描述符(descriptor)。在 Windows 平台,就叫各种 handle 了。
不要将 handle 简单地理解成编号、索引。比如分配 16 位的索引,再用 8 位密码将 16 位索引加密。之后将 4 位类型、4 位权限、8 位密码、16 位加密索引打包成一个 32 位的整数作为 handle。这时说这个 handle 是索引就有点不适当了。
用 handle 如何操作真正的资源,是实现的细节。handle 通常被实现为整数,也可以被实现成其他类型。
广义来说,指针也是某种 handle,可以操作对象。但实际语境中,指针跟句柄是有区别的。初次接触到 handle (或者 id),很多人会有迷惑,为什么要用 handle,而不直接用指针呢?
- 指针作用太强,可做的事情太多。可做的事情越多,就会越危险。接口设计中,功能刚刚好就够了,并非越多权限越好的。
- handle 通常只是个整数,实现被隐藏起来,假如直接暴露了指针,也就暴露了指针类型(有时也可以暴露 void* 指针作为某种 handle)。用户看到越多细节,其代码就越有可能依赖这些细节。将来情况有变,但又要兼容用户代码,库内部改起来就更麻烦。
- 资源在内部管理,通过 handle 作为中间层,可以有效判断 handle 是否合法,也可以通过权限检查防止某种危险操作。
- handle 通常只是个整数,所有的语言都有整数这种类型,但并非所有语言都有指针。接口只出现整数,方便同一实现绑定到各种语言。