日期:2012-07-20  浏览次数:20566 次

Osborn:

     让我们进入语法细节。我在想,C#是否包括对正则表达式的内建支持。我没有在语言参考里看到它,或许它可能在别的什么地方吧。

Hejlsberg:

     首先,在基类库里有一个正则表达式类。我们并没有在语言里加入对正则表达式的任何直接支持,但是,实际上我们有些非常类似的特性。并不值得对它们做重大的处理。但是,比如当你需要指定一个时候—我们给你这个能力去写一个逐字字符串而不需要你每次写两个后斜杠。当你写正则表达式时并且当你的正则表达式里的引号还套引号时,它实际上有极大的帮助。虽然这个帮助不足挂齿,但显然其核心在.NET框架里,而这个框架可以被任何编程语言共享。

Osborn:

     C#和Java名字空间看起来不同。它们是否概念相同而实现上不同?

Hejlsberg:

     概念上是的,但是在实现上非常不同。在Java里,包名也是物理的东西,它指定了你的源代码文件的目录结构。在C#中,物理包和逻辑名称完全独立,无论你如何称呼你的名字空间,它都和你的实际代码的物理包不相关。这就给你更多的弹性—把物理上分布的单元包装在一起,并且不强迫你建很多的目录。在语言自身,有很多很明显的区别。在Java里,包也是你的物理结构,因此,Java源文件必须在正确的路径里,并且只能包含一个公开类型或者一个公开的类。因为C#没有那种物理和逻辑上的绑定,所以你可以任意命名你的源文件。每一个源文件都可以被多个名字空间使用并且可以带有多个公开类。进一步讲,你可以把所有的源码写在一个大文件里,或你可以把它们分散到交叉的小文件中去。概念上讲,C#编译时发生了什么—你给编译器提供了所有构成你的工程的源文件,然后它只管前进并指出该干什么。

Osborn:

     我有一个关于泛型编程的问题:你认为它是个重要的概念吗?它应该成为面向对象语言的一部分吗?如果是的话,你们把泛型编程加为C#的一部分的计划如何?

Goodhew:

     好的。在第一个版本里包括泛型编程的愿望受到了限制。并不象每一个人以为的那样,微软并没有无限制的资源。在这第一个版本里,我们不得不做一些困难的决定。

Osborn:

     有多少人参与开发C#?

Hejlsberg:

     语言设计组由4个人构成,编译器组由另外五个开发人员构成。

Petrusha:

     框架呢?

Hejlsberg:

     那就多了,整个公司都被卷入了。

Goodhew:

     就整个Visual Studio和.NET平台组而言,我们的部门大概有千人左右。包括程序管理人员、开发人员、测试人员,包括所有创建例程、框架、运行时、ASP编程模型的人员以及其它所有的人比如我,管理层的。

Hejlsberg:

     就你刚才所说的泛型方面,我明确地认为它是个非常有用的概念,并且你当然可以列举出发生在学术界和业界所有的泛型研究。模板是该问题的一个解决方法。在我们内部讨论中,我们决定要在新平台里做这个事情。但我们真正喜欢做的是让底层的运行时理解泛型。这和如何创建泛型原型是不同的。用Java的“擦除”概念系统里没有真正的泛型知识。如果公共语言运行时理解泛型的概念,多种语言就可以共享这个功能。你可以在一个地方用C#写一个泛型类,别的人用别的语言也可以使用。

     使泛型成为运行时的一部分还可以使你更有效率的做某些事情。泛型实例化的最理想的时间是在运行时。如果用C++,模板的实例化发生在编译时,你有两个选择:听任你的代码膨胀或试图在链接时去除掉一些膨胀代码。但是,如果你有多个应用,你可能会忘记这一点,你将只能得到膨胀的代码。

     如果把泛型的知识纳入公共语言运行时,则运行时可以理解—当一个应用或组件请求一个“Foo”列表时,它首先会问:“我已经有了一个实例化的“Foo”列表了吗?”如果是,就用那一个。实际上,如果Foo是一个引用类型,并且我们设计正确的话,我们可以让所有引用类型共享一个实例。对于值类型,比如整型和浮点型,我们可以为每一个值类型创建一个实例,但这应该在应用请求时才做。为了把泛型加入运行时,我们已经做了大量的设计工作和必要的基础性工作。

     你先前提到的关于IL的东西是有意思的,因为加入泛型的决定影响了IL的设计。如果IL指令嵌入类型信息,如果,例如,一个“加”指令不再是个“加”了,而是一个整数“加”或是浮点数“加”或是一个双精度数“加”,你就把类型信息硬加入到了指令流里,并且在这一点上来说IL不是泛型的。我们的IL格式实际上是真正的类型中立的。并且,为了保持类型中立,我们可以迟些时候加入泛型而不会给我们带来麻烦,至少不会太麻烦。这也是我们的IL和Java的字节码看起来不一样的原因之一。我们IL类型中立。“加”指令可以加栈顶的任何两个东西。在泛型世界,当它被初始化时,它可以被翻译成不同的代码。

Osborn:

     所有.NET语言都可获得泛型能力吗?

Hejlsberg:

     是的。微软剑桥研究院已经创建了一个支持泛型能力的公共语言运行时和C#编译器的版本,我们正在研究如何尽快使其前进。第一个版本是不可能加入泛型了,我们知道的就这么多。但是我们正在工作以确保我们在第一个版本里做了正确的事情从而使泛型可以适用于整个蓝图。

Osborn:

     C#和.NET框架以及Visual Studio的下一个版本计划发行日期是?

Goodhew:

     唔,我们为来这儿参加PDC的6500名人员带来了技术预览版。我们希望2000年秋季的某个时间发布beta版,然后在准备好以后,我们发布发行版。我们所做的一个真正令人激动的事情是看看Windows2000发行版发布进行的如何,以让关键客户参与到合作开发和合作部署的进程中来。关于.NET框架和Visual Studio.NET,我们将再次和客户一起工作以决定最终产品的发行日期。我们打算让他们告诉我们什么时候产品该就绪了。并且,因为有真正的客户参与到这个进程中来,我们将获得更好的产品质量。这种做法的不利的一面是使产品开发和发布的进程有点不确定。但这是根本性的改变。我们在寻找一个打破质量障碍的产品发行方式,而不仅仅是挑一个武断的日期说我们要发货了。

Osborn:

     因此,不是一个代码完成的日期,我们在寻找一个“准备好出发”的日期?

Goodhew:

     是的,没错。我认为开发者将会发现Visual Studio.Net发行版是微软历史里最高质量的发行版本之一。

Osborn:

     你们已经把C#提交给ECMA[译注:欧洲计算机制造商协会]。标准化真的是一个严肃的目标吗?你希望在其它平台上也可使用C#吗?

Hejlsberg:

     的确如此!把C#作为一个可能的标准提供给业界当然是我们的目标,这也是我们把它提交给ECMA的原因之一。在引导这个有着公共语言基础设施的公共设计的语言的进程中,我们当然希望得到ECMA的支持。关于公共基础设施,我的意思是指这个规范所规定的一个核心类库集,如果其它公司使用其它平台实现它,他们有理由期望发现可以在他们的程序里利用这些类。

Goodhew:

     我想指出的是