总结
DMDARM
后端
Razvan
问Walter
他对DMD
的ARM
后端的分发,并想知道他是否考虑过其他选择
,如整合DMD
前端与LDC
后端.
Walter
说,人们写信告诉他,他们喜欢使用DMD
,因为它体积小,速度快
.多年来,就要求他实现ARM
后端.
有的人想写一个,但后来因为太难或太耗时
而丢弃了.所以他决定完成它
.
他最初不打算优化
.ARM
指令集复杂得离谱
,但有一条简单的路径
.他坚持使用简单路径
,且不会生成超出全局优化器
和寄存器
分配器已完成的优化代码
.
一旦实现简单路径
并正常工作
,就可基于每条指令微优化
.当前,他的进度
很快.可编译简单的函数
,且生成的代码
是正确的.
他已为它编写了一个反汇编器
,这样,就方便检查
生成的代码.一个大问题是缺少内联汇编器
.如果没有它,就无法编译所有运行时
.
BradRoberts
已编写了一个ARM
反汇编器,并表示想适配ARM64
.这与编写ARM
后端无关,所以如果他能完成就好了.
Razvan
认为,用D认真工作
的人都会因ARM
使用LDC
.
虽然这对D的总体方向
可能很有趣,但他不确定这是否是Walter
的最好分配时间.
沃尔特说,这很对,但他对它所带来
的惊讶之多
感到兴趣.此外,从头到尾
控制编译器是件好事
.他不知道LDC
和GDC
的后端工作原理
,因此他很难添加新功能
.
Walter
说,DMD
中的Intelx86
内联汇编器并不是他编造的什么笨拙的东西
.它与Intel
的规范
匹配,因此有一一对应
的关系.
ARM
的反汇编器
及他打算搞的汇编器
匹配规范.他对LDC
和GDC
使用的语法一无所知.
Martin
说,对x86
,有两个方言,Intel
和AT&T.LDC
和GDC
都使用了AT&T
方言,而该方言恰好不太常用.但对ARM
来说,他们恰好到处都是相同方言.
重要的是它是基于串的
,因此可独立于架构
.
他说内联汇编器
是个小问题.关于Razvan
对Walter
使用时间的问题,Martin
说根据Walter
.如果他认为价值,他就应该去做.
几年前,当该讨论前出现时,Martin
认为Walter
的时间最好花在修复漏洞
上.但他现在有很多行业经验.甚至Symmetry
也仅是因为它的速度
,而使用DMD
来调试构建
.
他同意Walter
.在一个代码基
中,而不是依赖有巨大后端的巨大代码基
中,放置所有内容
真是太好了.在DMD
中快速的完成了所有操作
.
这是最主要的事情
.所以他觉得如果Walter
想做这件事,他应该有自由.
Rikki
说,如果没有ARM
支持,DMD
在OSX
上已死了.他说明Atila
想在守护进程
中单元测试
.如果你正在编写目标文件
,则已失败了.DMD
的后端非常适合JIT
.
沃尔特说还有另一个小问题
.很难理解DMD
后端的工作原理
,及如何改进或修改它
.
他已很多年没有看过太多代码了,在试实现ARM
后端时,他不得不重新投入其中,弄清楚它工作原理.他能看出这是多么难以理解
.
它的结构
相当简单,但所有x86
的大量怪
指令集,所有特例,所有来各种对象
的奇怪指令序列
,只是很难梳理
出他们的实现.
他觉得ARM
的实现要简单得多
.
当前,它简单得多,但它遵守与x86
实现相同结构.对想要增强代码生成器
的人来说,它会更容易.它还可帮助想要修改x86
后端的人.
因为结构
是相同,所以可查看它以了解x86
版本中的给定函数
正在做什么.
Walter
同意Rikki
的视图,即可用作简单的JIT
.他没有想到它.
Walter
说,很少需要内联汇编
.但这是当你需要
它时,很重要.否则,你将以十六进制
编程.
蒂蒙说,这是他会在所有方面
都支持沃尔特
的案例之一.为DMD
提供ARM
后端很重要,因为DMD
是一个非常容易理解
的编译器
.
它很容易克隆和构建
.如果它在ARM
上继续工作,那就太好了.至于内联汇编器
,DMD
为x86
干的,要优于LDC
和GDC
.
Walter
说明,他不会试适配
现有内联汇编器
,因为它是一段可怕的代码
.他不是原作者,每次有新的Intel
指令他必须支持时,他总是担心他无法让它工作
.
Rikki
认为,如果今天有人使用内联汇编
,那就是编译器错误
.它表明缺乏内联
.如,原子
都应该是内置
.
这些都不应是内联汇编
.因此,内联汇编器
的优先级应该是低优先级
的.
d标准库与运行时
应该把d运行时
精简到编译器
的期望核心,并在其他位置放置其余部分
.
沃尔特说,它不一定非得去其他地方
.可在不同包中放置编译器和库
来处理.
为什么vibe.d
没有赢得基准测试
Rikki
说,他在上个月受到了启发,审查了vibe.d
,因为它没有赢得基准测试.他查看了核心,发现它轮询每线程的64
个句柄来处理事件.
然后,纤程重载都可安全地移动.
沃尔特说他对此没有异议.
Walter
说,另一个方法可能是使函数
变为纯
.纯函数
禁止访问可变的全局数据
,而TLS
数据就是这样.Rikki
说,这对VM
勾挂等等不行
.
最好是禁止TLS
并有黑名单和白名单
.至少它提供了一条移动路径,直到取得合适的协程.
Mathias
建议每线程运行一个分发器.Rikki
说,问题总结为IOCP
事件.要用IOCP
.即必须支持在线程间移动纤程.
否则,将每线程有64
个句柄.Adam
对此表示赞同.他说,现在窗口
上的一切都依赖IOCP
.没有它,你取得无法性能,吞吐量或低懒.
不得不接受它.
Mathias
问这是否是仅限窗口
的要求.Adam
说Linux
上的iou_ring
是一样的.Rikki
对epoll
说了同样的话.
Mathias
说你可在每个内核上运行一个epoll.Rikki
说,你仍只会在其中一个线程上取得句柄的事件.自窗口2k
以来,IOCP
一直是25
年的黄金标准.
.di
生成器
Rikki
一直在研究.di
生成器,并认为它当前对DI
文件无用.
但他一直分发使用ImportC
和.di
生成来重做d运行时
的头文件,与窗口
模块一样.
Razvan
说明,DMD
内部使用了DI
生成器的一部分.如,如果你想打印一些AST
节点,则你使用DI
生成器中的功能.
Adam
说,根据他的经验,窗口
头文件和API
非常稳定,尽管他确信可找到边角.使用ImportC
生成DI
比所有其他选项
都要好.
它接受了后处理版本
,因为D编译器
也是一个C编译器
,所以它就可正常工作了.他在ODBC
头文件上使用它,效果非常好.
这些现在是d运行时
中窗口
头文件的一部分.
可开始制作更多此窗口
头文件.然后,当有新的窗口SDK
时,更新与提供新SDK
的路径给构建系统并生成DI
文件一样简单.
之所以这样,是因为他一直在研究Phobosv3
和d运行时
,弄清楚需要做什么.为此,使用ImportC
和DI
生成比从C头文件
生成约束
的其他工具
都要好.
Adam
说,动力来自工具.他常用VSCode
,而code-d
可在你只使用普通版本
时读取DI
文件.不经常预处理
可能会带来性能优势
,但这不是动机.
Steve
说还有一个问题,即你无法组织ImportC
文件,但你可组织DI
文件.DI
文件是独立的模块,但ImportC
文件放在一个大模块中,因此如果从多个地方导入,就会冲突.
Adam
说他从ImportC
生成了DI
文件,来他使用zstd
一些工作,效果很好.
D的文档/用户指南
略.