C#首席架构师Anders Hejlsberg访谈 (转贴1)

win32c 2003-01-12 04:17:45
C#首席架构师Anders Hejlsberg访谈  

John Osborn 著 荣耀 译

7月,O’Reilly编辑John Osborn参加了微软职业开发者会议。在此,他对著名的工程师、微软.Net框架C#语言首席架构师Anders Hejlsberg进行了采访。Anders Hejlsberg因设计PCs上最早的语言之一—Turbo Pascal而广为人知。他把Turbo Pascal许可给Borland公司,后又率队创建了Delphi—一个极为成功的可视化的client/server应用设计工具。访问时在座的还有微软C#产品经理Tony Goodhew和O'Reilly的Windows编辑Ron Petrusha。

Osborn:

我已经看到一些关于C#(发音为"See sharp")的新闻故事,并注意到有很多似乎倾向于这样的观点,或理论上说,C#不是Java的克隆就是Java的微软替代品。如果你来做宣传的话,你希望人们怎么评论这门语言?

Hejlsberg:

首先,C#不是Java的克隆。在设计C#期间,我们考察了很多种语言,我们考察了C++,我们考察了Java,我们考察了Modula 2、C,我们还考察了Smalltalk。很多语言都有我们感兴趣的相同的核心思想,比如深度面向对象、简化对象(object-simplification)等等。

C#和这些别的语言尤其是Java之间的关键不同点是,它非常接近C++,在我们的设计中努力使然。C#从C++直接借用了大多数的操作符、关键字和声明。我们还保留了许多被Java抛弃的语言特性。为什么Java中没有枚举,道理何在?我的意思是,抛弃它们是基于何种理论基础?在C++中,枚举显然是一个很有意义的概念。在C#中,我们保留了枚举并同样使其类型安全。并且,枚举不只是整型,它们实际上是从.NET基类库里的System.Enum派生下来的强类型的值类型。如果没有进行造型转换,枚举类型“foo”和枚举类型“bar”不可互换。我认为这是个重要的差异。我们还保留了操作符重载和类型转换。C#名字空间的整体结构也非常接近C++。

但是,超越这些传统的语言论题,我们设计语言的一个关键的目标是使C#面向组件。我们向语言自身加入了你在编写组件时所需要的所有概念。例如properties(属性)、methods(方法)、events(事件)、attributes(特性)和documentation(文档),它们都是一等的语言成分。我们对特性所做的工作是全新且具有创新意义的,利用特性可为任何对象加入有类型的、可扩展的元数据。这在目前任何其它程序语言里都看不到。C#也是第一个合并XML注释标签的语言,编译器可以用其直接从源码中生成可读的文档。

另外一个重要的概念是我所说的“一站购物式软件”(one-stop-shopping software)。一旦你用C#写代码,你就一体化地写了一切。不再需要头文件、IDL(接口定义语言)文件、GUIDs和复杂的接口。因为它是自包容的单元,所以,一旦你能够以这种方式编写自描述的代码,你就可以把你的软件嵌入到ASP页面或植入各种不同的环境,这在以前是不可能的。

让我们再回到这些关键的组件概念。语言是否应该支持属性或事件,业界有很多争论。没错,我们是可以用方法表达这种概念。我们可以用诸如“get”或“set”之类的程序块的命名模式,模拟属性的行为。我们可以用接口和实现接口的适配器并转发到对象。这都是可以实现的,正如同可以在C语言里进行面向对象编程一样。只是它更加困难,需要更多手工劳动,为了真正表达你的思想,你最终不得不去做所有的工作。我们认为是时候了,应该有门语言使得创建组件变得容易些。最近几年来,开发人员在创建软件组件。他们并不是创建整个应用或整个类库。每个人都是在创建从宿主环境提供的基组件继承下来的组件。这些组件重载一些方法和属性,它们处理事件,并把组件安装回系统。树立这些概念是关键的第一课。

Osborn:

你最近在介绍C#时,第一张幻灯片上面写着:“C/C++家族里第一个面向组件的语言”。

Hejlsberg:

