2401d,d2.107版本

原文

更改编译器

1,不推荐按断定条件使用串字面
2,清理编译器的Makefiles
3,无法识别的编译指示不再是错误,而是简单忽略
4,对模块构造器,添加了@standalone
5,已转换_d_newarray{mTX,miTX,OpT}为单个_d_newarraymTX模板.

更改运行时

1,清理运行时的Makefile
2,新增了用D实现的C标准原子头文件

更改库

1,isForwardRange现在带可选元素类型.
2,清理Makefile

更改编译器

不推荐按断定条件使用串字面

可能会无意中,布尔计算串字面,如,当本意是assert(0,"message"),结果却缺少0时.

assert("unexpected runtime condition");
static assert("unhandled case for `", T, "`");

2个断定总是默默地没有效果.现在,会通过弃用消息检测到它们.如果确实需要原始行为,请改用expr !is null:

assert("" !is null);
static assert("" !is null);

清理编译器的Makefiles

已弃用一段时间构建编译器的Makefile(compiler/src/{posix,win32,win64}.mak),并最终会删除它.

立即直接使用compiler/src/build.d工具见文档,

或通过仓库根目录中的顶级Makefile,一步构建编译器和运行时,如,使用LDC主机编译器的优化构建:

make -jN HOST_DMD=ldmd2 ENABLE_RELEASE=1 ENABLE_LTO=1

顶级Makefile已从posix.mak重命名为Makefile(已弃用posix.mak转发器).一些目标语义略有变化,如,现在测试,安装和清理目标中都包含d运行时.

旧版src/posix.mak文件仍存在,但会转发到顶级Makefile.因此,如,默认的所有目标现在不仅是编译器,也包括druntime.

扫描二维码关注公众号,回复: 17363558 查看本文章

完全删除顶级的win{32,64}.mak传统src/win{32,64}.mak文件(对DigitalMars的make).
通用的顶级Makefile也适合带有GNU的make(及提供bashGNU工具的git安装)的窗口平台.

删除早已弃用的compiler/test/Makefile,直接使用compiler/test/run.d,见文档.

无法识别的编译指示不再是错误,而是简单忽略

以前,除非使用dmd-ignore开关,无法识别的编译指示会发出硬错误.现在,总是忽略它们,且忽略-ignore开关.

模块构造器,添加了@standalone

两个模块相互导入,且都有模块构造器时,因为无法确定先运行哪个模块,druntime错误.

可用pragma(crt_constructor)绕过,但在C运行时构造器中,不会初化druntime.因此,不能在此类构造器中使用垃集器(GC).

@standalone是个新属性,可用来标记在初化druntime运行的,且不依赖在它之前运行的其他模块构造器的模块构造器,因此不会导致循环依赖错误.
它必须从core.attribute导入.

编译器不会验证模块构造器是否确实不依赖正在初化其他变量,因此必须人工确保.因此,必须按@system@trusted标记它们.

import core.attribute : standalone;
immutable int* x;
@standalone @system shared static this()
{
    
    
    x = new int(10);
}
void main()
{
    
    
    assert(*x == 10);
}

如果可能,最好把有问题的模块构造器,放入它们自己的更小模块中,而不用@standalone来解决循环依赖错误.

已转换_d_newarray{mTX,miTX,OpT}为单个_d_newarraymTX模板.

_d_newarraymTX模板,现在使用DBI来检查数组中元素的类型需要哪种类型的初化器.因此,它替代了_d_newarraymTX_d_newarraymiTX.

_d_newarrayOpT是上述两个勾挂通用实现.它首先按指针数组分配"外部"数组,然后调用_d_newarrayT_d_newarrayiT,来相应分配初化"内部"的一维数组.

现在,因为已合并_d_newarraymTX_d_newarraymiTX,不再需要这样做.

现在,编译器执行以下降级操作:

S[][] s = new S[][](2, 3)
//现在降级为:
S[] s = _d_newarraymTX!(S[][], S)([2, 3]);

此更改添加新模板core.internal.array.construction.

更改运行时

清理d运行时的Makefile

{posix,win32,win64}.mak几个Makefile已合并到一个通用Makefile(包括druntime/test/中的Makefile).目前按已弃用的转发器保留posix.mak.

窗口上,也可/要GNUmake(及提供bashGNU工具的git安装)用通用的Makefile.窗口开发者终于可通过-j利用并行性了!

在此下载预构建的gnumake.

用D实现C标准原子头文件

模块目标是帮助把代码从C移植到D语言,并尽量提供与系统C编译器相同的生成代码.
如果不存在函数名的别名,且不关心生成代码质量,则可附加_impl来取实现.
如果给定函数提供的生成代码与系统C编译器不能比,且对你的用例很重要,请报告漏洞.

更改库

isForwardRange现在带可选元素类型.

isForwardRange现在有个可选的默认为void第二个模板参数.如果不是void,则仅当区间元素类型与此额外参数模块类型相同时,计算结果才为true.
如,isForwardRange!(int[],const(int))true,但isForwardRange!(int[],string)false.

猜你喜欢

转载自blog.csdn.net/fqbqrr/article/details/135350983