2311d9月会议
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
使用微软
汇编语法,非常失望,因为他们
没有提供最终不用内联汇编器版本的头文件的路径
.
相关文章:
2311d9月会议
DLF2023年9月月度会议摘要 Robert Robert,在DConf上做了一些初步的JSON5工作.他还更新了Bugzilla到GitHub的迁移脚本.他使用了"隐藏"API,现在脚本要快得多. 除此外,他在DScanner上做了一些小事,并等待JanJurzitza(Webfreak)合并它们.他指出,沃尔特曾要求他写一篇演…...

《算法通关村——二分查找在旋转数字中的应用》
《算法通关村——二分查找在旋转数字中的应用》 这里我们直接通过一个题目,来了解二分查找的应用。 153. 寻找旋转排序数组中的最小值 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如&a…...
C/S架构学习之基于TCP的本地通信(服务器)
基于TCP的本地通信(服务器):创建流程:一、创建字节流式套接字(socket函数): int sock_fd socket(AF_LOCAL,SOCK_STREAM,0);二、创建服务器和客户机的本地网络信息结构体并填充服务器本地网络信…...

乡镇村污水处理智慧水务智能监管平台,助力污水监管智慧化、高效化
一、背景与需求 随着城市化进程的加速,排放的污水量也日益增加,导致水污染严重。深入打好污染防治攻坚战的重要抓手,对于改善城镇人居环境,推进城市治理体系和治理能力现代化,加快生态文明建设,推动高质量…...

OSPF综合
实验拓扑 实验需求: 1 R4为ISP,其上只能配置IP地址; R4与其他所有直连设备间均使用公有IP 2 R3-R5/6/7为MGRE环境,R3为中心站点 ; 3 整个OSPF环境IP基于172.16.0.0/16划分; 4 所有设备均可访问R4的环回; 5 减少LSA的更新量,加快收…...

vue分片上传视频并转换为m3u8文件并播放
开发环境: 基于若依开源框架的前后端分离版本的实践,后端java的springboot,前端若依的vue2,做一个分片上传视频并分段播放的功能,因为是小项目,并没有专门准备文件服务器和CDN服务,后端也是套用…...

【MySQL】对表结构进行增删查改的操作
表的操作 前言正式开始建表查看表show tables;desc xxx;show create table xxx; 修改表修改表名 rename to对表结构进行修改新增一个列 add 对指定列的属性做修改 modify修改列名 change 删除某列 drop 删除表 drop 前言 前一篇讲了库相关的操作,如果你不太懂&…...

Hadoop原理,HDFS架构,MapReduce原理
Hadoop原理,HDFS架构,MapReduce原理 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,…...

【Spring Boot】035-Spring Boot 整合 MyBatis Plus
【Spring Boot】035-Spring Boot 整合 MyBatis Plus 【Spring Boot】010-Spring Boot整合Mybatis https://blog.csdn.net/qq_29689343/article/details/108621835 文章目录 【Spring Boot】035-Spring Boot 整合 MyBatis Plus一、MyBatis Plus 概述1、简介2、特性3、结构图4、相…...
Hafnium之强制性的接口
安全之安全(security)博客目录导读 目录 一、FFA_VERSION 二、FFA_FEATURES 三、FFA_RXTX_MAP/FFA_RXTX_UNMAP 四、FFA_PARTITION_INFO_GET 五、FFA_PARTITION_INFO_GET_REGS...

计算机视觉:使用opencv实现银行卡号识别
1 概述 1.1 opencv介绍 OpenCV是Open Source Computer Vision Library(开源计算机视觉库)的简称,由Intel公司在1999年提出建立,现在由Willow Garage提供运行支持,它是一个高度开源发行的计算机视觉库,可以…...

【Proteus仿真】【Arduino单片机】简易计算器设计
文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器,使用PCF8574、LCD1602液晶、4*4矩阵键盘等。 主要功能: 系统运行后,操作矩阵按键可实现简单四则运算。 二、软件设计 /* …...

pychon/PIL/opencv/json学习过程中遇到的问题
1. 使用PIL.Image读取图片 注意:pytorch中对图像预处理是transforms的输入必须是PIL格式的文件,使用cv2读取的图片就按照第二条的代码处理(3通道合并、归一化处理) from PIL import Image img Image.open("test1.jpg"…...

YOLO目标检测——番茄数据集下载分享【含对应voc、coco和yolo三种格式标签】
实际项目应用:番茄检测数据集说明:番茄目标检测数据集,真实场景的高质量图片数据,数据场景丰富标签说明:使用lableimg标注软件标注,标注框质量高,含voc(xml)、coco(json)和yolo(txt)三种格式标签…...
(JAVA)线程
线程的创建 方式一:Thread public class dome {public static void main(String[] args) {MyThread myThread new MyThread();myThread.start();for(int i1;i<5;i){System.out.println("主线程"i);}} }public class MyThread extends Thread{Overri…...
【深度学习环境】windows安装 NVIDIA Docker
摘要 不要安装 Docker Desktop!我们将在 Ubuntu 中自行安装 Docker。 请安装 Windows 10 Insider Build 或 Windows 11 (Beta也行)。(稳定发行版无法在 WSL 2 中使用 GPU) 请安装 WSL 2 w/Ubuntu 20.04 或同等版本。…...
【微信小程序】自定义组件(三)
自定义组件 插槽1、什么是插槽2、单个插槽3、定义多个插槽 父子组件之间的通信1、父子组件之间的通信的3种方式2、事件绑定3、behaviors 插槽 1、什么是插槽 在自定义组件的wxml结构中,可以提供一个<solot> 节点(插槽),用…...

Python语言:经典案例分析讲解2
例题1:文件的操作 例题2:调用函数求偶数之和 例题3:调用函数并使用递归的方法求斐波那契数前N项之和 题1: 以只写的模式打开文件test.txt,写入"Python",关闭文件。 代码如下: f open("E:/…...

dbeaver连接别人的数据库没有表
1.概念 非缺省的数据库: 通常是指在一个数据库管理系统(DBMS)中,除了系统默认创建的数据库之外的其他用户创建或自定义的数据库。许多数据库系统在安装后会创建一个默认数据库,例如MySQL中的mysql数据库,…...

EXIT(1)
EXTI介绍 EXTI是片上外设 NVIC是cpu内的外设 回忆起之前的GPIO和AFIO 我们是如何检测按键按下的 我们是一直用while循环读取IDR寄存器的对应位置的值 一直检测判断按键是否被按下 那么是否有第二种方式检测按键是否被按下了呢? 通过EXTI 当EXTI检测到按键的电平发生…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...