原文
罗伯特说他很高兴.Dennis
问编译器
是否足够快.
他只是想在编译器中看到LSP
支持,并利用
所有好东西.
Walter
指出,他一直致力于提高
编译速度.他发现编译器是带异常
编译的,所以他一直在努力无异
编译,看看这对速度有什么影响.
亚当说他的库在半秒钟
内完成编译.罗伯特说这还是太慢了.他的工作
项目没有在半秒钟
内完成.他说他的目标是,在Ninja
或他使用的构建工具/编译器
上按"Enter"
键后时,它应该已重启
了应用.
阿蒂拉同意半秒
太长了.
亚当提出了D1
.他在2007
年写的一款旧游戏在10
毫秒内编译和链接
.查看D1
和D2
之间的很大差异,当时的object.d
大约有600
行.
而现在它要大得多,因此.沃尔特说,他对object.d
的状态有点不高兴.它应该是一件小东西,在某个时候变成了个垃圾场
.
Steve
说,Dennis
在初化静态关联数组
的编译器部分的PR
方面做得非常出色.史蒂夫认为,如果有人能按下
按钮,它就准备好了.
他不想推动它,因为他不太了解编译器代码
,也无法保证它的正确性
.此时PR
仍开放这里.
丹尼斯说他一直在做AA
公关.还有一些,比如查看
弃用(-d/-de/-dw)
和过时
警告(-wo)
开关的模式支持,及静态构造器的独立属性(standalone)
或编译指示
要做.
八月
会议以来,丹尼斯
已提交了@standalone
属性的PR
这里,但在PR
讨论线程中,沃尔特认为这应该是个编译指示
.
马丁说,在LDC
升级至2.104
前端方面进展
顺利,且非常轻松.
接着,他看见一篇关于让LDC
在8位AVR
平台上工作的论坛帖子.他研究了该问题,发现这是个有趣
的问题,即是否及如何
支持指针大小小于32
位的架构.
目前,前端
有一个硬编码限制:size_t
和ptrdiff_t
是32
位或64
位,且不能小于它.这是个前端检查,DRuntime
中的定义
直接根据编译器的内部类型
,因为它们使用typeof
式.
他让前端
接受16
位和8位size_t
和ptrdiff_t
,但这样做会违反整数提升
规则.使用
较小的int
时,提升
规则有时工作,但是有类似切片
长度或加一或减一
时,这是个问题.
需要转换
它.因此,或需要改变
提升规则,试模仿C++
的此方面,或做得更好.他说亚当
在过去的讨论中提出了,可一般
处理它,所以它仍是目标独立
的.
Walter
想知道Rust
是否支持低于32
位的编译,及他们为此做出了什么妥协.马丁说他不确定.他只检查了C和C++
.
Robert
查找了一下,发现Rust
对16
位MSP340
有一点支持,但它是一个大星号
,其他一切都是32
或64
位.
马丁
不确定是否值得研究这些架构,因为他不知道它们会存在多久.对低功耗
,即使你提前几年玩,即使是那些非常小和节能
的传感器,或其他什么,它也将是32
位.
但是他无法展望未来,所以他没有真正的想法.
Walter
说,当他设计D时,16
位架构已死了,每个人都会使用嵌入式32
位处理器.但这是个巨大
的简化.在C中有很多麻烦,因为不能预测整数
大小.
只是无休止的问题和痛苦.
沃尔特说,他一直在修改编译器前端
,以便让DMD
更适合作为守护程序
.
为此做了不少改变.一些PR
仍在那里,等待拉动.想法
是查看D的子系统
,并删除全局状态
依赖,及环境和操作系统
的依赖,以便有个取需要的所有参数
,执行操作,并返回数据的简单的入口
函数.
然后,调用者
可决定是否写入
文件或如何处理
错误消息,等等.
他说,这样设置
时,有点令人满意.错误槽
是他朝该方向的第一次尝试
.词法器
和解析器
现在可与编译器
的其余部分分离
,且可重启
.
表明LSP
守护程序或内容都可是多线程
的,因为你可用此设置
同时多个
编译.还有很长
的路要走,但它正在继续.
他还在考虑重定义
胶水代码接口,这样会让伊恩和马丁
生活更轻松一些.马丁说他不太确定.当前状态下的接口
绝对没问题.
Walter
说他已提交了大量PR
来从文档
生成器中删除所有外部依赖项
,且已接近完成
.他已分离出宏处理器
,因此它现在是独立
的.这就是他一直在做的.
他接受了罗伯特的观点,并认为这很重要.Razvan
没有参加会议,但Walter
很好奇他的想法,因为他一直在为按库使用DMD
工作.
他问罗伯特,DMD
作为库和LSP
服务器期望工作
是否相同.
Robert
说,DMD
作为库是构建LSP
的一个重要构建块
,但是在构建接受命令,运行编译器
并返回JSON
信息的服务器方面,还有更多
.
编译器库
是其中的重要组成
部分.其余的只是胶水
.
然后Walter
感谢Steve
和Dennis
致力于静态初化AA
.很长一段时间,他一直认为这是不可能的.史蒂夫说服他这是可以合理完成
的.
最后,Walter
向Mathias
提出了-preview=in
的问题.他记得在一次会议上讨论过该功能
应总是通过引用传递
,但是查看实现
时,他发现没有更改它.
它仍采取原始
方法,根据情况按值或按引用
传递.马蒂亚斯记得,并同意改变它,但未完成.他说马丁
说他会保留LDC
目前的行为.
沃尔特问马蒂亚斯是否想改变
.马蒂亚斯说他会这样做,而且会以不会阻止LDC
方式这样做.
沃尔特建议马丁为LDC
做出改变,因为改变
是有充分理由的.马丁说,这里存在分歧.这是他10
年前想看到的功能,他很高兴Mathias
实现了它.
他不会转储
它,但可能会把它放在开关
后面以启用或禁止它.这并不理想
,但他非常喜欢该功能
.
沃尔特说这是个可靠性
问题.如果总是通过引用
,则它是可预测
行为.拥有可预测和可移植
的行为非常重要.马丁提醒他,很久以前就讨论过该问题.
他仍强烈认为,一旦把每个这种都当作引用
,或对引用工作,但不依赖
标识,就没问题了.
99.99%
的代码都是这样.这很好.对ldc
,会良好定义.不是实现
定义的,而是依赖
目标.
马蒂亚斯
说他同意马丁的观点.但是,只需使DMD
总是通过引用
传入参数就可以了.这是上次
讨论时想出的最好
的折衷方案.
Ali
确认此功能解决了右值引用
问题.如果想接受右值
,只需使用in
.马蒂亚斯说确实如此.
Mathias
说,他已看到唯一
阻止预览
完成的是前端中的一个错误,它与另一个与预览
无关的错误相关联.这有点难.
这与CTFE
有关,但他没有时间深入
研究.所以它仍被阻止了.他说这是明确
的,他只是需要有人来解决问题.丹尼斯说他会调查一下.
马丁认为该问题
阻止了他的一个旧公关
.他不记得是哪个PR
,但他确信这是同一个CTFE
问题.问题是根本不会析构CTFE
语句中的临时变量.
很难
得到与运行时相同的析构行为.
沃尔特说,他可预见
这是个麻烦
.CTFE
引擎一团糟.
Dennis
想知道一旦开始在CTFE
中运行析构器,是否会破坏
代码.很多析构器只是调用释放(free)
.Martin
指出,必须在先分配的东西上,调用free
的析构器.
这在ctfe
上行不通
.当前默默跳过
所有析构器
的行为是错误
的.大错特错.
史蒂夫说,如果打算在CTFE
使用的析构器
中释放
,已有if(__ctfe)
分支来解决malloc
.析构器中因此也要有它.不稀奇.