是的。这是我的首要目标之一。我们谈论一切如何都是对象,这也非常关键。以前象Smalltalk和Lisp语言都可以这么做,但代价高昂。我认为C#包含一些优美有趣的创新,以使得组件开发容易些。例如装箱和拆箱的概念。装箱可以使一个值类型的值转换为一个对象,拆箱可以使一个对象转换为一个简单类型的值。这在以前或许也有,但我们把它应用于语言的方式是一种优美的创新。

我们努力避免以“象牙塔”的方式设计C#和.Net框架。我们承受不起重写我们所有的软件的负担。业界也负担不起,特别是今天我们正转移到Internet时代。你要善于利用你已经拥有的。所以,我认为互操作性也是关键的。我们致力于为程序员提供所有符合Internet标准的可互操作的恰当的解决方案,例如HTTP、HTML、XML以及业已存在的微软技术。所以你不会有如坠深渊的那一刻—发现新的.NET框架下没有提供你用的一些东西,或者当你意识到你想利用一些已经存在的API或组件的时候。你已经看到我们已把所有COM互操作能力内建入语言和通用运行时;你已经看到可以使用DllImport特性导入已存在的DLL(动态连接库);你已经看到即使那些都不能遂你所愿,我们也有不安全代码的概念。不安全代码允许你编写使用指针的内联C代码,可以做不安全的造型转换,可以抑制内存从而使其不会被意外地垃圾收集。

关于不安全代码有很多争论,人们似乎认为我们在吸毒或是在干什么别的坏事。我认为这是个误会。代码不会仅仅因为标记了“unsafe”就表示它不受管制。当然,我们不会扔出不安全的指针使人们容易受到从Internet下载的不安全代码的攻击。不安全代码被深深地约束在安全系统里。我们提供这样的弹性:1.呆在托管代码箱里完成工作而不会坠入深渊;2.转入一种不同的语言使用一种不同的编程模型编写本地代码。如果你停留在这个箱子里,我们会使代码更加安全,因为系统知道它要干什么。事实上,即使你编写不安全代码也并不意味着你离开了托管空间。因此,你的不安全代码会变得更能干。

Osborn:

请给我多讲一些在托管环境里处理不安全代码的机制。

Hejlsberg:

好的。描述托管执行环境比如Smalltalk、Java和.NET通用语言运行时一个重要特征是它们提供了垃圾收集机制。为了提供垃圾收集机制,至少要提供一个现代的垃圾收集器,一个“标记和清扫”垃圾收集器,比起传统非托管代码来说,你必须更多地了解正在执行的代码。为了找出要排除的死对象,你必须能遍历堆栈,找到所有活动的根,并指出哪些对象是活动的哪些是不再被访问的。然而,为了能够达到这个目标,你必须和你执行的代码紧密协作。代码要具有更好的描述性。它要告诉你它是怎么分布在堆栈里的,它的局部变量在什么地方等等。

当你在C#中编写不安全代码时,你可以做不是类型安全的事,比如指针操作。当然,标记为unsafe的代码并非绝对执行在不可信任的环境里。为了使之执行,你必须授予信任,否则,代码将不会执行。从这一点来看,和其它本地代码并无区别,真正的区别是它们仍然运行在托管空间里。你编写的方法有一个描述表,它告诉你哪些对象是活动的,因此,不管什么时候你进入这些代码,你都不必跨越列集边界(marshalling boundary)。否则,当你进入非描述性的、非托管代码(比如通过Java本地接口),你不得不在堆栈上设置一个水印或设立一个屏障。你必须重新列集所有箱子外的引数(arguments)。一旦开始使用对象,你必须对你触及的东西小心翼翼,因为GC(垃圾收集器)仍然在另一个不同线程里运行。如果你不使用一些隐晦的方法锁定对象从而正确地抑制垃圾收集器,它可能会移去对象。如果你忘记那么做,那你将会不走运。

我们采用了一种不同的方式。我们说过,“让我们集成这个到语言中去。让我们提供声明,例如fixed声明,它可以让你抑制对象以和GC协作并集成之。”用这种方法,我们提供最佳方式,带领所有已经存在的代码一起向前,而不是仅仅将它们抛弃。这是一种不一样的设计方式。

