东亚银行、岚图汽车带你解锁 AIGC 时代的数字化人才培养各赛道新模式! 了解详情
写点什么

Cristian Vlasceanu 和.NET 上的 D 语言编译器

  • 2009-03-19
  • 本文字数:2004 字

    阅读完需:约 7 分钟

Cristian Vlasceanu 正在将 D 语言的编译器移植到.NET 平台。

向那些还没听说过 D 语言的读者介绍一下 D 语言把:

D 语言支持多种编程范式:面向对象、函数式、模版元数据编程,甚至还包含了像 goto 语句和内联汇编这样较难驾驭的特性。

我听说 Walter Bright(D 语言之父)将 D 语言描述为编译器实现者发明的语言(而不是语言设计者)。这或许是真的,实事上有些最成功的软件就来源于作者的直接需要。当然,Walter 的描述有点贬低了 D 语言,因为实际上他在设计的时候充分考虑了使用者,而不仅仅是考虑哪些语法更容易实现。

D 语言用很多种方式鼓励“正确”的行为。例如,在 C 和 C++ 中,如果你写“int i;”则变量是没有被初始化的。想要做“正确的事”,你需要再多敲几下键盘写成“int i=0;”。但是 D 语言不是这样:“int i;”会将变量设为默认值(这里是 0)。如果你不想让变量被初始化,则需要写成“int i=void;”,这样表示你是有意不初始化这个变量,而不是因为懒惰。

你为何决定开始编写一个 D 语言的编译器?

这个项目只是编写编译器的后端,前端是基于 Walter 的开源编译器,我尽量避免修改前端。

