DLF2023
年9月月度会议摘要
Robert
Robert
,在DConf
上做了一些初步的JSON5
工作.他还更新了Bugzilla
到GitHub
的迁移脚本.他使用了"隐藏"API
,现在脚本
要快得多.
除此外,他在DScanner
上做了一些小事,并等待JanJurzitza(Webfreak)
合并它们.他指出,沃尔特曾要求他写一篇演讲,他准备写DScanner
相关的博客文章
.
亚当
无法访问
的代码
亚当首先提出了"无法访问语句
"的警告.他说这真很烦人
,应该消除它.误报
破坏了它提供
的价值,且它并不能减少
错误.有一个PR
可版本化它.
蒂蒙
赞成摆脱
它,因为他觉得它最烦人
.
Steve
同意该功能
几乎没用.
默认,Dub
警告为错误.他说,宁愿看到编译器删除
无法访问的代码,也不愿忍受发出警告
.
马丁
说,同意.对那些想要
它的人来说,该功能应该包含
在可配置的linter
中.它帮助
了他几次,但它在很多场合
都阻碍了他.
Walter
问,在模板扩展
中,禁止警告
行不行?亚当说可以,但举了个二分法
示例,此时,
在assert(0)
中,现在它不再编译.
Walter
同意这很烦人,亚当说,要看看性价比
.
即使收益
不为零
,成本
也是巨大的.
沃尔特
同意了,并说如果移除
它并放在到检查器(linter)中
,问题不大.
丹尼斯
,指出,编辑器
最好可利用
这些信息.如,code-d
按灰色
显示未使用的参数
,因此尽管未用
,也不会造成
干扰.
他建议禁止dmd
中的签入
,但保留
它的代码,以便DMD库
的客户可用它.沃尔特说这很好.
更新:Adam
此后修改了他的PR
,以便禁止
检查但未删除,且已合并PR
.
DLF
角色
接着,亚当问谁负责标准库
,并说曾经是安德烈
.我回答说是atila
.
Dennis
已在YouTube
频道上开始了贡献者教程
系列,并计划
继续下去.
史蒂夫
Steve
报告说,他一直试让
他的移植Raylib
中使用ImportC
.他发现ImportC
已走了很长
一段路.除了一些链接器错误
,已到了几乎可工作
的地步.
他一直在与Martin
合作解决
这些问题,并想在下个LDC
版本中修复它们.在下个
版本的LDC
中,他可能会有一个内部启用了ImportC
部件的Raylib
移植.
他觉得这很令人兴奋
.如果ImportC
可达到可从C导入
要求内容的地步,则会避免创建移植和绑定
的许多麻烦.
接着,他说他开始了他的下一个D编程课
.但在窗口
上,还需要更多改进
,以启动和运行
一切.
Timon
Timon
说,在DConf
上,他本来打算修复一些bug
,但他尝试
了其他事情:他在foreach
循环中,解包元组
.
然后,他做了个演示.然后他展示了他发现
的一个问题.有时候,Phobos
元组的实现方式
,对结构实例
,会导致多次后复制
和析构器调用
.
解包元组
时,情况更糟
.最好,可用移动
替换所有这些调用
.这有点烦人,这是语言
的局限性.
Walter
感谢他在元组
上的工作.
Dennis
说,移动语义和复制构造器
难以理解.很难理解DIP
.阿蒂拉说,这被搁置了,要完成它,现在
肯定有不应有
的副本.
我建议把Walter
的"复制,移动和转发DIP
视为一个稳定
功能,而不是增强
功能.必须把它弄进去.阿蒂拉同意了,因为不应有
副本.
虽然,声称有移动
,但有时它们不管用
.
蒂蒙
同意了,并提出,目前没有除运行时系统
外,合法方法
来释放
不变值.
蒂蒙重复了"是没有合法
方式".如果函数
只是释放
不变值,因为它返回void
,编译器
可省略它.
因为它是纯(pure)
的.需要说明要消耗
每个值.默认,与析构器
一起使用,但应该可有函数
说,“我现在
正在使用该值”,然后在调用函数
后它就消失了.
有core.lifetime.move
,但它并没有考虑移除
它.它只是默认初化
它,然后你再次得到该纯
析构器调用.
Martin
说Timon
的演示很酷
,并怀疑
他的生命期问题来自胶水层
,如果可能,它会直接
在最终的局部变量
中放置调用函数
的结果.
因为一些如结构
的构造器
等特例,它需要在胶水层
中处理.这太丑陋了.如果保持
现在接口,则需要在每个
胶水层中重新实现元组支持
,而不仅是dmd
,以使事情正常工作.
Martin
继续说:正如Timon
所提到的,运行时
存在语言限制
.基本构建块
就在那里,但Timon
的析构器
示例就是限制
之一.
因此Martin
一直要求把移动和转发
搞成内置
,而不是当前
库方法.如果内置它们
,也可摆脱一些模板膨胀
.
当然,也不想要那些额外的后复制
和析构器调用
,但如果负载
非常大,即使是移动
的析构
成本也可能非常高.如,4kb
移动不是免费
的.
最好,直接部署.但是很可能要更改AST
才行.
Timon
感谢Martin
的见解.然后,Martin
详细介绍了它是如何入侵
到语言中,及移动
和原位放置
的现在的工作原理.
他还说,在DRuntime
中发现了多个
实现,并试简化一切以使用core.lifetime.move
,但最好,move
和emplace
应该是内置的,而不是库
方法.
沃尔特说,很久以前,他就写了转发和移动
的DIP
,他需要重新
熟悉它.他指出,在实现@live
中,他对移动
语义很感兴趣,因此把移动语义
构建到语言
中的提议,都可能会对@live
产生更好
的影响.
所有权/借用
系统基于移动而不是复制
.不久前,他把DIP
交给了Max
(当时决定Walter
和atila
不应再评判他们自己的DIP
,事后看来这是一个错误),但它从未完成.
沃尔特说,目前有很多优先
事项.阿蒂拉
一直在推动他改变shared
的语义,他已同意了.
这也阻碍
了很多人.然后是ImportC
问题(耗时工作).所以他同意
应该暂时把移动
放一放.
马蒂亚斯
Mathias
提出了-preview=in
.在过去一次会议上,Mathias
同意改变dmd
的行为,使其总是按引用(ref)
传递(Walter
认为有时按值
传递,有时按ref
传递是不一致).
他报告说,与DConf
的Ahrefs
讨论后.他们
对D的C++
整合非常感兴趣.遇见了个问题,因为有些想要按引用
传递的类,但是当有接受类
为参数的函数
时,会按指针
管理它.
他们已讨论了按引用
传递它的方法.Mathias
想要实现概念验证
,且已与Walter
讨论了.
马丁
马丁说,他一直在为LDC
的D2.105
而努力.目前,它进展得相当顺利.最新
编译器版本,终于可针对Symmetry
代码基测试.
已修复一些2.103
和2.104
回归.为此感谢拉兹万
.一切正常.他想可针对2.106.0
版本尽早测试Symmetry
的代码基.
最后,他告诉Steven
,在LDC1.35
版本,部分修复
他报告的ImportC
问题.
Dennis
是测试
问题.
拉兹万
模板问题
Razvan
从Martin
提到已修复
回归开始.它们是由Walter
的PR
引起的,目的是在推导环境
时,阻止
编译器发出实例化
运行时勾挂模板
的降级.
他说,一般,找到新的数组式
时,你会立即降级
它到newarray
模板中,然后实例化
模板,并分析它,并在某个字段中存储
它.
但是,如果该环境
是CTFE
,则一般,不需要这样.你总要解释
该式.但有时,即使在CTFE
环境中,仍需要降级
.
因此,如果不降级
,这时你最终
会遇见实例化错误
.
他说,这里的方法是总是实例化模板
,并按降级
保存,但这样,就不必总是为它发出代码
.该方法
也有问题.前端
现在是,在推导
环境中,有实例化模板
时,它会按不需要
生成代码,来标记
模板实例.
但是,如果实例实例化
其他模板,则不再按推导模板
标记这些模板
.如果未生成
根模板,却生成了子实例
,这也会导致问题.
如,他引用
了其中一个回归:给定一个实例化map
的__ctfe
块,按别名参数把λ
传递给它,则因为它是在CTFE
环境中,就不会把代码
降级到勾挂
上.
但随后,把λ
传递给映射
实例化的其他模板
,则在这些环境
中分析它时,会导致ICE
.
需要查看
根实例化是什么
,并传播
不需要codegen
它触发的子实例
.
马丁说,拉兹万
所描述的,一般都应有效.但这很复杂.然后,他详细介绍了推导实例
触发的模板实例化
.
当前实现
有一些问题,也有一些解决方法,但回归
与此无关.他说,有时候,依靠新的模板
降级来自行生成错误,以抓一些错误情况,对这些失败
很不错.
在CTFE
中,只需检查
是否有问题,会短路它,又因为要假设它总是
有效的,会跳过
降级.这不会切掉
它.这是主要
问题.实例化降级模板
可能失败时,需要删除
这些检查.
这就是已修复
问题,现在运行良好.
马丁说,也许最好,在前端去掉
降级.Walter
建议,也许应该按旧
方式在胶水
代码中降级
.Razvan
说,因为现在运行时
使用模板,这样做就是放弃
了现在这些问题
.
还出现了不经常遇见的其他模板问题
,但现在
在运行时使用了模板
,它们更加
明显.
他说,另一个问题是属性
.这些降级
是从各种属性
环境中完成的.目前,在实例化模板
,如果有循环依赖关系
,则推导
不管用.
编译器只是假设它们是@system
的,不纯
的,非@nogc
的,等等.这里,不是前端
模板降级问题,而是有些需要修复的模板
发射或实例化
错误.
马丁同意了.
关于属性推导
,Timon
说,也许这是计算最大
而不是最小
不动点问题.编译器
应总是推导
属性,但目前,它不是尽量推导
它们.
这不对.但是,如果不自省
,要做好
就有点麻烦了.
Martin
说,过去,Symmetry
的代码基就曾受到停止推导属性
的打击.编译器
有时会跳过
它.比如,当在特定
实例中,需要它的成员函数
之一,且还没有语义分析聚集
时.
完全跳过了推导
.这很麻烦.
Razvan
说,不应codegen
的实例,而codegen
时,他正在
研究该问题.他想找出问题所在.
DMD库
中的AST
节点
自DConf
以来,Razvan
一直在考虑DMD库
如何提供任意覆盖
各种AST
类型.
他给了该AST
实现使用的表达式类层次
的示例:
module expression;
import std.stdio;
class Expression {}
class BinExp : Expression
{void fun(){writeln("expression.fun");BinExp p = new BinExp();Expression e = new Expression();}
}
class BinAssignExp : BinExp
{}
class AddAssignExp : BinAssignExp
{override void fun(){writeln("AddAssignExp");}
}
class MulAssignExp : BinAssignExp
{}
然后在ast_family.d
中,默认ASTCodegen
如下:
struct ASTCodegen
{public import expression;
}
要创建自定义AST
并覆盖如BinExp
等的默认,需要
执行如下操作:
struct MyAST
{import expression;import std.stdio;alias Expression = expression.Expression;class MyBinExp : expression.BinExp{override void fun(){writeln("MyBinExp.fun");}}alias BinExp = MyBinExp;alias BinAssignExp = ??
}
问题是,为了使用你的自定义实现
,必须声明从BinExp
继承的所有AST
节点.这不可行.
不仅要可指定
要覆盖
指定节点,还要指定其他节点
要用它.
首先,考虑了模板化AST
节点,并从模板化
版本继承,但要大量修改编译器
.然后想出了使用mixin
的方法.只需插件(mixin)
入期望AST
节点的代码
即可.
使用该方法,AST
节点现在是mixin
模板:
module expression_mixins;
import std.stdio;
mixin template Epression_code()
{class Expression {}
}
mixin template BinExp_code()
{class BinExp : Expression{void fun(){writeln("expression.fun");BinExp p = new BinExp();Expression e = new Expression();}}
}
mixin template BinAssignExp_code()
{class BinAssignExp : BinExp{}
}
mixin template AddAssignExp_code()
{class AddAssignExp : BinAssignExp{override void fun(){writeln("AddAssignExp");}}
}//插件.
mixin template MulAssignExp_code()
{class MulAssignExp : BinAssignExp{}
}
然后表达式模块
变为:
module expression;
import expression_mixins;
import std.stdio;
mixin Expression_code();
mixin BinExp_code();
mixin BinAssignExp_code();
mixin AddAssignExp_code();
mixin MulAssignExp_code();
//插件.
在ast_family
中,ASTCodegen
不变,但现在,可如下自定义AST
:
struct MyAst
{import expression_mixins;import std.stdio;mixin Expression_code();mixin BinExp_code() t;class MyBinExp : t.BinExp{override void fun(){writeln("MyBinExp.fun");}}alias BinExp = MyBinExp;mixin BinAssignExp_code();mixin AddAssignExp_code();mixin MulAssignExp_code();
}
可在前端库
中,自动生成样板
.重点是,现在可无需
重新声明所有内容,在层次中,用自定义实现
替换任意默认节点
.
此例中,从BinExp
继承的所有内容,现在都从MyBinExp
中继承.这管用.这是可行的
.
基本上是个可插件
的AST
,相关
丑陋是值得
的.
阿蒂拉
说他喜欢它.
Razvan
指出,问题
是语义
例程访问器
将不再起作用.但很酷的是,也可把它们放在mixin
中.用自定义
语法树节点,你继承
的,并覆盖
期望访问节点,混合这些,得到了期望的所有功能
.
Timon
说,dmd
在试构建
自己时会有问题.
如"未定义的标识串
",一般前向引用
错误或ICE
等.
Razvan
说,他遇见了未定义
标识问题,但可在问题点
插入别名
来解决.这些都是需要修复
的编译器错误.
Timon
同意了.
Dennis
指出,bootstrap
编译器不会修复
程序.Martin
说你要提高bootstrap
编译器版本.然后他说,如果,只有单个AST
,它就可正常工作.
但是,需要多个AST
的工具都需要完全不同
的类层次
.即使只对小小
的BinExp
感兴趣,也可能影响
其中的几十个类
,但不会影响整个数百个类
.
你想在AST
之间共享一个被覆盖的类
.
拉兹万说,这是可以做到的.在AST
族,外部声明
该类,然后在族内
使用别名
.
Steve
说,问题是,在编译器
中查看实现
时,你查看BinExpression
,并看到AddAssignExpression
继承自它,它有可能从与上面完全不同
的东西继承
.
很难跟踪
这一点.特别是如果
有个替代的AST
,如,对DMD库
.跟踪事物去向
及继承方式
会令人困惑.
Razvan
说,如果你正在研究
编译器,不应有混淆
.在mixin
中看到的是实现
.不会再有覆盖
.对编译器库的用户
来说,有点令人困惑,但你仍必须
选择要覆盖的AST
节点.
他预计接口
将比所有这些样板
,所有多个插件
文件要简单得多.还可以是自动化
的.然后,只需要指定
要覆盖的类
即可.是的,有点令人困惑
,但DMD
现在的组织方式,他不知道你如何保留
代码的当前状态
,并继续前进.
Mathias
认为目前,这似乎是唯一
方法.
沃尔特
说还有另一个方法
.与其在AST
节点之外,不如在节点
里面,放置mixin
.让AST
节点插件
至用户定义的模板
中.这样,不用折腾,就可添加
功能.
拉兹万说他也考虑过,但仍需要定义
所有定义.沃尔特说,在主编译器
中,只需留空.Razvan
同意,但编译器库
用户仍必须定义所有AST
节点,然后手动插件
感兴趣节点.
对史蒂夫
评论,这将更丑陋.因为现在,查看表达式实现
,第一反应
是它很丑陋
.但它封装
得非常好.你有整个类
,只需插件进
你的AST族
.
他说,这很有效.好处
是可逐步
实现它.可逐步
取每个AST
节点,并把它放入mixin
中,然后插入进AST
代码中,并查看
它是否有效.
如果因为编译器
错误而遇见
问题,则很容易
跟踪它.是的,这需要大量更改
编译器,但现在,如果不修改
所有AST
节点,就不可能覆盖
它们.
沃尔特说,他不明白为什么把插件
放在类里
而不是放在类外
,就不会完成,只是减小侵入性
.atila
说你必须定义
所有子类.
仍需要手写
它们.沃尔特不认为这是真的.Razvan
说,你定义你的AST
时,仍要写Expression
类,然后插件
内容.
沃尔特说,你重定义
了所有插件
内容.史蒂夫说,你可把所有
混进去的传递给类.然后用它来插件
代码.
Walter
说,在你拥有
的每个语义节点
中,你列举继承
等等,然后插件
到特征模板
中.编译器的函数模板
与用户库
的函数模板
不同.
然后,如果想修改一个AST
节点,只需修改该AST
节点的mixin
.这就是你所要做的.
Razvan
问,想添加另一个字段或函数
时,会怎样.按参数
传递它们?atila
说不行,因为必须
为此传递与API
中的AST
节点一样多的mixin
,或只传递
一个,然后就会插件
到每个AST
节点中.
沃尔特提出
了另一个方法.已从AST
中删除了语义阶段
,现在它们是单独
完成的.可更进一步,删除
更多覆盖函数
等等.
让AST
树像ASTBase
中的树
,即它只是层次
.然后用户
可修改它.这只是个想法.只需删除
相关编译器的所有AST
内容,这样它就更像是个用户无需修改
即可使用的空的AST
.
拉兹万说,四年前就有该方法,但当时,才开始重构.Razvan
认为这是正交
的,因为除非
还与mixin
方法结合使用,否则仍无法向AST
添加新字段.
Walter
同意它不会添加
新字段.阿蒂拉问是否需要
.难道不是你在写自己的访问者
吗?为什么需要在那里修改AST
.
Razvan
:因为目前语义阶段
在使用AST
.解析器需要特定AST
结构.因此,如果想添加一些字段
来存储一些信息以在语义分析
时使用,则…
Timon
说,每个类
都有插件功能
是有效
的,因为,你可根据该类型
来静如(static if)
,查看你在哪个
节点上,可把你的代码准确
注入到正确
节点中.
Dennis
说,他还不确定DMD库
的哪个应用
真正需要覆盖类
.除了静态
增强类,每个AST
节点都有个标识
,或只是额外的库空针
,如何?则无需繁重模板和插件机制
,库可动态
转换和读取该字段
.
Razvan
引用了未用
导入工具中的一例.在那里,当编译器解析名字
时,在符号类
的域中,有个搜索
方法.
只要覆盖
该方法,再存储
一些信息等.
在此,谈话转向了dmd
中虚/终
函数的使用,为了dmd库
,要如何更改,及更改API
对用户代码
破坏的可能性
.
Razvan
指出,LF
最终可能会由Weka
使用的个人项目,希望可修改AST
节点.现在,因为未提供适当接口
,他必须跳过很多障碍
.
Razvan
表示,他愿意为此努力,并向dmd
提交一些PR
,看看是否可行,或是否只是遇见
了障碍.他问沃尔特是否赞成探索
它,或认为
它太丑了.
阿蒂拉
重复了一遍,他喜欢它.Walter
问其他
编译器是如何做到的.这触发了一些关于clang
和Java
编译器的讨论.
Martin
表示,现在不太担心会破坏编译器的API
.现在只是用它作dmd库
的完整起点
.因此,不必担心API
的巨大变化.
一旦有了依赖
它的稳定
工具,那不行了.LLVM
有重大API
更改.甚至会有三个
不同弃用
步骤的版本.
D现在不存在.
Walter
担心这是对编译器
内部的痛苦更改
,且不确定
这是否值得.编译器中有很多AST
节点,现在要全部覆盖
它们.
Razvan
说,对他来说,与模板化
解析器或移出
语义阶段时一样.Walter
说,模板化
解析器有点失败.Razvan
说,这是因为没有跟进
语义.
模板化
了解析器,但已存在libdparse
,所以未提供新东西
.有一堆库在不同规模上,做dmd
已在做的事情.
沃尔特说他有点喜欢void*
方法,这样,编译器可毫不知情
地添加勾挂
.
Timon
问,为什么不直接模板化
分析AST族
,并让库拥有自己
的可勾挂AST
.这就不会干扰标准编译编译器
.也不会编辑现有的AST
节点.
Walter
说,如果编译器
是适当模块化
的,就不必模板化
.如果正确封装内容
,只需为不同行为
导入不同模块
即可.
可考虑,看看是否可减少AST
节点的导入次数
.试使它们更具插件性
.因此,与其使用模板
等,不如导入
带自己功能的不同模块
.
有很多方法可完成.
Timon
问,如何告诉现有模块
,请导入我的模块
而不是现有模块
.这仍需要模板化
.Walter
说,你可把你的模块
放在不同
目录中,并用-I
开关给编译器
指出来.
然后就有了不同的实现.
拉兹万说,那不再是库
了.你必须替换
现有文件为你的文件
.这不能解决问题.
Walter
:所以即它是否应该是已编译的DMD库
或源码DMD库
.
拉兹万
说是的.如果在修改
文件,不妨只使用编译器
的一个分支.重点
是:想与最新
编译器同步,且想拥有
所有功能,只需插件
要用功能即可.
Adam
说,不修改文件,而是在构建系统
中,完全替换它们.但这是个痛苦.Razvan
说,他想尽量重用
现有代码,因此,对指定文件
,需要大量复制粘贴
.
Walter
说他理解Razvan
说的,但如果更好
封装模块
,则与编译器的其余部分
同步的问题就少得多
了.
如,他终于让词法
解析器和解析器
不再导入
编译器的其余部分
.现在,你可插件
不同的词法解析器
和不同的解析器
,然后无需更改
的使用编译器
的其余部分
.
为什么不能用AST
节点来完成?如果要更改语句节点
,只需导入
不同的statement.d
文件即可.
如果正确封装
它,则很容易
把编译器的statement.d
替换为用户版本
.用户可按合适
方式调整.
Timon
说,根本问题
是,如何在许多不同类型
的AST
节点上重用语义
.D文件
接口不是好的接口
.
也许可结合
这两者.
Walter
说,已有用dmd
的只是简单
读取目录
中的所有文件
,并编译在一起的单个命令
,来替换build.d
的讨论.
这很有趣,并更容易从dmd
源码外构建
.他同意build.d
的功能太复杂
,它应该只是编译文件
.
atila
说,最好,人们只需在dub.json/sdl
中加上dmd
一个依赖项
,就可工作了.沃尔特
同意了.
Martin
说,这和之前在前端上放置linter
类似.同样,决定
在编译器中保留检查
无法访问的代码
,以便工具
可用它.
替换D文件
不会削减它.需要介于两者
之间的东西.应该有个DMD
库基的编译器分支
.因此,可在那里做mixin(插件),void*
等,以便可用
它.
这是有些轻微修改
的半开放
的前端接口
.因此,可添加像void*
等修改,或为所有AST
节点添加一些额外
的状态,访问者或需要的函数
,这些功能会有成本
,且不想在前端
中看到这些功能
.
如,如果必须从一些性能关键
方法中,删除final
属性,以便可像用任意工具
一样使用前端
,可在分支
中这样尝试
.并可把DMD库
作为GitHub
上的一个单独的项目
.
可更新每个主要或次要
版本,可在此基础上构建工具
.这样,就不必在编译器
自身中添加所有额外
东西,从而变慢或变丑
.
类似在LDC
使用dmd
作为前端.他们重写了单仓库
的历史,排除
了或移动
了一些文件
到其他地方,以便可更方便
地使用它们,并有些小调整
,如增加些字段
,替换
些函数等.
跟上
最新dmd
变化还不错.如果由社区团队
处理,类似维护
配音,这应该很好.
沃尔特说,他很高兴马丁
提出了该问题.他突然发现Martin
和Iain
已在使用dmd
作为库,因此他们的经验对如何更好
完成它非常有用.
也许更好
地支持它们,会更好地支持dmd库
.他不知道是如何把它整合
到LDC
和GDC
中的.
马丁说,LDC
和GDC
显然在修改D
的某些部分,至少LDC
是这样,但只是很少
.对其余接口
,是与C++
互操作.
Mathias
说,这些不是特例,它们是DMD库
的用例.马丁答应了,但他没有看到其中的关联.Mathias
说,它们是人们需要DMD库
的各种功能
的好示例.
目前,它们是黑客
,因为在LDC
版本块中放置它们,并修改
代码.但是通过上游化
它们,会把黑客
变成适当的配置点
,这就是重点
.
马丁同意了.他的观点是,不想丑化
代码,降低
运行时和编译器源码
的可读性.对检查器
或这些计划的扩展点也适合.
因此,可保持
前端不变,并修改
中间的DMD库
,以简化
一些勾挂
,添加额外
状态,如果要替换
该功能,可能会替换整个AST
.
他继续重申,替换D文件
建议,显然不是想要
的.与Razvan
提出的未用导入
示例一样,期望重用
大部分功能.
只需更换
一个小的搜索
功能.因此,DMD库
项目作为它自己的小项目
开始侵改
是相当不错的.可见它是如何演变
的.
还有extern(C++)
接口,如何影响DMD库
的附带讨论.
Steven
说,与新Phobos
版本讨论类似,即按完全不同的方式编译重用
相同代码.
atila
atila
说,在DConf
之后,他问过Roy
是否想为新的共享语义
编写规范,但还未收到回复.但应继续下去.
他也一直在思考Robert
关于安全代码的建议
,他做得越多
,意义
越大.不必等待
版本,这样,可解决DIP1000
的所有问题,可能一举
解决.
整个
问题是,因为要用@safe
,不得不到处
添加域(scope)
.它应只适合@trusted
.
另一件事是:他一直在思考Timon
的想法,即指针
有个说明是否是隔离
的编译时枚举
.想用向量类型
和一些分配器
来搞个概念证明
,看看怎么样.
还会有些如何
向语言添加隔离
的信息.
还在思考
该如何版本化.
丹尼斯
认为标准库
都会破坏.因此,DIP1000
并不是一个重大变化
.重大更改
是修复
了接受
无效错误,目前,已允许切片
本地静态数组.
罗伯特
的提议,严格来说比DIP1000
更有破坏性.
阿蒂拉
说他理解这一点,但,这段代码
显然是错误的.破坏了代码
.只是编译器
没有告诉你.且DIP1000
的问题是采纳
.问题
是必须到处加域
.
如果修复共享或域
等会破坏
很多代码,难道不应延迟
到新版本
,而不是默认语言
修复?Walter
说DIP1000
显然必须在一个版本
中.
阿蒂拉说:“好吧”.共享
不难.代码
是完全错误的,不会降级
到原子来破坏.沃尔特同意了.
Timon
问,该想法
是否是在共享变量上原子
操作.沃尔特说是的
,针对CPU
支持的原子操作
.如果CPU
不支持,则禁止
.它因目标
而异.
Timon
说是的,但原子
操作不是唯一
同步方法.阿蒂拉说这是真的
,但问题是,总有人丢弃共享
来选出
.
如果打算直接
共享,应该把它传递
给接受共享的函数
,或丢弃掉,并锁定
互斥锁,或想要的其他东西.
Timon
提到了Manu
拒绝所有这些操作
.阿蒂拉说这行不通.今年一直在努力
修复它,但到处都是漏洞
.
Timon
问有什么问题.atila
说有很多,如:synchronized(mutex)
不能使用-preview=nosharedaccess
编译,因为你正在访问互斥锁
.
运行时
不会用它构建,Phobos
也不会.他一直在努力堵住漏洞,但发现最好
不要这样.相反,需要时,只需降级
到原子
即可.
如果不编译
,就没用.
Walter
告诉Timon
,问题是不能按参数
传递共享值
.如果创建了某项内容
的共享指针
,则因为它是共享
的,无法
操作它.
如果要访问共享指针
,则必须通过std.atomic
的引用
来传递它.但是,CPU
上有原子加载
指针类型和其他基本类型
的指令.
为什么不利用
这一点,当目标CPU
可直接支持共享
操作时,允许共享操作.
Timon
说,似乎总是会同步
的.阿蒂拉说,这比现在
的世界要好.再说一遍,如果这样
,且个人资料显示这是你的问题
,请丢弃共享
.
Walter
说,(如果有CPU
指令)可只使用CPU
指令时,调用std.atomic
函数的效率
会降低.Timon
说,问题
的解决方法
似乎是内在(intrinsics)
的.
该提案
像是内在
函数,但语法
更好.有些如何同步
的决定,这样做时,会锁定
默认语法.
原子负载和存储
的合理语义可能根据环境.
atila
对此表示同意,但一般,这是顺序一致性
.
沃尔特说,这与向量指令
方面问题相同.如果代码
中请求操作
存在指令
,则编译器
为你生成向量指令
.如果目标CPU
上不存在该指令
,则编译器无法编译
,你可决定
替代路径.
所以,如果编译,就会起作用.如果无法在目标
计算机上编译,则必须找出
解决方法.
Walter
继续说道,如果CPU
有原子加载整数的指令
,编译器
就支持它,它会给你原子加载
.如果要编译不支持
整数原子负载的CPU
,它无法编译.
这正是向量指令
的工作方式
.在这方面
取得了成功
.他对此很满意.
他说,迁移
到不同
平台时,也许共享代码
会中断,也许不会
.但这是应该
的,因为共享
与CPU
的构造
方式隐含在一起.所以这是应该做的.
沃尔特
沃尔特说,已可解决DConf
上出现的一堆
问题.他对被迫为ImportC
使用微软
汇编语法,非常失望,因为他们
没有提供最终不用内联汇编器版本的头文件的路径
.