2

有谁知道在 .NET 上实现的托管编程语言,它包含未映射到通用类型系统/FCL/BCL 的专用数据类型,或者没有提供的 .NET 等价物(例如,已提供的标准类型,如 System .String,System.Int32)?

这个问题可能来自移植编译器的人的角度(尽管我没有这样做)。

是否像在 BCL/FCL 之外为其专用类型创建新数据类型的语言一样简单?如果是这样,这是否会阻碍编程语言之间的互操作性,否则这些编程语言习惯于将其所有内置数据类型映射到 BCL/FCL 中的内容,如 Visual Basic 和 C#?

我可以想象,如果将某种晦涩的语言编译器移植到 .NET 中,并且没有将其隐式数据类型之一直接映射到随附的框架,我可以想象这种情况可能会发生。

通常如何支持或允许这种情况?编译器和公共语言运行时的期望是什么?

4

3 回答 3

3

Delphi for .NET 实现了 Delphi 语言的类变量(可以保存对类类型的引用)、虚拟类方法和虚拟构造函数(通过类引用调用)的概念。这些在 CLR 中都没有任何直接的模拟——CLR 中的静态方法不能是虚拟的,构造函数也不能是虚拟的。

由于 CLR 拥有如此丰富的运行时类型信息,因此 CLR 中并不严格需要这些工件。如果您想在运行时在编译时不知道确切类型的代码中构造一个类型的实例,您可以使用反射或其他技术来实现。Delphi 语言的这些特性源于运行时类型信息有限的本地编译的 Win32 产品。这一切都是在 .NET 1.0 和 1.1 上实现的,早在 DLR 之类的东西出现之前。

这些 Delphi 语言特性可以在 CLR 中使用反射来模拟,但出于性能原因,我们选择直接在 IL 中实现它们,方法是创建一个“元类”类型,该类型是 Delphi 中声明的每个类类型的附属。如果 Delphi 代码将 Delphi 类类型分配给类引用变量,我们生成 IL 代码以将相应元类的单例实例分配给该变量。通过类引用变量的虚拟方法调用被代码生成为元类实例上的 IL 虚拟方法调用,它反弹到相应类类型中的实际静态方法实现。这允许类虚方法调用仍然表现多态(调用与用于进行调用的实例类型相适应的实现)并且运行时性能成本最低。

这些虚类方法特性只适用于以 Delphi 语法声明的类,并且只能在 Delphi 语法中使用。我相信元类型被标记为不符合 CLS,因此其他 .NET 语言(很可能)在使用 Delphi 中创建的类时会忽略它们。其他 .NET 语言无法使用这些 Delphi 特定的语言功能(除非开发人员真的下定决心并爬过脚手架以对/通过丑陋的命名元类进行适当的调用)

通常,您不应期望其他语言使用由/为您的语言创建的非 CLS 工件。如果您希望其他语言使用您的语言创建的内容,您将需要弄清楚如何以符合 CLS 的术语以合理的方式表示您的特殊酱汁。根据特殊酱汁的性质,这可能是不可能的。

Delphi 虚拟类方法可用于其他 .NET 语言作为普通静态方法。多态本质并未暴露给其他 .NET 语言,主要是因为 CLS(或其他语言)根本无法表达这一概念。

理想情况下,每一种语言都能够同样好地表达每一种可以想象的结构。但实际上并非如此。一些图形函数在笛卡尔坐标中更容易表达,而另一些则通过使用极坐标得到了极大的简化。编程语言也是如此。

用你自己的语言发明新的表达方式是可以的,即使它是在 CLR 上实现的。如果您希望您的语言的代码被其他人调用,请务必清楚地定义您的类型对于在您的语言之外工作的程序员的外观。您的实现将具有双重性:事物对您的语言用户的看法,以及事物对您语言之外的用户的看法。

脚注:我认为这不适用于适用于 .NET 的 Delphi 新产品 Delphi Prism。我不认为 Delphi Prism 支持虚拟类方法。

于 2010-12-22T20:58:42.243 回答
1

并不真地。任何语言都有必须能够在商品硬件上运行才能获得成功的最终负担。对于可以在当前硬件上有效处理的类型,CTS 是一个非常好的模型。

可能需要大量运行时支持以适应语言的类型系统和 CLI 的。一个典型的例子是 DLR,它是 Python 和 Ruby 等动态语言的运行时支持系统。它基本上完成了这种语言解释器必须做的事情,它具有相当的性能。顺便说一句,没有技巧,一切都是纯 C# 代码。

当语言具有根本不可用的功能时,这样的运行时支持库可能会变慢。例如多重继承。CLR 和 JIT 编译器本身就“支持”它。您可以使用任何使用 MI 的符合标准的 C++ 程序,通过带有 /clr 选项的 C++ 编译器运行它,您最终将得到一个包含纯 IL 的程序集,该程序集将在运行时即时编译。无论如何,您都不能将结果称为托管程序,它不会是可验证的,也不会使用垃圾收集器。解决这个问题需要一个必须模拟多重继承的支持库。可能,我怀疑它会具有竞争力。

于 2010-12-22T21:19:15.143 回答
0

嗯,有 c++/cli。在那里,您可以创建在 .net 中不可见的 c++ 类。这就是你所追求的吗?

于 2010-12-22T20:12:12.710 回答