您现在的位置是:首页 >技术交流 >d2304月会议网站首页技术交流
d2304月会议
-J
编译器开关
接着,Dennis
说,据他所知,添加-J
是为了避免串导入
被用作恶意软件载体.在他看来,串导入风险不大.
Martin
谈到了Symmetry
在他们的代码基中使用-J
,atila
告诉他是如何在雷鬼中大量使用它的.Dennis
建议按根目录对待-J
目录,并添加其子目录到搜索路径中.Martin
和atila
都表示,(在导入式
中包含完整
路径时)编译器已允许从-J
目录的子目录导入串
.
DMD
后端
Dennis
说,因为DMD
后端与DMC
和C++
编译器(DMC)
共享,因此,更改
后端不能破坏DMC
,并要检查.
既然ImportC
很重要,是否仍需要不破坏DMC
的维护DMD
的后端,或让DMD
后端仅针对DMD
,并及时冻结DMC
.
沃尔特
说他已放弃了维护DMC
.DMD
后端现在不必再维护DMC
.Dennis
说,这会更容易维护
后端,可删除源码
中DMC
相关注释.沃尔特同意了.
Dennis
说,构建DMD
时,后端使用一些,使用extern
声明而不是D导入
的翻译后的头文件
.应该更改它们为更现代的D
.沃尔特同意了.他没有利用分离
来重构,但不久前已停止支持DMC
后端后向移植的更改.
丹尼斯接着注意到有一堆版本(Mars)
和版本(scpp)
块,并问,是否可更改为版本(全部)和版本(无)
,然后再删除它.
Walter
说他并不急于大规模的重构
,但是是的,这很好.除了修复错误之外,他已有一段时间没有在后端
工作了,且在此过程中逐渐更改
为D风格
.
他举了最近涉及修复内联错误
时的一些更改的示例.
Walter
表示,ImportC
可能永远不会取代DMC
,主要是因为DMC
也编译C++
代码.Dennis
补充说,DMC
仍提供16
位支持.
更新:Dennis
已提交了几个PR
,从pt1
开始,从后端删除
函数原型.
马蒂亚斯
他有个开放的PR
来修复与-preiview=in
相关的CTFE
错误,这里.
在PR
线程中,Martin
指出了参数式
求值顺序的问题,Martin
解释了在存在异常
时,要如何处理析构顺序
.
这导致Mathias
掉坑里面,因为似乎有时CTFE
中不调用析构器
,所以PR
停滞不前(在我写这篇文章时它仍开放).他计划完成它,来使-preview=in
可默认启用.
拉兹万
修复问题
Razvan
报告说,他主要修复
编译器中的段错误,并发现C++
混杂器中有一些ICE
.他提交了一些PR
来解决这些问题.特别是这个,他不确定修复
是否正确.他请马蒂亚斯
看一看.
Razvan
也一直在修复一些nosharedaccess
问题.他看到了atila
报告的回归,但除此外,没有其他开放的nosharedaccess
问题.他预计那里会有更多的八哥,而阿蒂拉预计他会找到一些.
BetterC
链接器错误
接着,Razvan
说他一直在研究BetterC
的错误.然后,他描述了与CTFE
中实例化模板
相关的问题.
当模板包含运行时勾挂
时,如果它仅CTFE
且不生成代码,则在BetterC
中没有问题,但有时在运行时
相同的实例化,前端
没有抓住它,会导致链接器错误.
Walter
针对BetterC
中@nogc
函数相关问题的修复发现了该问题,并且PR
还引入了回归.
Razvan
随后描述了相关BetterC
问题.有时,编译器会试从语义
上分析生成的函数体
,并在出现故障时按禁止
标记该函数.
然后,他描述了BetterC
中可能出现的一系列后果:生成
函数最终实例化了使用DRuntime
勾挂的模板,而即使禁止
了实例化它的生成
函数,也实例化它,并最终会导致
链接器错误.
他说,根本
问题是编译器目前无法在缓存
模板实例后重新分析
它们.他不确定如何最好地解决该问题.他说他不喜欢编译器按特例
的处理方式:如果在ImportC
中,请这样做,如果你在BetterC
中,请这样,如果在CTFE
中,请那样操作.
阿蒂拉和马丁点头表示同意.马丁说,这是的BetterC
的主要问题.它充满了前端和胶水层
的黑客.
马丁说,他在BetterC
中看到了许多缺少符号错误
.其中大多数与编译器优化
的删除模板
有关.他描述了它的工作原理,并指出,使用-allinst
开关时,没有该情况.
他建议在BetterC
中出现链接器错误
时,先要尝试它.-allinst
工作时,问题可能只是删除模板
.
关于重新分析
模板实例,Martin
说编译器确实
试这样做.
仅如下工作时,
static if(!_traits(compiles, ...)
而
static if(!__traits(compiles, something) {
// 干something失败的测试
}
这就是该有趣问题的原因
分析模板实例化
失败,且编译器遇见第二个
实例化时,它会不断地试
,有时因为前向引用
问题(他为万恶
之源,并说这是前端
遇见的主要
问题)而工作.
阿蒂拉同意不应按特例
工作.应该达到BetterC
闲着.如果代码不需要运行时
,则就不应链接它.
不必特殊
操作即可获得该行为.-betterC
开关唯一应该做的,就是告诉编译器
分析代码,并告诉你在BetterC
中它是否管用.其他一切都不变.
沃尔特说,问题
根源是,在BetterC
中使用CTFE
.CTFE
总是使用GC
分配.阿蒂拉说,在BetterC
中这应该是可以的,拉兹万同意了.
Walter
说,问题是:编译器如何知道只在CTFE
中使用该函数
.
最终,Martin
说根本问题是BetterC
在前端而不是在胶水层
中检查(TypeInfo,ModuleInfo
等),这对CTFE
来说是个问题.
如果是在胶水层
中完成的,则是个麻烦
,因为每个编译器
实现都必须这样,但至少
仅当要生成编码
时,才会遇见问题.
Dennis
问是否应该有个检查Semantic3
和codegen
的单独BetterC
趟.马丁说,这至少是个选项.阿蒂拉重申,BetterC
应该闲着.Martin
同意这是好的长期目标
,但在到达那里之前,需要摆脱模块及类型信息
.
atila
说如何表示仅CTFE
函数.与其添加新的UDA
,为什么不直接使用in(__ctfe)
合约?这样编译器因为不必
查看函数主体,就更容易分析
了.
Walter
说他会用
if(__ctfe} { //
代码
} else assert(0)
atila
认为合约比这更漂亮
,Walter
同意了,它确实避免了新语法
的需求.
atila
说,因为它按"我只在CTFE
工作,所以不要调用我"声明函数合约
,这也是对的.这甚至不是黑客
.丹尼斯认为因为仍可取它的地址
,这有点黑客.
你必须按静态条件
对待它,但__ctfe
是运行时变量
.沃尔特认为这值得探索.
Martin
建议使用if(__ctfe)
作为模板约束
,而不是用in
合约.Dennis
喜欢该想法,但Walter
说他不想开始把模板约束
应用至普通
函数.
这会是新的语法,而这就是in(__ctfe)
所避免的.atila
说它表明模板函数
,而不是想要的.
更多关于BetterC
的信息
接着,Razvan
提到了TeodorDutu
把DRuntime
勾挂转换
为模板的工作.该努力的一个期望副作用
是,应该使代码在BetterC
中更有用,但有时,在这些模板
中完成实际
工作表明,要调用C库(memset,memcpy
等).没有标准C库
时,这是个问题.
Walter
说,BetterC
应在有标准C库
时使用,因此可依靠这些函数.
这触发了更多BetterC
链接器问题及如何缓解的讨论.最后,马丁说BetterC
是一把大锤
,因此有前面Razvan
提到的特例代码.应努力减少
该情况.
Walter
说应该考虑重新设计功能
,这样就不需要TypeInfo
了.atila
认为总是应该选入TypeInfo
.现在可用编译时
反射来生成
所有这些.
Martin
说,在此可用新的模板勾挂
(LDC
中的GC
到栈
优化需要些额外的工作).问题是关联数组
.他们大量使用TypeInfo
.他提到了SS实现,据他所知,它没有TypeInfo
.也许最终可用它.
马丁
DIP1000
问题
遇见使用std.algorithm.all
相关问题.在@safe
代码中,可避免遍历有opEquals
的结构数组
,而用户端
对此无能为力.
他说是Phobos
的错误,但他怀疑
这是编译器推导属性
问题.他还没有时间化简
并提出问题.
atila
说,这里的主要要点是处理弃用
非常耗时,尤其是在第三方
代码中时.此时,很难找出为什么按@system
而不是@safe
推导弃用
代码.
也许应该重新考虑DIP1000
.至少,对称性正在投入资源,但大多数人会放弃.
Dennis
说他更喜欢尽量不用
中域(return scope
),而是让编译器推导
它.当有人因为编译器错误而导致中域
错误时,打开BuildKite
项目来修复
相关问题很烦人.
DIP1008
问题
接着,Symmetry
的一个项目使用DIP1008
.这是对的,因为它是个与DotNet
代码交互
的项目,它也有一个GC
,当另一个GC
活动时,无法可靠
地挂起另一个GC
,因此他们一般避免使用D
的GC
.
他们仍需要抛异常,因此使用-preview=dip1008
.现在,想静态链接该项目
到主项目中.问题来了,(大约300
个)所有拉入的配音
项目都用它编译
.
这会导致乱码
异常消息,因为非DIP1008
相关代码不会阻止
异常逃脱其域.
Martin
提出了,用另一个DIP1008
实现,唯一的变化
是禁止nogc
检查抛式
.他说,团队告诉他,因为异常
,他们可把垃圾
留在周围.
这项工作很容易.他建议按实验
实现,如果适合他们的代码基,则将其上游化.这表明不依赖malloc
和引用计数
,只是从GC
分配且永远不会释放
它.因为,在该项目中始终禁止GC
的.
沃尔特说,他有点抱歉D有异常.它们是无休止
问题来源.事后看来,使用可选
类型更好
,但当时他只是遵循C++
和Java
.
可从标准库
中删除
异常,以便可无异常的可靠
使用它.另外是继续在标准库
中,尽量减少使用GC
.
Dennis
说,在Phobos
中,有些地方的异常
,在API
中根深蒂固.他特别引用了区间
,你可在其中解码
文本并获得UTFException
,或解析
数字可能会触发ConvException
.
要更改
此设置,需要所有用户解包整数
,解包代码点
等.atila
说可用行为与现在
一样的alias this
,如果用户忘记解包
,则抛
异常.丹尼斯说这是个有趣的想法.
Walter
举例说,在std.path
中使用std.algorithm.chain
,来避免在连接
路径并返回
时分配
内存.
标准库
中是否有类似
帮助避免内存分配和异常
,但他还未深入
研究如何消除
异常.
阿蒂拉说,他一直在考虑复制(HerbSutter)
零成本C++
异常的想法.他说,基本思想是,保留
语法的同时摆脱异常
.PDF的链接.
沃尔特
Walter
一直暂停
实现新功能,并处理ImportC
错误列表.最大
问题是系统头文件
中编译器扩展的普遍性,而且几乎总是不必要的.
咆哮:一个头文件在FreeBSD
上编译,但不能在macOS
上编译,另一个头文件在macOS
上成功,但在FreeBSD
上失败,微软是最严重的罪犯等.
ImportC
旨在成为标准C编译器
,但你不能使用标准C编译器
编译系统
头文件.必须实现很多扩展
来使之正常工作.
从好的方面来说,在这方面取得了很大
的进展.如,他已想出了如何用几行
代码实现语句式
.他很震惊,只有几行
字就可了,并对结果感到满意.
因此,在让ImportC
编译所有这些随机.h
文件方面取得了良好的进展.
他想尽快删除ImportC
错误列表,并转向其他错误.几周后,他在论坛上发布了有关此内容
的文章,并呼吁帮助查找有问题的C头文件
.
然后他重申,想减少Phobos
中的GC
和异常,并消除TypeInfo
等依赖项.越彻底越好.
沃尔特
最后说,他有很多
工作要做.他说他感谢Razvan
和Dennis
帮助他的拉动请求.他们帮了大忙.