2510d,d正式通过版本
原文
接受它的理由是:
1,需要一种发展语言,同时最大限度地减少用户在更新旧代码时的痛苦,即在不破坏内容的情况下破坏内容
的方法.
2,随着语言的发展,版本
将为我们提供不需要担心现有代码,而打破事物更多的空间
.它并没有完全消除出现问题
的可能性,但确实更自由了.
3,用户可更新到新的编译器版本
,以利用非中断性更改和错误修复
,且仍然选择,除非准备就绪
,否则,仍不将他们的代码升级到包含破坏性更改的最新版本
.希望因为新功能破坏代码而冻结特定编译器版本
的日子已经过去.
对比草稿
的更改,草稿:
1,明确-E
开关不修改导入路径
;
2,确定版本的标识符
始终是其发布年份
;
3,删除了特殊的"__EDITION__"
关键字,并添加说明原因的注释.
前面部分相同,见草稿.
在模块声明
中,可可选
地包含版本标识
来指定目标版本
:
ModuleDeclaration:ModuleAttributes(opt) module ModuleFullyQualifiedName Edition(opt);
Edition:DecimalInteger
在发布版本(edition)
时指定特定版本的标识
,且总是是发布年份
,如
module mymod 2025;
每个D编译器
版本都预定义
了一个默认版本
,当模块声明
中没有显式指定目标
时,该版本
将变成目标版本
.此默认值
总是是编译器
发布时最新
的正式发布版本
.
为了帮助按新版本
转换现有代码
,可用(如-edition=2025
)编译器
标志,覆盖给定编译器
调用的默认版本
,其中2025
是版本标识
.
此DIP
还推荐一个E开关
,允许用户为给定路径
中的所有导入模块
指定默认目标版本
.此目标
覆盖给定路径
中模块的默认版本
和(如果有)-版本(-edition)
标志.一例:
dmd -E2024/path/to/imported/modules
如果给定的路径
尚未在导入路径集
中,则仍必须使用-I
来添加它.
dmd -E2024/path/to/imported/modules -I/path/to/imported/modules
要选出版本
,这样使用D的无版本
编译一组模块
,可用-版本
或-E
标志指定"零版"
的0
标识,如-edition=0
或-E0/path/to/imported/modules
,代表无版本
.
该DIP
建议,这样修改DUB
,这样DUB
的配置文档(dub.{sdl,json})
包含一个允许指定目标版本
的版本字段
.默认,不包含此字段
的DUB
配置将使用ZeroEdition
目标来覆盖预定义
的编译器默认值
.
这样,无需用户干预
,将继续编译有旧代码基
的依赖项目
.
兼容
该DIP
建议,仅当都按该版本
转换d运行时
和d标准库
时,才能正式发布版本
,即最终确定.
该特征是为了后向和向前兼容
;面向一个版本
的D模块
应该可导入面向任何其他版本
的D模块
.模板
必须遵守定义它的模块
所针对的版本的规则,而不是实例化
它的模块.
兼容
是在源码级
;没有承诺ABI
兼容.所有代码,无论是新旧代码
,都必须使用相同版本
的编译器
编译.编译器
发布时,将只提供(必须支持所有现有版本(editions)
的)d运行时
的一个版本(version)
.
安全说明
更高版本
可能会修复,因为担心破坏现有代码
的在早期版本中@safe
无法修复的问题.此时,此DIP
建议按@系统
标记以前版本
中的函数.或引入@trusted
导入来解决.
版本可以做什么
见草稿.
缺点
和可能的问题
编译器复杂性
虽然此功能将简化
尚未编写的D代码
,但它将引入考虑语言每个版本
的要求,从而使编译器
更加复杂.限制该复杂性
的一个可能方法
是仅支持最后N个版本
,即N<5
个版本.