转贴:MSDN访谈录之C#编程二
2024-07-21 02:25:26
供稿:网友
robert hess:c#被认为是微软的私有语言吗?
anders hejlsberg:其实并非如此。我们与产业伙伴特别是hp和intel合作,今年年初,我们向一个叫做ecma(欧洲计算机制造商协会)的欧洲标准化组织提交了建议,以便标准化c#和cli。 cli代表通用语言基层体系(common language infrastructure)。
robert hess:而这是不是有点类似于c runtime 和vb runtime?
anders hejlsberg:嗯,实际上cli是.net framework的一个大的子集。在某种意义上,它是.net可以移植到其它平台的那部分。这意味着,例如,它不包括任何windows专门的ui库,因为其它平台对此并没有多大的兴趣。
robert hess:就象内存管理,而且……
anders hejlsberg:嗯,绝对如此,内存管理,大部份的类库被包含在cli中。我们于9月份向ecma提交了这个建议,并在一次ecma会议上得到了采用,制订这两个标准的工作正在进行中。其中一个是c#标准,而另一个是cli标准。
robert hess:那么,c#具有ecma标准又意味着什么?
anders hejlsberg:嗯,这意味着其它产业伙伴们可以也最有可能在不同的平台上实现该语言。
robert hess:如果我是类似波音这样的公司,且拥有一些老式的pdp 11/70计算机,我想让c#在其上面运行,可能会考虑利用ecma标准给这些老掉牙的家伙设计编译器,如果没有什么人已经做了类似工作的话。
anders hejlsberg:绝对正确。现在这两个标准实际上已相继被提交,而目前c#本身并没有规定一个runtime库,而是依赖于.net framework,或者,当我们正在谈论到标准提议时,c#依赖于通用语言基层体系为其提供的runtime基层体系和类库。我们目前正在与标准化组织以及我们的产业伙伴们共同研究,以确定最低的门槛。很明显,cli将被分成几个层次,事实上我们向ecma提交的方案被分为几个层次,这些层次开始于很低的核心层,而你真正地拥有了这些核心数据类型,一些象数组那样十分简单的东西,以及在那里的所有原子变量(atoms),但是分子(molecules)就不必要了。它们被构建在更高层的栈上,因此对于嵌入设备也是这样,实际上可以把其应用于一个非常轻量级的环境(lightweight environment),而这种轻量级环境可以移植到不同的平台。
robert hess:因而我可以让c#的一个版本在我的手表中或某些类似的设备中运行。
anders hejlsberg:是的,理论上是这样,或在您的冰箱中,或任何需要的地方。
robert hess:在某种程度上,这就是.net framework的全部目标,也就是允许编程的基层体系存在于多种不同类型的设备中,通过网络或蓝牙等类似连接,一个设备就可以和另一个设备通讯,并且借用服务,提供相互支持,
anders hejlsberg:对,那是其中的一部分。我想,现在我们应当牢记于心,尽管您谈论到了分布式应用程序或者设备之间的相互通讯,但安置在.net framework甚至是在cli中的基层体系,实际上并不要求在网络的两端都有.net存在。而且,我们所推荐的体系结构确实具有引导作用,何时利用类库来设计程序完全基于xml和soap这样的产业标准,并且也可以在linux box(比方说java和apache web server)中实现它,然后利用其它工具在另一端开发相应的程序,如果你乐意的话。
robert hess:因此在我的c#应用程序里,假如我正在编写它与一个外部服务连接,就可以视其为标准的c#调用,而运行于不同的机器上的一个外部服务可能是amazon.com,或者类似于其它一些既不运行windows也不运行c#的系统……
anders hejlsberg:这正是所有web服务的梦想……
robert hess:而所有要做的事情就只有实现soap了。
anders hejlsberg:是的,嗯,基本上我们所要做的是利用现有的internet的基层体系,意思是,传输协议是http,有效承载(payload)是以xml格式封装的soap(soap formatted xml),并且实际上在网络的另一端可以是任何东西。当从c#中访问xml和soap的调用时,我们事实上有能力使它们看起来象具有方法的对象,但是我们给你提供了所有的基层体系,通过在.net framework中所具有的所有连续的基层体系,你便可以把方法调用转换进xml soap包中,这样的包可以穿越网络并回传然后再解包。
robert hess:好了,您说您从事c#的工作至今已经几年了,而xml的生命期也恰好与此相同。这就意味着当它们开始时,彼此之间是毫无了解的。
anders hejlsberg:嗯,xml的历史可能要长一点。soap却相当新,它与c#还有.net framework是齐头并进的,并且我们也非常积极地从w3c引进这些标准化主体,我们一直在跟踪它的发展,并把这些技术追加到最新的标准中。
robert hess:那么soap和xml之间在这一层次上的相互连接性(interconnectivity)是否当初就是c#一个方面的内容,或者是随着该语言的发展而发展的?
anders hejlsberg:嗯,我认为这里确实存在着一些距离。大部分需要处理xml和soap的基层体系是由.net framework而不是c#提供的。c#语言建立在.net framework的顶层,并使您具有访问这些东西的权力,例如,通过我们在c#中称之为属性(attribute)的东西,在代码中就可以直接表达什么东西正由这个类的实体映射(mapping)成为穿越internet的xml格式。所以我可以说,例如对于成员(field),我想使这个成员变成具有同样名字的xml元素,让这个类名变成xml里的标签(tag)名,等等。而且属性可以直接地集成到代码里,这就是使xml 和 c#变得更易于使用的措施之一。
robert hess:那么它们真的很合适在一起?
anders hejlsberg: 是的,确实如此。
robert hess:当考虑一个应用程序的设计时,为了更好地运用c#,我想要有条有理地建立应用程序,有没有什么不同的办法?或者还是与正常地开发一个c应用程序具有相同的思路?
anders hejlsberg:嗯,我认为关其中的一个关键原则就是,您是以一种很深的面向对象的方式进行编程的,甚至当您在使用c#时,是以一种面向组件的方式进行的。所以会趋向于认为您的应用程序设计有点区别。好,如果您正在使用c++,就可能会想到写对象等等。当您用c#写程序时,例如您可能会想到,哎呀,我正在写一个组件吗?嗯,这个组件必须能加入到visual studios的工具栏,以便我可以把它拖到表单,或拖到一个商业对象,或拖到一个网页,然后它是不是会被属性检查器(property inspector)显示出来,哎呀,那么在那里我到底应该拥有什么属性,我怎么控制下拉单里的东西,我能不能拥有那样的编辑器?现在,我们把基层体系的所有东西都呈现给您,它使您认识到您的设计不同于c++传统的设计。
robert hess:因此很多时候,您仍然在编写应用程序,通过装点修饰应用程序,您正好有更多的性能要展示。
anders hejlsberg:是的,您可以这么说。
robert hess: 有关更多此类面向服务的完整概念是什么呢?因此我正在编写一个几乎无gui的应用程序并且运行在一台服务器上,并计划用一个web客户程序对其进行攻击。客户程序请求首先到达服务器并要求回应以便跟踪包(package)等类似的东西。这是否从根本上改变了思路,或者仍然是同样的服务方向?
anders hejlsberg:嗯,我认为在某种意义上,它让您多一点地考虑应用程序中的抽象。您应更加注意认识到,我是怎样把应用程序安置到商业逻辑层(business logic tier)和表示层(presentation tier),是怎样把api放到商业逻辑层,以便它既可以被表示逻辑用来表示html或基于ui的客户,甚至也为遍布网上的web服务指明入口点(entry points)。因此,您应注意一点,再也不能编写那些铁板一块的程序了。
robert hess:您是否想象这本身有助于人们利用他人的组件比过去更容易?我记得在波音公司工作时,我们老是遇到有关代码重用这个关键问题。我们必须确保所编写的任何应用程序、任何代码都是专为代码重用而设计的,虽然这听起来在理论上确实是一个伟大的主意,但在实践中,却由于从来没有得到好好的利用而寿终正寝了,因为重用别人的代码简直是难上加难。您认为这样居然能使代码重用更容易吗?
anders hejlsberg:我认为会的,这里起关键作用的实际上就是.net framework。事实我们已经定义了这样一个底层(substrate),在其之上可以生成组件。而说到许多关于如何把它们装入类中,如何使它们成为组件,我们给您明确的指导,而事实上整个framework都当作其中一个范例,但关键是组件一律要能被各种各样的语言所访问,因此这里您已经谈论过这个问题,例如,如果某些家伙在用cobol编写一些语言或库而您却想从c++中利用它们,您知道,这会特别困难。实际上我们提供给您一个substrate,让您进行上述交互性操作。所以您大有希望使组件交互操作。因为事实上令人感到困惑的是,组件是以不同的设计观点或在不同的抽象层上编写而成的,这正是使人们糊涂之处。他们并不习惯于这种风格的api,因此迷失在基层体系之中,只见树木不见森林,您应该明白我的意思。因此通过说明许多关于如何写组件,并且提供了用于写组件的永久有效的api和基层体系,您就极其有希望获得更好的重用性
robert hess:嗯,我认为解释恰到好处。为了能抓住c#语言体系的重点,您认为最后还有什么重要的概念要让观众去理解?
anders hejlsberg:我想最好的方法就是您应亲自摆弄它。所以我会催促人们从我的站点下载,而我也相信您会给他们地址的。下载它,摆弄摆弄,写出一些例子,参加我们的用户组或新闻组,和其他用过它的人交谈,看看他们有什么经验。我想你会过得很舒心的。
robert hess:我肯定会在本记录稿的后面建立一个链接,以让他们下载当前版本的c# runtime以及我们在pdc上公开的.net材料,我猜我们会有另一个版本的……
anders hejlsberg:我们的beta 1.0版要发布了……
robert hess: beta 1.0版很快就要发布了,因此您提到的新闻组里也要建立一个连接到beta 1.0的链接。因此您应保证寄给我的email里要含有这些新闻组,以便我能建立。
anders hejlsberg: 好的。
robert hess:谢谢anders,感谢您的谈话,而且我希望观众感谢这位真正帮助过设计c#语言的专家,感谢他有关开发应用程序的心得。
在短暂的休息之后,我们会继续与一位程序员交谈,至今他用c#开发应用程序已经有些时日了,我们会了解到他对这种语言的想法,以及任何有助于我们用c#开发自己应用程序的线索。所以请不要走开哦。