DMD 的2.099.0 版本于3月6日 发布.这是大型版本,包含100 个贡献者的20 个主要更改 和221 个已关闭的Bugzilla 问题.此版本一些亮点:D 模块可通过ImportC 导入C代码 ;D 现在有throw 表达式;现在窗口 上DMD 中的默认为PE/COFF 输出.完整更改日志.
使用ImportC 在导入C源码模块
ImportC 是D的有益补充.一旦解决了所有问题 并实现了处理C预处理 指令,避免了大部分绑定到C库 的需求,可引入C头 文件,无需外部工具,直接编译C源文件 到D程序 中. 从D2.099.0 开始,还可用__import 关键字直接导入D模块 至C文件 .
import core.stdc.stdio : puts;
extern(C) void helloImport() {
puts("你好 __import!");
}
__import dsayhello;
__import core.stdc.stdio : puts;
int main(int argc, char** argv) {
helloImport();
puts("酷不酷");
return 0;
}
这样编译:
dmd dhelloimport.c dsayhello.d
还可用它来导入通过ImportC 编译的C模块 :
__import core.stdc.stdio : puts;
void helloImport() {
puts("你好 __import!");
}
__import csayhello;
__import core.stdc.stdio : puts;
int main(int argc, char** argv) {
helloImport();
puts("酷不酷?");
return 0;
}
编译:
dmd chelloimport.c csayhello.c
实现了throw 表达式
以前,D中,throw 一直是个语句 .它不能在表达式 中使用,因为表达式 必须有类型 ,并且由于throw 不返回值,所以无合适类型.这阻止了与以下语法一起使用:
(string err) => throw new Exception(err);
而要求这样:
(string err) { throw new Exception(err); }
DIP1034 引入了底层类型 ,提供了启用throw 表达式方法:"throw 语句按底层类型表达式 返回时.从D2.099.0 开始,以下代码可编译:
void foo(int function() f) {}
void main() {
foo(() => throw new Exception());
}
PE/COFF 是窗口 上的默认DMD 输出
多年来,DMD 在窗口 上以OMF 格式输出目标.主要原因概括为两个要点: d作者 已拥有生成OMF 输出的C编译器后端 ,为Win32API 分发OMF 链接库的许可证 ,及理解OMF 的(OPTLINK )链接器. 当他1999 年开始研究D时,窗口 上没有系统 链接器,因此不能依赖安装 的特定 链接器. 重用 编译器后端和链接器 允许Walter 按编译器开箱即用 发布DMD .这对D的早期采纳 很重要.缺点是限制了窗口 上的DMD 为32 位. 最终,他不得不支持PE/COFF 并要求微软 链接器才能支持64 位输出,同时,实现了32 位的PE/COFF ,但对不想安装微软构建工具 (用于链接器 )和SDK (用于Win32 链接库)的人,他坚持DMD 继续开箱即用 . 最终,OPTLINK 太旧了.随着D代码库 增长,链接器 错误越来越多.有要求默认启用PE/COFF .最后,有人提出了伴随LLVM 的LLD 链接器及从MinGW 项目生成的链接库 的想法.允许DMD 最终默认为PE/COFF ,并同时保持开箱即用 .现在PE/COFF 是窗口 上的默认DMD 输出.
即已弃用-m32mscoff 开关,-m32 现在指定PE/COFF ,如果需要,新开关-m32omf 可用于产生OMF 输出(但最终会删除OMF ).-m64 开关一直产生PE/COFF 输出,所以不变.
ldc
3月10 日发布LDC1.29.01 的测试版.此版本基于LLVM 的D编译器基于D2.099.0+ 前端.它包括支持LLVM13 ,不再默认用ld.gold (lld),并包括对extern(D)ABI 的重大更改.更改日志
|