Osborn:

因此,你们处理的不安全代码的内存,实际上是在垃圾收集器的监视之下?

Hejlsberg:

没错,是这样。但是,就象所谓的“购者自慎,不包退换”一样,它并不安全。你可以获取指针并做错事,当然,你在本地代码里也能干同样的错事。

Osborn:

我认为另一个易混淆的地方,是理解C#在哪儿停止以及通用运行时从哪儿开始。与它从通用运行时库得到的相比,C#语言自身的创新是什么?

Hejlsberg:

好的,我想这个混淆来源于这样一个事实:当人们谈论Java时,他们并不真的知道哪个是语言哪个是运行时。当人们谈论Java时,某些混淆就发生了。哪个是语言哪个是运行时?当他们谈论Java时,他们到底指的是什么?Java,语言?Java,语法?还是Java,平台?人们将这些不同的方面混为一谈。我们的方式表明我们想成为一个多语言的平台。我们将创建一个平台,它允许你进行多语言编程,并且共享一套公共的API(应用编程接口)。让我们承认这一点,一些人喜欢用COBOL编程,一些人喜欢用Basic编程,一些人喜欢用C++,还有一些人将会喜欢用C#—我希望。但是,我们不会试图告诉你,忘记你曾经做过的所有的事情吧,我们不会说,“现在只有一种语言,在这个竞赛中将不会有进一步的创新了”。我们说业界因为弹性而友好。Java是怎么来的?它的出现是因为在它前已经存在一些编程语言,而在它后也还将会出现一些编程语言。我们想打造一个平台,在此你可以偏爱某种语言但不会否定整个价值取向;我们想打造一个平台,它可以是不断革新的。今天谁在帮助COBOL程序员?又是谁将他们带入WEB?只有在.NET平台上你才可以把富士通COBOL嵌到ASP页面中。我的意思是,它真正是革命性的!

Osborn:

假定.NET平台支持多语言,那为什么选择C#而不是Visual Basic、C++甚至COBOL?是什么使C#如此引人注目?

Hejlsberg:

首先,C#可以使我们从一张白纸开始。也就是说,我们没有任何向后兼容的负担。这显然会使事情简单些,无论从是从实现的立场还是从使用的立场都是这样。例如,在C#中,我们只有一种class,并且总是被垃圾收
...全文
142 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
mgspeed 2003-01-16
  • 打赏
  • 举报
回复
up
benbencatrabbit 2003-01-12
  • 打赏
  • 举报
回复
up
mouseanAnya 2003-01-12
  • 打赏
  • 举报
回复
MARK!
C#(读作“C sharp”)是一种简单、现代、面向对象且类型安全的编程语言。C 和 C++ 程序员能很快熟悉它。C# 同时具备“应用程序快速开发”(RAD) 语言的高效率和 C++ 固有的强大能力。 Visual C# .NET 是 Microsoft 的 C# 开发工具。它包括交互式开发环境、可视化设计器(用于生成 Windows 和 Web 应用程序)、编译器和调试器。Visual C# .NET 是 Visual Studio .NET 的产品套件的组成部分,该产品套件还包括 Visual Basic .NET、Visual C++ .NET 和 JScript 脚本语言。所有这些语言都支持对 Microsoft .NET Framework 的访问,该框架包括一个公共执行引擎和一个丰富的类库。.NET Framework 定义了一个“公共语言规范”(CLS),这是一种通用规范,它确保遵循该规范的语言与类库之间实现无缝的互操作性。对 C# 开发人员而言,这意味着即使 C# 是一种新语言,但仍可恰如其他成熟工具(如 Visual Basic .NET 和 Visual C++ .NET)一样,使用相同的、功能丰富的类库。C# 本身不包含类库。 本章的其余部分描述该语言的基本功能。虽然后面的章节会详尽地(有时甚至以数学方式)对规则和例外情况进行描述,但本章的描述力求简洁明了,即便因此而影响完整性。这样做是为了向读者提供关于该语言的概况,以方便读者编写早期的程序和阅读后面的章节。

7,765

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