匈牙利命名法鼻祖---查尔斯·西蒙尼

匈牙利命名法鼻祖---查尔斯·西蒙尼_第1张图片

生平简介

1948年9月10日,查尔斯•西蒙尼Charles Simonyi)出生于匈牙利布达佩斯。上高中时,他开始接触计算机和编程,父亲安排他给一名从事计算机工作的工程师当助手,当时计算机在匈牙利屈指可数。

1966年,查尔斯高中毕业,同时也完成了他的第一个编译器。凭借开发编译器时积累的经验,他在丹麦哥本哈根的A/S Regnecentralen公司谋得了一个职位。1968年,他离开丹麦进入美国加州大学伯克利分校学习,并于1972年获得理学学士学位,1977年获得斯坦福大学博士学位。西蒙尼曾先后在加州大学伯克利分校计算机中心、伯克利计算机公司、ILLIAC 4项目和施乐PARC工作。在施乐公司,他开发了Alto个人电脑的Bravo和Bravo X程序。

西蒙尼从1981年进入微软,直到2002年离开,当时他在微软公司的头衔是应用开发总监、首席架构师。在微软期间,西蒙尼招聘和管理的开发团队创造了很多最畅销的软件,包括Microsoft Word、Microsoft Excel等。西蒙尼于2002年创办了Intentional Software,目前担任该公司主席和CTO。这家公司的宗旨是创造能加速软件设计的技术,让商务人士即使不熟悉电脑术语,也能清楚地描述需求。

在工作以外,西蒙尼表现出对航天旅行的极大兴趣,并于2006年9月在俄罗斯星城接受训练。2007年4月7日,他与两位俄罗斯宇航员一起搭载联盟TMA-10飞船前往国际空间站,并于21日返回地球。4月9日到达国际空间站的时候,西蒙尼说:“黑暗天空中的一切都令人惊叹,非常非常激动人心。就像一个巨大的舞台布景,有许多不可思议的歌剧或现代剧的奇妙演出。当我说我彻底折服的时候,就是现在这个样子。”两年后,即2009年3月,西蒙尼再次进行了太空旅行,重游国际空间站。

编程风格由来

采访者:你的编程风格主要受谁的影响?
西蒙尼:影响主要来自两方面,一位匈牙利工程师,一台我在丹麦工作时用的计算机。

我在匈牙利的导师是一位使用Ural II计算机工作的工程师。我像个狂热的追星族,卑躬屈膝外加免费跑腿,以换取别人容许我待在一个我本不该待的地方。这不是孩子待的地方,它是全匈牙利仅有的五台计算机中的一台,被看作重要资产。我父亲是电子工程学教授,这个工程师是他的学生。我猜是我父亲托他帮忙让我进去的。我也尽量让自己能派上用场。我先是给他带午饭,后来帮他拿东西递家伙,最后我主动提出帮他们守夜,看管机器。他们一到晚上就把计算机关掉,到第二天早上再打开。开关真空管时,电热丝加热或冷却很容易损坏。这台机器有2000个真空管,每次打开时都会坏掉一个。因此,他们上班后的第一件事就是先花一个小时找出那个坏掉的真空管。我在那里守夜的话,计算机就可以一直开着,他们也不用浪费那一个小时。于是,在晚上看管机器的时候,我也就可以用这台计算机了。总之,我和这位工程师成了好朋友。他是个数学天才。我早年学到的许多技巧都是他教的,有的是关于算术思考,有的是关于符号问题。

另外,那台丹麦计算机对我影响也很大。当时,它拥有的也许是世界上最好的Algol编译器,Gier Algol。去丹麦之前,我已经把这个编译器的全部代码清单研究了个遍。它全都是用机器语言写成的,因此我既学了机器语言编程,又学会了从美学层面上思考编译过程。我对这个程序知根知底,至今仍记忆犹新。举个例子,我在伯克利上学时写的SNOBOL编译器只是这个程序的变体。我觉得GierAlgol程序现在仍在我脑海中,也影响着我的编程风格。我总是问自己:“如果这是Algol编译器的一部分,他们会怎么做呢?”这个程序真是精妙无比。有一点我印象很深,就是他们倒着扫描源代码文本的做法。在某些情况下,如果你倒着做事情,之前显得很复杂的问题突然之间会变得非常简单。例如,解析前向引用(forwardreference)可能很难。要是倒着扫描,它们就变成了后向引用(backward reference),很容易解析。只要从新的角度看待程序,原本可能很难解决的问题也会变得容易解决。这个Algol编译器处处是玄机。

