d的2303会议
原文
拉兹万
预览开关
Razvan
一直在查看-preview=nosharedaccess
报告的问题,但只从atila
那里找到了少数几个.表明或有个没有很多错误
的良好实现,或它没有大量使用
它.阿蒂拉认为没人用它.
Razvan
指出,atila
报告的一个错误是试实例化
共享类会导致
错误.
如果不工作,则有其他
问题.他想知道如何使预览
成为默认值.除了等待
人们使用并报告
错误外,还能做什么.
atila
说他一直让Phobos
和DRuntime
用它编译,然后一旦这样做了,就可在配音
包上试一下.他说他遇见了太多
噪音,决定等到修复报告的错误
后再报告更多
.
Iain
建议应该有个默认
打开所有预览开关
的管道
.Dennis
指出,对破坏的预览
开关,有问题.
Mathias
问好的预览
测试会如何.他试它们时,遇见了nosharedaccess
和rvaluerefparam
不管用的问题
,然后他放弃了预览
.
atila
不知道好的
预览测试,但正在努力浏览预览
并决定设置它们为默认值或废弃它
,尤其是那些已有多年
的测试,这样就不会有问题.我建议,在构建
时,制定一项定期
审查预览的策略
.
Razvan
说,主要问题是预览开关
是否达到了期望
目的.它们的目的是为了,让人们可在新功能
正式成为语言
的一部分之前对它测试
,但,似乎很少使用它们.
在合并新功能
到编译器版本
之前,应该有个不同
机制来确保
经过测试,然后一旦合并它们
就可用了.在他看来,预览开关
是功能
的坟墓.
我说这似乎是个沟通
问题.现在,只是在预览
开关后面抛一个功能
,除此
外闲着.我建议提出分阶段
的过程,激励人们使用预览
.
罗伯特更激进.对想要合并
新功能以测试
它的人都应该负责
,用新的编译器版本
测试dub
包的新功能,然后调查
错误.前30
个等应,在用和不用
预览开关都能编译
.阿蒂拉同意了.
马蒂亚斯
说,预览
想法很好,可工作
.只需要认真对待它.他说他同意罗伯特
.当他实现-preview=in
时,他完全按Robert
的建议做了,测试允许默认.
他默认
启用它,然后检查
它破坏了什么.一般,预览
是使用半生不熟
代码实现的,不会测试
是否有效
.需要确保
,实现预览版的人员正确
干活.
Walter
说可为每个预览
功能提交拉取
请求,来默认
打开它,但不必合并
它们.来确保它通过(测试几个配音
包的)BuildKite
运行,就有中断
代码的链接.然后,联系了破坏了的包的维护者
,帮助升级
他们的代码.
最后,决定让Razvan
和atila
收集所有预览开关
问题,可在未来的会议上决定他们的命运.
@system
和纯
Razvan
说,偶尔会出现@system
和纯
代码的问题.他说,试做如分配
而不初化
内存的系统级
的事情,可能会与纯
冲突,而在@safe
代码中,纯
一般是兼容
的.
但可做一些事情,比如在@safe
代码中,void
初化栈变量
再返回它,现在两个
概念冲突
了.他期待安全
和DIP1000
成为默认
,他想知道是否可强制不必同时有安全
和纯
.
这触发了侧面
讨论,即为什么会在不初化
内存,就分配
内存等.罗伯特说,无论应不应该这样做,语言都允许
这样做.或语言应阻止
它,或它应工作,或给出
有用错误消息.仅告诉人们不要这样
是没用的.
Razvan
以std.experimental.allocator
为例.像Mallocator
此类,不可能是纯
的,但在纯
代码中仍需要使用这种分配器
.Walter
说,从根本上说,存储
分配器不可能是纯
的,语言的行为
是正确
的.
如果想从纯代码
调用分配器
,则必须在代码中做些肮脏
的事情.这是可以
的.语言不应默认
支持使存储
分配器为纯
.它正在工作
,说因为你在改变状态
,因此你不能这样做
.
所以必须有肮脏
转换来伪造
它.D
支持系统代码的原因是,可在必要
时做些肮脏
工作.D
不支持逻辑常
,因为逻辑常
不是常
.
这不是强制
的.这是一个功能
.如果想要逻辑常
,你必须做些肮脏
工作,这是合适
的.
Walter
还表示,在纯代码
中是否应允许void
初化是另一个
问题.void
初化int
,并返回它,不是纯
的,是吗?所以也许,在纯
代码中,应禁止void
初化.这是个合理
的主张.
atila
同意并补充说,系统
调用本质不是纯
的.他们不纯
不重要,否则就是撒谎
.沃尔特同意了.系统
调用一般会更改系统
.
编译器无法区分
.也许有些真是纯
的,可单独标记
它们.但总之,只需要欺骗
它.他喜欢D的常和纯
的概念是严格
的.
丹尼斯有个"疯狂
命题",不确定自己是否同意:是否去掉纯
,人们似乎不喜欢属性
,他没有遇见人说"哇,D有纯
,它节约
了我所有的代码".他的意义?丹尼斯说他也使用纯
,但从不觉得自己
真需要它.
atila
说,在Symmetry
,因为人们在应该
用纯
时而不用纯
,就会缺少
纯带来的功能
.他引用了SIL
项目(Symmetry
内部DSL
)的一个示例:
查找
函数名的功能,涉及
调用函数并取其输出
,你不会想调用格式化
你硬盘的函数
.如果标记D函数
为纯
函数,那么在SIL
中也是纯
函数,因此此时
是可调用的.
Walter
指出,纯
函数也可毫无风险
地成为多线程函数
.他们不与其他
东西互动,在自己的岛屿
上生活.atila
说,也可从纯函数
初化不变
的东西,这也非常方便
.
Robert
说,在Symmetry
的D代码
中,有些函数
是纯
的,因为标记
它们很简单.其他都不是纯
或不变
的.对每个示例
,都可找到一个反例
.
沃尔特说纯
可能很难使用,但应该
是一个目标
.编程中的一个好原则
是,函数
中一切都应该通过前门
.如果能让函数为纯
,就对了.你知道:它没有副作用
,它是线安
的等等.
伊恩
目前,他有几个
问题需要解决.运行
测试包时,他缺少一些模板
符号,可能是因为模板发布
策略的变化.影响他的原因是,他使用单独
编译来构建DRuntime
和Phobos
.他还没有找到时间解决该问题.
Martin
查询模板发射
错误出现在哪个前端
版本,及是DRuntime
还是Phobos
显示它们.伊恩说,它在一月份
之后进入了标准库主线
.因为链接时
故障,返回为未解决
.他觉得他可能是唯一使用单独编译
来构建DRuntime
和Phobos
的人.
Martin
说他现在只使用单独
编译来单元测试
,否则内存
使用量会爆炸式增长.Iain
说他也单独
编译单元测试.单独
编译每个单元测试
非常有帮助,因为可在make
端增强并行性
,且一个失败
的单元测试模块不会阻止
其他模块的测试
.
Iain
说,codegen
胶水也有了一些变化,它们一直在引入回归
.因为这样的更改是在dmd
后端,所以他可弄清
如何实现的,及需要做什么来为GDC
实现它.
然后,一旦他这样做了,他就要花15
分钟弄清如何打破它.然后编写
的第一个测试,就有运行时
破坏.
GDC
文档现已在gnu.org
在线.他说,可能还有些空白
需要补充.
他一直在支持GCC
的C++
开发者移植D
到他们的平台
上.他们提出了一些观点
,其中一些可很容易地解释,如,结构和类
间的区别,但其他
观点更有趣.
不移植
的原因有,仍为只包含字段
而不包含函数
的extern(C++)
类生成虚函数表
.
另一个是D禁止标识
符号中使用破折号
,因此如foo-bar.d
不能用作模块名,而C++
中可以#include foo-bar.h
.
他们发现此文件名
约束是非常令人惊讶
的.
Dennis
指出,文件名
中的破折号出现在ImportC
中,特别是在试导入Wayland
标头时.
沃尔特说你只需为它写个包装器
.创建另一个只#includes
有问题头文件的头文件
,或把有问题
文件放在命令行
上并使用-mv
重命名它.
他不认为这是个重大
问题.Iain
说,你只是在围绕一个对你不利
编译器工作
.沃尔特说,这两个处理方式都不繁重
,所以不想为此改变
语言.
我注意到ImportC
背后的要点在于它"只是工作
".这就是目标
.沃尔特同意了.我说过,需要"正常工作"方面的人并不关心这两个解决方法
.
沃尔特说应该
记录下来.阿蒂拉说他甚至不知道有-mv
.Martin
补充说,如果正在处理小组
文件,包装器解决方法
很好,但如果它是带有大量
有问题的头文件名
的大型代码基,它就不管用
.
沃尔特说,他对ImportC
有很多问题,这是个低优先级
,且不是阻碍因素.ImportC
不编译标准头文件
.这是个障碍,因为没有解决
方法,这应该有优先级
.
文件名
问题有解决方法,所以不是阻碍.无论如何,ImportC
都需要有效
标识模块名
.也许像pragma(mangle)
会有帮助.
Iain
突然想到:是否有一份如何从C++
思维方式编写
D代码的文档.Walter
说应该看看,与C++
对接页.这是一份迫切需要现代化
的旧文档
.
Dennis
和Mathias
都在聊天中链接到上面链接,Mathias
建议,把它作为更好的关于语言功能
的对接C++
页.
我提到了一本名为<C++的Java书>
的书.如果对两者
都有深入了解
的人有时间写一本"C++的D编程"
的书可能会很好
.
Walter
认为D在与C++
对接时,可能有Java
相同的问题,因此可作为D版本
需要涵盖内容
的指南.
阿蒂拉
atila
报告说,因为在与C#
交互时遇见了一些问题,他在Symmetry
上就DIP1008
有一些内部讨论.因为D
和C#
各有一个GC
,因此它们不想只是从一个GC
分配内存转移到另一个,因此到处使用了@nogc
.
他们遇见了异常
问题.DIP1008
对他们不管用,最终不得不
手动处理引用计数
.问题根源在于他们正在与C#
交互,而使用的D库
很古怪,所以不确定是否有可操作
的东西.
马丁
补充说,如果对抛式
,跳过检查@nogc
,他们会很高兴.特别是最近在生成栈跟踪
中,更改
为不使用GC
.他想实验看看,是否帮助Symmetry
中的用例.
atila
最近一直在和Iain
谈论ImportC
,稍后需要和Walter
谈谈.他也一直在和马蒂亚斯
谈论配音
.atila
认为把他在雷鬼
中的工作,放在配音
中是有意义的.大多数人都会使用dub
,所以把雷鬼
功能放在那里
是有意义的.
他重复说,他一直在通过预览
开关来决定他们的命运
.如果它们是新的,那很好,但是像rvaluerefparam
和nosharedaccess
这样的已存在很久
的东西,需要成为默认值或删除
.他开始试用nosharedaccess
编译,并立即遇见了一堆错误.
最后,他问大家对把Phobos
放入dmd/druntime
单独仓库有何看法.伊恩说,对他而言,DRuntime
和标准库都是一回事.
马蒂亚斯对此表示支持.罗伯特说,如果这样,他要做的第一件事就是用标准库
版本替换一些过滤
实例,因为应该在DMD
中使用标准库.(注意,此处没有做出最终决定).
沃尔特
独立组件
最新,已可以使用独立
组件.
导入C
ImportC
正在慢慢磨合.首要
任务是在所有平台
上编译所有标准头文件
.用不同编译器
,试编译了各个平台上的许多系统.h
文件,但失败
得很惨,每个文件
都以独特的方式失败.
如果可编辑
这些文件,则很容易修复
,但当然,他不能.因此,只能试提出创造性
的解决方法.这是高优先级,在ImportC
失败时,通过导入系统头文件
来使用ImportC
的人都会退出,并标记它为不可用
.
CTFE
中的模板降级
他发现的一个问题
是,语义
例程带多个
构造并按模板降级它们.即使在CTFE
中运行时,也会这样.这些模板会产生很多膨胀
.
在CTFE
中,它不应降级.CTFE
发现按高级
代码解释更容易.经过调查,他发现CTFE
反转了一些降级
,以便可解释
它们.
如果在CTFE
中工作,比如连接数组
,你会遭受大量
不可见的模板膨胀
.这需要解决.他大约完成了一半.
他正在查看
所有降级
并重写
它们,这样在CTFE
中,不会降级
.他想这是减少
内存消耗和CTFE
速度慢问题的又一步.他还想消除解释器
中出现的"展开降级
".
Iain
指出,在重写_d_newclass
运行时勾挂
为模板
的PR
中,他注意到了Walter
刚描述的相同内容
.他让作者更改
,而不是降级>不降级>重新降级
,在叫降级
的字段中放入重写
,而保持原节点
不变.通过CTFE
时,只需专门
在该节点上工作.
然后,一旦生成代码
,你点击
该节点并进入降级
字段.Walter
说,还没有完成其他
重写,但TeodorDutu
和Razvan
计划返回
并改变
它们(这是为此工作的一个示例).沃尔特说,这也允许是在BetterC
中更广泛地使用CTFE
的一大胜利.
我
我建议将季度
分成两个
单独的会议:每月第一个
星期五的季度
会议供工业人
参加,然后在下个
星期五举行月度例会
.大家都同意了.
马丁
马丁说,他一直忙于ldc
,因为他必须赶上最新的DMD
版本.这总是好的,因为他对未经DMD
测试的平台有CI
测试覆盖率,因此他一如既往地发现了些小回归
.这些已在DMD2.102.2
中修复.
他发现了一些与降级
模板运行时
勾挂相关的回归
.如,数组
连接的新降级表明CTFE
串连接不适合WASM
等目标,因为新降级要求
一些标准的C绑定
.幸好,修复
起来很简单.一般,这些降级
需要在这方面仔细设计.
atila
想知道是否可添加LDC
到CI
中,以便可提前抓此东西.马丁说没办法.
他对Iain
提到的新的"降级
"字段感到非常高兴.他们一直思考,是否有降级更高级
的AST
到实际代码生成AST
的第四个
语义阶段,这似乎是朝着该方向迈出的一步.或至少等等.
从ldc
胶水层来看,2.102
版本中更大
变化之一是比较向量
.现在它们基于前端AST
结果,生成向量掩码
.他很惊讶,因为更改
没有进入更改日志
.这对浮点向量,是个痛苦.
按位操作符
不适合浮点向量
,因此他不得不再按按位
操作的整数向量
,来解释转换它.在这方面,GDC
和LDC
按再解释转换(C++重转)
来转换
向量(如,转换float4
向量为int4
),但对DMD
,这只是个转换
.
这是个重要
的区别.另一件事是,目前在DMD
或GDC
中不能比较标识
,因为在前端
会阻止它,但LDC
确实支持这些
,并降级它们来产生标量布尔值
.
马蒂亚斯
Mathias
想通过dub
来克服潜在
依赖项带来的错误
.依赖项
是子配置
的一部分,但启用
了不同的子配置
时,根本不应拉入该依赖项
.是报道最多的配音
问题.
如,目前不能有仅测试
依赖项,因为这会污染
其他所有内容.他一直在研究该问题,及最近
与阿蒂拉讨论所推动的一些速度改进
.
另一件事是他想默认
启用-preview=in
.他对它的工作方式相当满意.他在生产
中已用它多年了,它完全按期望
工作.
为了简化过渡,还缺少
了一些小东西.一个是在函数字面
上推导存储类
,这是他在会议前几天修复的一个错误.他仍在试找出一些事情的最佳弃用
路径,但越来越接近可启用
该功能的状态.
他说他想在栈跟踪
中看到高亮
,所以他一直在研究dmangler
,以便可直接从demangler
上高亮D符号
.如果它不管用,那么它就不管用,但它肯定会使demangler
代码更好.