解读Java中的“垃圾方言”(精辟啊)
发表时间:2023-08-02 来源:明辉站整理相关软件相关文章人气:
[摘要]作者:张洪斌本文选自:开放系统世界——赛迪网2002年09月24日 中国人学电脑,多数情况下是通过看中文版的资料书来学习的。但是有过学电脑,特别是学习程序设计语言经历的读者(包括本人)都会有这样的体...
作者:张洪斌
本文选自:开放系统世界——赛迪网2002年09月24日
中国人学电脑,多数情况下是通过看中文版的资料书来学习的。但是有过学电脑,特别是学习程序设计语言经历的读者(包括本人)都会有这样的体会:中文电脑书拿起来易如反掌,读起来却抓耳挠腮。原因之一就是书中有许多莫名其妙的中文专业术语。当然,它们都是从英文翻译过来的,只是翻译得太晦涩。
在我的记忆里,第一个让我念念不忘且深恶痛绝的中文专业术语是:“良基”。现在可能很少有人知道这个词。那是在我上大学时,在一门和人工智能有关的课程中,老师讲解“良基关系”。所谓“良基关系”就是满足几个条件的关系。我明白这几个条件的意思,当然算学会了“良基关系”,只是不明白为什么叫“良基”不叫“烧鸡”?“良基关系”好象很重要,因为老师“良基”了一个学期。许多年过去了,我现在还记得它。学期末的时候,要交一篇论文。我去查了英文资料,才知道满足那几个条件的关系是Well-Founded(基础良好),意思是设计良好、没有矛盾的关系。
我想我的同学应该和我一样,初见“良基”,一定会感到莫名其妙,相信本文的读者也有同感。因为它不是一个正常的中文名词,中文字典里找不到(可能是有人捏造出来的)。
Java是纯粹面向对象的程序设计语言,类似的语言还有C++等。如果你已经学过面向对象技术,还记得第一次看到“对象”一词的感觉吗?如果你没有学过,那么能看懂下面关于对象的解释吗?
“世界上是由对象组成的。例如人是对象、电脑是对象、猪是对象、泥巴也是对象......”。
上面是大意,是我第一次学习面向对象技术时,一本中文书上的说法。我不明白,所以整个一本书都没有看懂。直到我知道对象翻译自英文的Object(物体),才慢慢学会面向对象技术。上面的说法实际上的意思是:
“世界上是由物体组成的。例如人是物体、电脑是物体、猪是物体、泥巴是物体......”。
中文“专业”垃圾术语有几个特征。其一如“良基”,它是一个字典里和生活中闻所未闻的汉字组合:每个汉字都认识,但是拼在一起就不懂。其二如“对象”,它偏离了英文原意而导致误解,完全是张冠李戴。但是这些中文莫名其妙的术语对应的英文却都是简单的、生活化的英文单词,并非很晦涩。实际上,以我阅读英文资料的体会看,我并不认为有多少“专业”的英文计算机术语。相反,不知道译者出于何种原因,简单的英文单词翻译成中文后,就常常变得扑朔迷离、高深莫测,所以就成了中文“专业”术语。
下面主要以Java语言为例,列出一些中文计算机“术语”和它们对应的英文。
面向对象与Object-Oriented
Object-Oriented的意思是“对象为主的、对象主导的”,而“面向”的同义词是“面对”,丝毫没有主导的含义。此中文术语与“对象”的垃圾特征相同。
本人在业余时间去讲课,我的一个学员在课上嘲笑“对象”,指出“面向对象”也非善类。我从来没有想到质疑“面向对象”,所以突然意识到,很多垃圾已经不知不觉成了我们学识的一部分了。
在此,我把“面向对象”列为本文的头条,以示对这位学员的感谢。
重载/重置与Overload/Override
在我上课讲Overload/Override前,我总是先问这两个单词的中文术语是什么,应该怎么念,结果答案还不止一个。有的说“重载= Overload”,有的说“重载=Override”。一般都把“重载”和“重置”的“重”念成“重新”的“重”。
Overload的原意是“超载”,指几个方法的名字相同,但是方法的参数不同。本人理解其意思可能就是一个名字承担了太多的功能,就像一个人要打几份工伺候几个老板一样,活太多,有些超载了。所以,Overload应该对应“重载”,而“重载”的“重”是“沉重”而不是“重新”的意思。有些书把Overload翻译为“过载”,值得赞扬。
Override的含义和Overwrite相同,其原意是“越过”、“跳过”,即是某事情无效。它在Java中,表示子类的方法覆盖了父类的同名方法。因此我猜测Override对应“重置”,也许是“重新安置”的缩写?所以,“重置”的“重”应该是“重新”的“重”,不是“沉重”的“重”,不要与“重载”混淆了。“重置”和“良基”的垃圾特征相同,“重载”还勉强算个正常名词。唉!每次我讲课,都要嚼半天舌头来解释这两个中文“专业”术语。
函数与Function
函数并非计算机专门术语。在中学时,数学课本上就有了函数一词。坦率地说,直到上大学,才知道“函数=Function(功能)”,不过目前仍然不明白为什么叫“函数”,是音译还是意译?所以虽然我知道它是垃圾,却不知道是哪一类,是“良基”的还是“对象”的,或者是某个垃圾新类型?如果说数学中的“函数”还和“数”多少有点关系的话,它可是和程序设计语言中的Function没有什么字面的关联。也许该把Function翻译为“函码”?
在Java中,可喜的是已经用method(方法)取代Function一词了,所以不必为解释“函数”再费口舌了。
显式/隐式与Explict/Implicit
一看“显式/隐式”,就知道它们和“良基”同类,也是翻遍大字典,都找不到的中文计算机术语。“显式”译自explict,意思是明显地、明白的,例如语句int x= 4的结果是x被赋值4,可以很“明显”地能够看出x被赋初值。而x如果是类的成员,那么int x的结果是x被赋初值0。这种赋初值不太容易看出来,称为“隐式”赋值。隐式译自英文implicit,意思是隐含的、默认的。
线程与Thread
“线程”译自英文的Thread,如果查字典就知道它指“线”,比如缝衣服用的线。衣服上有纵横交错的很多线,好象程序的流程图一样,所以,Thread在英文中比喻程序执行的线路。例如,判断语句如果真,就走流程图的这条“线”,如果为假,那么就走另外一条“线”。因此Multi-Threads指得就是程序在运行时,有几条“线”上的代码同时在运行。而非多线程的程序在流程图上只能有一条线上的代码在运行:一段代码没有执行完,绝对不许执行另外的代码。顺便补充一句,以上的“说文解字”是作者自己的猜测(因此也是原创)。猜测得对不对不知道,但是比喻却与Thread在程序设计中的含义完全吻合。可见,“线程”的垃圾特征与“良基”相同。
数据报文与Datagram
UDP (User Datagram Protocol) 发送的数据称为Datagram。gram是表示重量的“克”,克在实际生活中是很小的重量单位,所以Datagram表示UDP发送接收数据的基本单位。每个Datagram独立发送,彼此没有关联,因此速度快,但是不可靠,所谓“欲速而不达”。
Datagram好象被某些书翻译成“数据报文”,猛一看还以为和拍电报有什么瓜葛呢,这就是作者第一次看到这个中文“术语”时的感觉。
套接字与Socket
网络中的一个著名中文术语是“套接字”,这是个什么“字”?恐怕连第一个造这个“字”的人都不知道。
这个“字”译自英文的Socket,其原意是插座、插孔的意思。当两台电脑通过网络、电缆或者电话线等建立连接,可以互相通讯后,可以想象连接线是插在每个电脑的Socket中,尽管实际上电脑上并没有这样的物理部件。Socket是一种形象的比喻,可看作是实现电脑之间通讯的程序或者方法,和任何“字”都没有关系。
令牌与Token
Token的原意是“标记、记号、标志”。Token在Java的StreamTokenize中大体指流中有意义的内容,例如一个字母、一个数字都是一个Token,但是空格、回车则不是Token。
Token常常被翻译成“令牌”,例如所谓的“令牌网”。这听起来像古代打仗时下达作战命令的“令牌”,此中文与Token的原意有几成相似?
文件/正文/文档/归档与File/Text/Document/Archive
无论中文还是英文,这些术语都是很容易混淆的。
依我的理解,File是“文件”,泛指计算机中存储的信息或者数据。
Text指文件的内容,通常是可以理解的字符,常常翻译为“正文”,但是我不知道“偏文”或者“非正文”是什么。例如本文的内容就是Text。而Text文件属于文件的一种,指其内容大体是可见的字符,没有格式化的信息。
Document大概被翻译为“文档”,它应该算File的一种,常用来说明什么,例如说明书就是Document。这个词在HTML有关的内容中出现的比较多,例如“HTML文档”、“XML文档”等。
Archive的原意是“档案”,含义是有关某个主题、项目的一系列文件,例如中国每个人都有一份人事档案,这一份档案中有不止一份File或者Document。Java中有jar程序,用于压缩文件(一个或者多个),我想它应该是Java Archieve的缩写。我看到有的书把Archieve翻译为“归档”,可是“归档”听起来像动词,例如,“我有一份归档”是什么意思?
在写到这里时,正好听到电视里的一个药厂广告,广告词坚定而庄重:关注生命,健康人类。瞧,它把“健康”当动词用了,跟“归档”可谓半斤八两。
应用/实现与Appliaction/Implementation
这两个词的翻译比前面的“归档”稍好,但是仍然搞错了词性。“应用”和“实现”在正常的汉语中是动词,可是在电脑书中常常当名词。例如“本协议有了不少实现和应用”,是很多电脑书(特别是翻译书)的说法,听起来不太像中国话。正常的语句应该是“本协议有了不少实现方法和实际应用的例子”。
总线与Bus
刚学计算机时就听说电脑有“总线”技术,但是老师和课本一直避而不谈“支线”在哪,直到看到Bus一词,才明白“支线”技术还没被发明出来。
反省、内省与Introspector
Introspector的原意是“向内看、观察和分析内部”,在Java中,它指分析一个类例如JavaBean的内部情况,了解其中有哪些属性、方法和事件。我看到的译文有“反省”和“内省”,听起来像干了坏事做检讨一样。
定制与Customization
“定制”是个著名的中文计算机术语,几乎出现在每本电脑书中。“定制”译自Customization,而与该英文词相关的单词为Customer(顾客、用户)。定制某个东西就是按照用户的要求进行设计,而不是采用一般的或者标准的方法,其实就是“定做”的意思。例如您在裁缝店定做一套西装就是Customization。因为这套衣服是按照您的身材和喜好设计制作的,而到商场买一套就不是Customization。
也许我文化水平有限,当第一次看到中文“定制”时,不知道它的意思就是“定做”。但是我现在还是认为,“定做”比“定制”更通俗、更容易理解。也许这就是为什么大家非要“定制”不要“定做”的原因:不把名词故意弄得莫名其妙,怎么体现出IT技术的高深呢?
子句与Clause
SQL语句中的Where、From部分被称为“子句”,它的英文为Clause。英文语法书称Clause为“从句”,例如以If开始的“条件从句”等,表示从句是组成完整语句的一部分。应该说,“子句”这个中文术语翻译得不错,可是中学学英语时就知道了“从句”,为什么到了电脑领域,非要改个名字叫“子句”?
公开/私有密钥与Public/Private Key
记得在大学学密码学时,就知道了“公开密钥”一词,当时感觉字面上似乎很矛盾,既已“公开”、“密”又在哪里?而“私有密钥”似乎有点罗嗦,既然是“密”,当然就“私有”了。
几乎所有密码学的著作都把Key翻译成“密钥”,但是Key没有“密”的含义,是“密钥”的始作俑者强行加了“密”,可能是为了显示密码学的深奥吧。
会话与Session
术语Session的英文原意是“聚会”或者“开会”。如果某个浏览器在一段时间中持续访问服务器,那么这种情况被称为Session,就好像浏览器和服务器在聚会一样。大致可认为,只要浏览器不关闭,那么就一直是同一个Session,就像不散会,总是在开同一个会一样。关闭浏览器相当于散会,再次启动浏览器相当于开始一次新的会议。
一些中文书将Session翻译成“会话”或者“对话”,例如所谓的“会话Bean”(Session Bean),是否以为开会就是讲话?
表单与Form
中文“表单”译自英文的Form。从字面上看,中文的“表单”好象既指Form,还指Table,其实Form的样子和Table根本不同。后者是“表”,就像数据库的Table一样,是田字型的表格,而Form是调查表、申请表之类的东西,远远没有Table那样规则。
流与Stream
记得在大学时就知道了“流”是关于I/O的,只是不明白为什么是一个字的“流”,老感到“流”是不是比I/O更高级?
流译自Stream,原意是水流。输入和输出实际上是数据的运动。数据从一个地方运动到另外一个地方就像水的流动一样,也许这就是流Stream这个术语名字的来源吧。
应该说“流”是很好的译文,只是我的大学老师没有给我讲“流=Stream”,或者是我上课走了神没听到,反正本人很久以后才明白,多少时光已经无情地“流”逝了。
计算机中如“对象、套接字”之类的中文“垃圾方言”不少。由于本人对中文电脑书通常是“惧而远之”,所以了解的中文垃圾方言较少,受害较浅。我想垃圾术语一定不止本文列出的这十几个。如果哪位读者是“重伤员”,不得不常常与很多垃圾术语搏斗,不妨就为本文写个续吧。
(责任编辑 Sunny)