在我的职业生涯中,我有过编写解释器前端的经验,但是缺乏代码生成的经验。而且我的大部分工作都是用 C++ 来完成的,直到最近才开始接触.NET(和 C#)。一个.NET 代码生成器的项目正好是一个既学习代码生成又学习.NET 的好机会,这是原因之一。

另一个原因是,一个.NET 平台的编译器实现(即使只是一个原型)也可以给 D 语言社区带来成熟的框架,使得 D 语言与.NET 平台的其他语言的交互变得更容易。

我有一些证据显示,D 社区的一些人在性能有要求时比较喜欢本地代码;但是如果没有这样一个编译器实现的话,本地代码的这些所谓的好处是没有办法被证明,或者被推翻的。

你把这个项目当成是研究项目,还是准备将他用于生产环境?

这是一个研究项目。我不知道 D 社区对此有什么期望(我计划在几周内发布代码,来看看他们有哪些期望),我也不知道我还能有多少工作以外的时间来参与这个项目。我希望它能够继续发展,一直达到生产环境要求的质量标准。但是现在它还处在初始阶段。

在你的博客 Programming and Debugging 中,你提到在编写编译器的过程中,你碰到了很多兼容性的问题。你觉得在这些兼容性问题中,哪一个是最有趣或者最困难的?

目前为止是 array slices。D 语言有一个特性,如果你有一个(例如)整形数组“x”,你写“int[] y=x[2…5];”,那么“y”就是“x”的一个“视图”,它从 x 的第二个元素开始,到(但是不包含)第五个元素结束。这里“y”是一个轻量级的对象,而不是“x”数组中元素的拷贝。在.NET 中有一个类似的概念叫 ArraySegment,ArraySegment(值类型)是一个与数组完全不同的类型。

D 语言实际上不区分 array 和 slices。如果有一个方法例如“foo(int [])”,那么 array 和 slices 都可以作为参数传给这个方法。这会使程序员感到迷惑,而且在编译器的代码生成器中很难实现。我现在的解决办法效率很低,因为我使用了很多 array 和 ArraySegments 之间的隐式转换。我希望 Walter 能在 D 语言的 2.0 版本中做出改变,使 array 和 slices 有不同的类型。数组和它的视图在概念上是不同的,因此在建模时也应不同。

除此之外,一切都比较顺利,因为 D 语言和.NET(以及 C#)之间有很多相似的地方。

哪些 D 语言的特性是你希望在 CLR 和 / 或 C#中也能看到的?

D 语言有一个特性叫“class invariants”:你可以写一个方法并加上关键字“invariant”,编译器会生成一些代码,使这个方法在构造器执行后,所有公共方法执行前和后,以及析构器质执行之前被调用。这个方法中通常包含了一些断言,但是你也可以放任何检查性代码在里面。这个特性对调试非常有用。我不会介意 C#中有类似的东西,但是话说回来,我更精通 C++。

这看起来和 Code Contracts 的 Object Invariants 特性很像。

是的,是同样的原理,当然有一点点不同(如果我没读错文档的话)。D 语言不需要反射或额外的工具(例如 ccrewrite),契约式编程在 D 语言中是天生支持的。或许我还没有发现 Code Contracts 的其他用途,但是看上去实在很复杂。我觉得 D 语言的实现方式更简练也更易于理解。

你已经在这个项目上工作一段时间了,你是否仍然喜欢将 CLR 作为编译器的开发平台?

随着我对 CLR 的了解越来越多,我也越来越喜欢它了。我觉得我能够将注意力集中在语言特性本身,而不是 vtable 布局或者栈展开之类的可怕细节,这让我感觉很好。

你对 DLR 感兴趣么?不管是 DLR 本身或是对 D 语言来说?

这是个好问题。与 Python 或 Ruby 不同,D 是一个静态类型的语言。我的第一直觉告诉我,在这个项目中,我不需要 DLR。但是我可能会研究一下,希望能够帮助我解决前面提到的 array slice 的难题。

查看英文原文: Cristian Vlasceanu and D for the .NET platform


译者介绍:王瑜珩,ThoughtWorks 咨询师,从事多年.NET 开发,热衷于敏捷开发方法与相关实践。

2009-03-19 03:361362
用户头像

发布了 63 篇内容, 共 23.4 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
发现更多内容

10分钟搞懂事件驱动API

俞凡

架构 API

电商系统微服务拆分

michael

架构实战营

随便谈一下kafka消息队列

Regan Yue

kafka 10月月更

架构实战营总结

gawaine

架构实战营

HMS的舞者们,在智能世界的舞台

脑极体

架构实战营-第三期-模块一作业

岚哲

极客时间 架构 架构实战营

腾讯云安全隐私计算通过 CFCA 评测,再获国家级认可

腾讯云大数据

大数据 隐私计算

模块一作业

ks

架构实战营

Vue进阶(幺肆玖):template 标签

No Silver Bullet

Vue 模板 占位符 10月月更

什么是架构

天天向上

架构实战营

架构实战营 拆分电商系统为微服务

💤 ZZzz💤

架构实战营

026云原生之Exporter采集数据

穿过生命散发芬芳

云原生 10月月更

模块一作业

zjluoyue

电商微服务拆分

白开水又一杯

#架构实战营

学习心得 - 架构训练营 - 第六课

Fm

linux删除目录下文件的几种方法

入门小站

Liunx

模块六作业

potti

web安全:mysql提权总结篇

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

架构实战营-第三期-学习总结

岚哲

极客时间 架构 架构实战营

架构实战营模块六作业

Geek_d18264

架构实战营

这样学BAT必面之软件设计原则,还不会就是我的问题

Tom弹架构

Java 架构 面试 设计模式 设计原则

在线英文字符串大写转小写,小写转大写工具

入门小站

工具

拆分电商系统为微服务

缘分呐

微服务 电商系统

模块一作业

hhh

「架构实战营」

【架构实战营作业】模块六——创业公司电商微服务架构

聆息

Redis 实现分布式锁

黄敏

指标统计:基于流计算 Oceanus(Flink) 实现实时 UVPV 统计

腾讯云大数据

大数据 流计算 Oceanus

模块6作业

4anonymous

学生管理系统

Mars

架构实战营 模块一

学生管理系统架构设计

天天向上

架构实战营

ZK(ZooKeeper)分布式锁实现

牧小农

zookeeper ZooKeeper原理 zookeeper分布式锁

Cristian Vlasceanu 和.NET上的D语言编译器_.NET_Jonathan Allen_InfoQ精选文章