2412d,d的7月语言会议
总结
位域
话题
转向了Walter
的位域
提案.
当Timon
举手发布评论时,这是第一个议程项目
.
Walter
和Rikki
就跨保存单元
边界而辩论,Rikki
说这是必要
的,而Walter
说不是必要的.不过,我没有完整的背景信息
.
就此后,我说很好奇需要多久
与D的C位域
交互.在我多年来一直维护绑定
的流行C库
中,只有一个使用位域
.我只是忽略了他们
,但他们
正在使用uint
,所以根据Walter
的说法,即他们应该开箱即用
.
即便如此,需要多久担心一次
?
Walter
说D编译器
中需要它们
.GDC
和LDC
是现在不能用位域
的C++
和D
的混合程序
.我说那很好
.可以在编译器
中做要做的.
我想知道,在野外,需要多久
使用一次位域
.如果不是很频繁
,则对混合语言代码
,要求extern(C)
使用C编译器
布局并定义自己的布局
可能是值得的.
Walter
说,更有趣的问题
是位域
必须多久符合外部施加的布局
.他说那几乎从不
.经典例子
是硬件寄存器
.
但是硬件寄存器
在你的电脑
上,C编译器
在你的电脑上
,所以它会做C编译器
做的事情.
Rikki
说,与对接C
相比,他更频繁地在文件格式和网络
中处理它.此时,这很正常.Walter
问Rikki
是否在文件格式
中使用位域
?
Rikki
说是,它们很常见
.Walter
问C
是如何与它交互的
.Rikki
说手动
.沃尔特说:“没错
!”
Timon
说Walter
基本上是在鼓励不使用位域
.如果他不想让人们使用该功能
,他就不应给它一个好的语法
.那只是差的设计
.
沃尔特说,他不同意
.Timon
问,创建一些不应使用
的东西,但语法比应该用
的更好,这是否是个好的设计
.
Walter
说他想可在D前端
使用位域
.Timon
说应该允许他这样做,而且应该有很好的语法
.他同意这些限制
.
他不同意应该把C
的东西复制
到D
中.他还认为,如果你在D端
定义它,且你在C端
同样定义了,则它们应该匹配
.他不反对这样.
沃尔特说他同意,如果它在D和C
中相同
,但执行不同
,那将是完全意外
的,且可能是破坏内存错误
.但是,有记录表明D
的位域
匹配相关C编译器
的布局.
如果在同一平台
上使用的另一个C编译器
与关联的C编译器
不匹配,则在C端
无法保证布局会匹配
.在POSIX
和Mac
上,从未见过与所有其他编译器
在这些平台上不匹配的C编译器
,因为那太疯狂了
.
唯一有差异
的地方是在窗口
上.微软
编译器以一种方式
完成,而GCC
移植以GCC
方式完成.这是一个不幸的决定
,但他对此没办法
.
D的C
编译器布局
设计为与微软
的布局匹配
.微软
的布局为了匹配
过去在x86
上工作的旧C编译器
.
所以,唯一有问题的地方
是在窗口
上的微软
和GCC
间,他看到人们抱怨位域
和它们之间的其他细微差异
.
Rikki
说他想到了另一个方法
:属性
.默认值
仍会匹配C编译器
,这很好,但是想要其他
的人需要有个带UDA
的.
Walter
说UDA
很好,但手动对齐
更好.它很简单
,可立即理解
.不会有混淆
,且它管用了
.
只是在位域
前对齐排好
了.可更改布局
来匹配期望布局
.他用来避免正常的成员对齐问题
.
他会添加或删除
填充字段以使其正常工作
,这样他就可避免折腾对齐属性
.
沃尔特说很好视角
.但即使没有位域
,现在也可能这样.在C编译器
之间,结构
有对齐差异
,你必须处理它
.
沃尔特说,他一直都在遇见这个问题
.
他说还有字节排序
.是大头
还是小头
,现在没人在生产大头
了,但那是一件大事
.这就是bswap
硬件指令的目的.
Rikki
表示,仍在网络
中使用大头
,且不会很快消失
.沃尔特同意.
史蒂夫说沃尔特说得对
,如果必须处理它
,则你只需要学习如何处理它
.如果布局
对你很重要,则你要了解它的工作原理
.
沃尔特说,美妙在,如果它最终错位
,你会立即发现
.沃尔特说你会的.他以前遵守过外部布局
,他先测试它是否有效
.
Walter
说,他很高兴在位域
文档中添加如何手动对齐
.然后,读的人都会看到,上面写着"如果需要符合外部布局
,方法如下".
Walter
说,如果你使用别人的代码
,这些代码
用对齐或手动添加填充
来使其工作,则它也可在你的系统
上工作.蒂蒙说他理解.
Walter
说,即使你正在构建相同代码的系统
不关心结构布局
.如果你在-m32
和-m64
间切换,你的结构布局
就会有所不同.
他试过的每一台编译器
都是如此.
它有一点文档
,但需要一个属性
来改变枚举的布局
的要求不高.即使是D新手也会明白位域
是他们必须为其附加属性
的特殊对象
.
Rikki
说Nim
有三个位域模式
.一个与C编译器
匹配,一个是想要做的打包内容
,第三个
是可任意干活的
.这对他们来说很有效
.
他说Rust
也有了位域
.他们不会总是使用C布局
.
Walter
说,D的最初设计
是编译器
可按它想要的方式重排结构成员
.他一直在考虑重排
以清除填充
等.
但很快就发现这不好
.所以他按C
方式实现了它
,他完成了
.他从不抱怨过D编译器
中的字段对齐
.一个也没有.该对齐
确实改变了事情
.
他放弃重排
的另一个原因
是,他发现人们有时会重排
字段以缓存
.想在缓存最热的部分
放置最常用的字段
.
你想把你常用
的东西放在一起,其余
的放在别的地方
.此时,你不想编译器重排它
.如果有人仔细地在C语言
中布局
了一个结构,然后D编译器
来了,并重排了它
,这不好
.
和类型
Rikki
说他正在开发一个覆盖了基本匹配类型
的DIP
.它已有了三周
,并准备好拉请.
他说,支持静态如
的方式有些问题
,但它已准备好了
.
其次,他谈到了他对"memberof"
符号的提议.它有参数到参数
匹配方面的问题,Walter
过去反对.
这在DIPIdeas
论坛中以推导类型
再次出现.Rikki
说他在这方面受阻
,并想Walter
决定前进的路径(如果有的话)这里.
Rikki
说,参数/参数匹配
的主要问题是它必须调用验证语义
,因为只能这样.他需要知道是否必须覆盖它
以避免调用语义
.
Steve
问是否有一篇文章或视频
解释了和类型
异常,这样可理解它们.Rikki
说他写了一篇DIP
.史蒂夫说他不需要DIP
.
Walter
问Rikki
是否在谈论抛和类型
值.Rikki
说它是一个结构
,而不是一个和类型
.他是个和类型
.
Walter
说D
没有抛结构.Rikki
说,在新机制下,可以.它不会调用运行时异常机制
.这一切都是通过函数的返回
来实现的.
它会做得非常好,并勾挂try/catch
和抛
.
Walter
说,他想降低try/catch
和抛
的复杂度
,而不是给它添加值类型
.Rikki
说这是一个已讨论了很久
的完全不同机制
.
Dennis
问,你的想法是否是返回传统的错误码
,但此时,编译器覆盖抛
和抓
来检查错误码
.
Rikki
说,你可传递想要的任意用户数据
.
Mathias
问,如果在不使用异常ABI
时这样做,这不会破坏在D和C++
间使用异常
的能力吗?Rikki
说它不会.一个是使用现有机制的类
,一个是使用现有机制的结构
.
Walter
说他已放弃
了在窗口
上抓D
中的C++
异常.且微软
没有文档,而且太复杂了
,所以他就丢弃了它
.
可在32
位窗口
上运行,因为它有文档记录
.微软
说他们也记录了64
位的异常
文档,但他们没有.
这是一团糟
.他不得不花费
大量时间逆向
,而他不想把时间花在上面
.因此,D在64
位窗口
上用自己的处理异常机制
.
从函数返回可变大小的栈分配
Aya
说,她一直在想,该语言
现在是否可以从函数
返回可变大小的栈分配
.沃尔特说不行.Aya
认为应该为它准备一些可完成但很笨拙的语法糖
.
Walter
说,一般当你返回可变大小
的东西时,你是通过引用
来做的.Aya
说,你必须在调用点
分配,并向函数
传递一个指向内存的指针
,这样它填充.
这实际上是一个栈返回
.
Walter
说这会管用,但另一件事
是不想离开CABI
.他以前用D试过
,那真是一场灾难
.必须遵守CABI
,因为不仅每个人都遵守它
,而且调试器
除了C标准
的ABI
外,不能工作
.
即使文档
说它会,但不是.显然,没人用非C
调用约定测试过调试器
.发明自己
的也不行.
但是,CABI
确实说过,如果你要传递一个大型结构
,则要传递
它的指针,然后代码生成器
填充它.这只是返回引用
的变种.
Aya
说,她总体上正在考虑较小的分配
.可调用返回分配大小
的函数.然后,也许需要在需要分配
的中间存储
中保存分配内容
.
因此,或需要分配两次
,或调用两次来确定返回值大小
的所有逻辑
.想法是,不知道是否可以简化它
.
沃尔特说,这都必须通过引用
来完成.Aya
同意.
Timon
说,这只是对sizeof
为动态值的类型
的命名返回值优化
.这是好事,但构造起来
有点麻烦.
Aya
说她也一直在考虑结构接口
.我提到了Atila
的库.马蒂亚斯
说可以使用类.Walter
把可变大小
关联起来,说类
是按引用传递
的可变大小的对象
.
也许Aya
可考虑使用类
来实现该想法
.
Aya
说,问题是,当有非常小的结构
时,你想要一个接口
和很多小结构
.你只会有包含大量堆分配和片段
的无缘无故
实现相同接口
的很多小类
.
Walter
建议使用COM
类.它们更简单,更小
.Aya
问他们是否可移植
的.沃尔特说他们是
.它们就是为了匹配窗口
中的COM
接口.
编译器
支持就在那里.最小的COM
对象仅包含一个指针
.他们非常聪明
,是个不错的功能
.
Aya
说她会调查一下
.
她问是否需要IUnknown
才能使用COM
接口.沃尔特说是.Aya
说它在version(Windows)
的后面
.沃尔特说可以把它删掉
.
Rikki
说可在没有IUknown
时使用
它.它可与任意东西
一起工作.
Adam
说在窗口
上,D中的一些内容
有版本
错误.他在ODBC
支持中遇见了它
,一直在Linux
上使用.
这时,直接PR
它应该是可以的
.他可保证COM
可在Linux
和Mac
上运行.这只是CABI
的事情.
Walter
说明,微软
的COM
接口依赖QueryInterface,Add
和释放
函数.如果没有从IUnknown
继承,你就不会有这些.
亚当
说这是对的.你可在没有这些
时完成,但你必须重建功能
.
Dennis
说Vladimir
曾想公开
一些与窗口
位图相关的结构,他回忆道,Walter
和Jonathan
曾反对这样做,因为在非窗口
上导入窗口
内容将是一个错误.
Adam
说,此时,COM
自身并不是窗口
相关的.Walter
在COM
中提到了GUID
内容,并认为
这是相关窗口
的.
亚当
说这是真的
.可以公开结构自身
,因为其中没有
相关窗口
的内容.Walter
说,你需要取GUID
.Adam
问是否可用UUID
?并使用微软
的方法.
沃尔特说是,但必须做点什么
才能让它有效
.
Adam
说,他的一般要点是,COM
只是一个CABI
技巧.窗口
大量支持它,而这在其他地方
可能不可用
.
如果想努力
在自己环境
中重建它,那可能会管用
.不需要查询接口
部分.
Walter
的更新
沃尔特
说他一直在做两件事
.
首先,有两个主要请求
,让移动
构造器正常工作
,因此这是个优先事项
.他花时间在移动构造器
和ARM
生成代码.
Weka
想要该功能
已很久了.他们是主要用户
,因此需要处理它
.
其次,ARM
后端的PR
差异超过5000LOC
,几乎无法审查
.他已和Dennis
讨论过合并它
,即使它还不是个正常运行的后端
.
他不断地重定基
它,但别人很难跟踪他的进度
,因为他一直在增加
该巨大的PR
.如果它是主线
,则会更好.
沃尔特说丹尼斯
提出测试它
.通过测试包
运行它不工作,因为测试包
需要一个全功能的编译器
.未来可能需要
在测试包
中添加ARM
目标.
他不知道如何工作.他不知道测试包的设置
.
Rikki
说,只要没有暴露ARM
后端,且没有调用路径
,然后合并它.Walter
说他已在一个开关
后面放置它
,他认为这不会影响别人的代码
.
Rikki
说他会记录
这个开关
,但除此外
,合并似乎很好.
原文地址:https://blog.csdn.net/fqbqrr/article/details/144436340
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!