d的3月会议
Martin
:LDC
已准备好下个主要版本
.
改变extern(D)
调用约定,不再反转
形式参数.直到最近,DRuntime
和编译器
间还有相互依赖
.当有人修复矮人
发射时,尤其有问题.
一个问题是,带多个参数
并假定参数
在特定寄存器或栈槽
中的裸asm
函数会中断
.必须改变Phobos
,使LDC
的Phobos
和上游Phobos
间有差异.如果DMD
可效仿,那就更容易了.
伊恩
弃用
Iain
一直在结束已弃用和遗忘
弃用期,并为没有的弃用功能
添加结束日期
.他重复了几个示例,其中一些现在是错误的.Walter
查询了复类型
的状态.Iain
说已弃用他们了,但现在还有一个日期.
在这次讨论中,Iain
记得他想在std.complex
中加toNative
.尽管库实现与C类型
是二进制兼容的,但具两个双精
结构可能不像C复类型
那样按参数
传递.这时,该toNative
函数可确保兼容.
域结构
Iain
在迭代弃用功能中提到区间接口
.这导致了域构
和域类
类型的对话.在实例级scope foo=new Foo
成为公开强制栈分配
前,它开始作为类型声明
的一项特征,如,域 类 Foo{}
,含义是所有Foo
实例都在栈上分配.
这有组合
问题(如果类型
成员是scope
类型,则该类型
也是域类型
).最终,每个人都同意弃用域类型
.(从那时起,已经合并了两个PR
,它们不赞成struct/union
和enum
声明及类声明的域,这里,与这里).
Martin
查询Iain
在上游提交的一系列PR
,Iain
回答说他一直在测试
各种目标(BigEndian
目标,严格对齐
目标等),导致他在DRuntime
中发现了一些回归
.
更改DMD
词法分析器
Razvan
召集了几个学生,致力于将DMD
集成为dscanner
的库.替换
出现的libdparse
,但表明他们需要修改
前端,来提供与使用libdparse
的工具所期望的接口相匹配的接口
.
第一个变化是为词法
分析器创建区间接口
.Walter
要求移动区间接口
到新模块
,而不是对词法分析器
搞侵入性的更改.Razvan
说这不是问题,但确实需要更改词法分析器
.具体来说,DMD
会删除空格,换行符和注释
,但libdparse
不会,因此需要添加
代码到词法分析器中,以便DMD
用作库时不会删除它们.Walter
建议尽量为新代码
前端创建libdparse
模块,以避免加版本化块
到词法分析器
.拉兹万同意
.
DIP1008
和火卫一
在他的SAOC2021
项目(用模板
替换DRuntime
勾挂)中,TeodorDutu
遇到了有时
替换抛出异常
的勾挂会导致
链接器错误(这与混合使用不同开关
编译对象时的模板发射
有关).前进的唯一方法是使用-dip1008
编译d运行时和d标准库
.可惜,DIP1008
要求在抓到异常
在时不能逃出catch
块,但Phobos
有时通过保存异常
到变量
或返回异常
来完成.这避免了用-dip1008
编译.
Razvan
说如何解决,不明显.克隆异常
要求用户释放内存
,不好.-dip1008
此外,当启用分配栈跟踪
时,DRuntime
仍用GC
分配异常(正如Razvan
在他于2019
年提交,现已关闭的PR
中首次发现默认启用-dip1008
,这里).
Martin
指出,跟踪拆解
时也用GC
.对此,Walter
最终要求Razvan
确保存在与Razvan
的PR
相关联的Bugzilla
问题链接.
引用计数
通过旧的DRuntime
拉取请求,Razvan
发现几个PR
添加了引用计数
的东西(RCArray,RCPointer
等),当时引用计数
是D社区
的热门话题.D
中引用计数
的问题在限定符的传递性
(如,不能引用计数
不变对象).Razvan
记得他为存储类
起草了DIP__metadata
,这里.
在关于DIP
的论坛讨论中,TimonGehr
指出了它的两个基本问题,这里.最终,Razvan
的进展停滞了,未提交DIP
.
会议上,说想听听社区现在对该DIP
的看法,但想先知道这是否仍然重要
.涉及引用计数
和不变
的各个方面讨论:更严格形式的C++
的mutable
(以类似__metadata
的形式:不是类型|对象状态
的一部分,可能存储
对象指针前等),为什么允许从pragma(crt_constructor)
修改不变变量
是不好,用extern(C) shared static this
替换pragma(crt_constructor)
的利弊(反之,在没有DRuntime
时允许初化
不变).
使malloc
和calloc
为@trusted
Razvan
接着提出了两年前的DRuntimePR
,这里,用于使malloc
和calloc
为@trusted
.本打算合并它,但Iain
删除了automerge
标签.Razvan
问为什么不能合并.Iain
说最后一次评论和应用
自动合并之间有20
个月的时间.PR
有很多讨论,所以Iain
想给它一些时间来消化它,并在必要
时重新开始讨论,以防止问题,但两周
后发现有问题.
于是伊恩
在会议上触发
了新的讨论:malloc
真的值得信任吗?对此有很多意见:从中得到了什么?两者都需要不安全
的无类型
内存转换;calloc
更强,因为它初化了内存;malloc
特定情况下可能是安全
的,如在原位
时;或无类型
时可能不是,因为它不带类型信息
等等.
最后,Andrei
断言malloc
和calloc
是不安全的,因为他们使用无类型内存
且无法绕过它.Walter
建议添加Andrei
的答案到PR
讨论中,并且PR
已关闭.Andrei
提议在PR
线程中陈述该论点,但不关闭它,以便有人可提供引人注目的代码
示例来展示如何使malloc
可信任.
Razvan
这样做了,触发了更多讨论:
讨论
最后,沃尔特做出了最终决定:
决定
丹尼斯,科佩尔
Dennis
要求澄清几个相互矛盾
的PR
规范,这些PR
旨在澄清过大的移位(如,移动33
位32
位值)会怎样.
沃尔特
解释说,这不是未定义
行为(可能导致"发射核导弹"或其他东西),但比这更软
.它要么会变成0
,要么会包装
,所以它应该是"实现定义
".
丹尼斯问马丁这时LDC(LLVM)
优化器做了什么(基于C
).Martin
说LLVM
文档指定其为毒值,在相同的文档
中定义,有时可能导致未定义行为
.Walter
指出,编译器
可选择删除
指定为未定义
行为的代码,对过度移位
,这不对.
普遍认为"实现定义
"是要走的路.
带域的栈上数组
在许多情况下,Mathias
都希望可用scope
来在栈上分配动态数组
,就像使用它在栈上分配类
一样,如,scope c=new MyClass
.他按类型安全
的可变
参数函数包装分配
,但你不能连接
它们.沃尔特说很合理.Dennis
已打开了Bugzilla
,这里.
Mathias
说,如果他有时间,可考虑实施它.
-preview=in
同意启用-preview=in
应该是默认
行为,但应该总是暗含ref
而不是让编译器
决定.上次
同extern(C++)
工作是个问题.DRuntime
中的标准C++
绑定与DMD
测试套件中的绑定
间存在些差异,因此把内容放在DRuntime
中.他指出,包含DRuntime
和D前端
的单个
存储库会很有用.
另一个问题是in
用作opApply
中的闭包参数
,in
也必须与foreach
变量一起使用.沃尔特说有道理
.
推导闭包参数
的存储类
推导闭包参数
存储类,更易写代码.指出了Bugzilla
中的老问题及链接
的讨论线程(后面2个链接),对闭包参数
是否应推导ref
有不同意见.那些想要的,按C#
中的调用点考虑ref
,但在D中,不是在调用|而是在闭包
中的参数上使用它.Mathias
没啥用.它阻止传递闭包
给默认值为ref
来避免复制等的std.algorithm
.
Mathias
很想要这个,但因为重载
时"有点棘手
"而推迟了它,但他认为这是应拥有
的.可在邮件列表
中讨论.
-checkaction=context
应该是默认值
让-checkaction=context
为默认
对语言有益,但目前已被破坏.可惜,最近一次变化
以不同
的方式打破了它.应为此找到解决方案
.该功能
很简单,一旦开始使用
它,你就回不去了.
Dennis
指出,不使用的一个
原因是,它会增加编译时间
,而Mathias
说这不重要.
推导私有函数属性
Mathias
认为推导私有
函数很好.当前阻碍
是属性推导
不适用于递归
函数.他认为解决方案很简单:应该假设函数
具有所有属性
;如果递归
,其余代码帮助推导属性
.沃尔特说有道理
;可推导
属性越多越好.
Andrei
指出,如果添加来可扩展
属性,应该小心,因为这会阻止它工作
.他还提到,由于可能的栈溢出
,关于递归函数
的安全性,可能有很简单的论点.
Martin
建议需要评估编译时成本
.沃尔特说这是合理
观点,但认为只能忍受它.有这么多属性,推导越多,用户体验
就越好.Martin
说,只要编译时间不加倍
,就可了.
Andrei
指出,已经有研究,如Java
,表明人们一般不编写
属性.更多推导
是要走的路.
别名
Mathias
说过早地在编译器
中解析别名
,导致丢失了别名赋值
的名字.如,在错误消息
中,你看到的是别名
,而不是别名自身
.它还会造成可见性
问题.有时想为私有
设置公开别名
,但不能这样,因为编译器
可直接看到别名
.
Walter
说可见性
是特性,而不是错误
.这是深思熟虑的决定.允许私有符号
的公开
别名违反了封装
.Mathias
提供了他公司
的用例,在该用例中,他们想在结构体
中隐藏私有的getter
函数aliasthis
,即允许子类型化
但禁止直接访问getter
.Walter
认为别名允许直接访问getter
,并在类型系统
中创建漏洞.
Mathias
认为它都必须在同一个模块
中完成,并且由于在模块域内private
,认为不会破坏封装
.
Razvan
建议,如果有人想在公开别名
后面隐藏私有符号
,他们应在公开
函数中包装私有事物
.Walter
同意了,要求示例.
阿里
Ali
说他设法转换他的一个程序为SSH
,复制自身
到服务器并像rsync
一样工作.
Ali
的一位同事是Rust
爱好者.他们要火拼.
沃尔特
ImportC
Walter
报告说ImportC
进展顺利,他修复了一堆ImportC
错误.可惜,有些错误是难以解决
的,可能不得不忍受它们.传递常
就是示例:C
没有它,但ImportC
有.有人在C标头
(可变
对象的const
指针)中发现了导致编译时
错误案例.沃尔特不确定这是否可解决.
ImportC
已发展到需要启动预处理器
地步.没有编译器
支持运行预处理器
是严重用户体验
问题.Iain
担心如果D编译器
正在调用C预处理器
,可能调用的不是正确的
.这导致了关于调用|拥有
预处理器的讨论.
Martin
提出了LDC
(等其他
编译器)中ImportC
的与ImportC
如何处理C头文件
有关的潜在问题.简而言之:多个D模块
中导入相同标头
声明导致C的重复
.他说ImportC
可以按D模块
对待每个C标头
.
Iain
提出了一个他认为难以解决
的ImportC
问题.沃尔特已经修复
了它.这里
Bugzilla
中的DIP1000
问题
Walter
已开始着手减少Bugzilla
中DIP1000
错误数.其中一些与需要清理的foreach
循环和闭包
有关.
一个默认进入DIP1000
问题是如何处理引用 中 域
歧义.Walter
实现了半修复.已合并了一些PR
,但其他一些停滞不前的PR
阻碍了DIP1000
,他想让那些动起来.
安德烈
Andrei
在电子邮件中讨论.
他先说,反射内置位域
很奇怪,你拥有小于8位
的东西,且无法使用指针
.有关位域
的提议都必须考虑到该点.Walter
的__traits(getMembers)
返回聚集的只是故事的一半.getter
和setter
呢?库解决方案有这些,但对内置
,它们是编译器神奇
.
为了处理getter/setter
,Walter
认为有新的trait
可查询给定的成员
是否是位域
或其他,但他还未解决.另一种
选择是编译器
可"装配"getter/setter
.
Andrei
认为,必须权衡仅针对位域
的特殊壳反射
的成本与"已经在ImportC
中拥有它们,在D中
启用它们"的便利性
.他说,反射位域
是严重负担
.
Iain
问位域
是否真的是问题
?为什么不有n位类型
?Andrei
回应说D曾经有位类型
,但正是因为内置位域
附带负担,它被删除了.
Ali
认为应该使库位域语法
类似C位域语法
.马丁认为意义不大.getMembers
仍然返回模板实例
而不是字段
.
Martin
指出,位域优于库实现
和Iain
的n位
类型,因为可为每个单独位域成员
加注释.
Walter
指出,使用库位域
对静初化器
来说是有问题的.Andrei
说这是有效
观点,但它可在库代码
中解决.
Mathias
建议当前实现
在定义字段时,用了错误
的方法来匹配
在C中用位字段
方式.他认为相反,应该只按字节对齐
定义访问器
.Andrei
说这是有效
的替代方案,可简化代码.
相关主题(使库
与C编译器
的布局兼容
,简化库语法
,FPGA
上的n位
,打包布尔
,标准化D位域布局
,与C实现
的兼容性等).太多,无法在此总结.
但Andrei
确实建议Walter
在继续使用内置
实现前,应试验
库实现.
1个,1个,两个问题.
状态更新:引用 中 域
歧义现已修复这里,及无效的纯域推导
这里和进出中推导
,这里,目前,多数未解决的问题都与嵌套函数
有关.Atila
为域错误打印弃用
消息来恢复dip1000
,这里.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现