d2.099
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文件.
// dsayhello.d
import core.stdc.stdio : puts;
extern(C) void helloImport() {
puts("你好 __import!");
}
// dhelloimport.c
//c文件.
__import dsayhello;
__import core.stdc.stdio : puts;
int main(int argc, char** argv) {
helloImport();
puts("酷不酷");
return 0;
}
这样编译:
dmd dhelloimport.c dsayhello.d
还可用它来导入通过ImportC编译的C模块:
// csayhello.c
__import core.stdc.stdio : puts;
void helloImport() {
puts("你好 __import!");
}
// chelloimport.c
__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的重大更改.更改日志
浙公网安备 33010602011771号