匈牙利命名法的由来

匈牙利命名法是一种编程时的命名规范。基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。要基于容易记忆容易理解的原则。保证名字的连贯性是非常重要的。
举例:

  • hwnd : h 是类型描述,表示句柄, wnd 是变量对象描述,表示窗口,所以 hwnd 表示窗口句柄;
  • pfnEatApple : pfn 是类型描述,表示指向函数的指针, EatApple 是变量对象描述,所以它表示指向 EatApple 函数的函数指针变量。
  • g_cch : g_ 是属性描述,表示全局变量,c 和 ch 分别是计数类型和字符类型,一起表示变量类型,这里忽略了对象描述,所以它表示一个对字符进行计数的全局变量。

采访者:别人读几段你的源代码,有没有可能断定“这代码是查尔斯•西蒙尼写的”?
西蒙尼:噢,是的,毫无疑问。是不是我本人写的可能很难分辨,但有一点是确定无疑的:只要看了代码,你就能知道它是不是我的团队写的,或者是不是受我的影响写的。这是因为我从1972年起写的代码都遵循特定的命名规范,许多人称之为“匈牙利命名法”。你一眼就能分辨出哪些代码是受我的影响写出来的,包括Microsoft Word、Multiplan和Bravo,以及其他许多遵循这些规范写成的程序。

采访者:你提到的“匈牙利命名法”是指什么?
西蒙尼:称它为“匈牙利命名法”是个玩笑。你知道,如果有人说“这对我来说就是希腊文”,这表示他们看不懂,因此也可能它就真是用希腊语写的。这里的“匈牙利”是句反话,因为这些命名规范其实是要让代码更易读。这个玩笑说的是程序看起来这么难读,说不定真是用匈牙利语写的。

其实这套规范能够很好地控制程序中所有变量的命名。要是分解一个程序,把它放进磨床,然后对碎片进行分类,你就会发现程序的大部分都是名字。写下“apples + oranges”,你会发现名字“apples”有6个字符,运算符“+”只有1个字符,名字“oranges”有7个字符,一共14个字符,只有一个字符即加号与运算有关。因此,对我来说,要起到作用或有所改进,合乎逻辑的做法就是尽力完善程序的主要部分,也就是名字。

“匈牙利命名法”是一种根据变量的属性自动为其创建名字的命名方法。这跟人们把当裁缝(tailor)的叫做泰勒(Taylor)以及把当铁匠(blacksmith)的叫做史密斯(Smith)非常相似。因此,面对一个具备某些属性的结构,不要随随便便地取个名字,然后让所有人去琢磨名字和属性之间有什么关联,你应该把属性本身用作结构的名字。这种方法有很多优点。首先,造个名字很容易,想到那些属性时,把它们写下来,名字自然就有了。第二,它很容易理解,因为当你读到某个变量时,从名字本身就能了解到与属性有关的大量信息。这些属性会越来越多,因此很难简明地描述它们。为此“匈牙利命名法”引入了一种缩写符号,以很小的空间就能展现具体属性。当然,这在不知情的人看来完全是一团乱麻,那个玩笑就是这么来的。

有些人认为,如果他们可以读出代码里的每个字,那么程序就是可读的。实际上,这种意义上的可读性并不可取。没有人会拿着代码清单,站到演讲台上大声朗读程序。关键在于理解。只是能阅读单词并发出音来,这毫无用处。当人们看到采用“匈牙利命名法”的代码清单时,他们发现这些词很难念,可能就会认为代码不是可读的。但实际上,由于名字和属性之间存在关联,它更容易理解,也更便于沟通。那些使用匈牙利命名法编程的人,即使在离开我的部门之后,仍会继续使用它。这种命名法已经打入苹果电脑、3Com及其他许多公司。

你可能感兴趣的:(一码流年,匈牙利命名法,西蒙尼,编程大师)