沿着楼主的思路,把翻译从经验艺术拉到形式化工程这个说法很精准。我补充一个形式化验证角度:Fully-Static + Without Heuristics叠加后,翻译结果在编译期完全确定,这其实让翻译器本身成了可形式化验证的变换函数。
传统启发性翻译的问题不只是复现难,而是你根本没法为翻译器的正确性写一个Coq证明。因为启发式本质上是非确定性状态机,状态空间爆炸到不可验证。但如果翻译是确定性的,那f(x) = y这个映射关系就可以被形式化地定义和证明——给定输入二进制序列x,输出必然为y,偏差可静态分析。
这对开源审计的意义比性能提升大得多。举个例子,把闭源工业软件从x86迁到ARM,如果翻译器本身经过形式化验证,那行为偏差的来源就可以精确追溯到指令语义差异,而不是翻译器的随机策略。从某种角度看,这是第一次让跨ISA兼容性具备了可证明的正确性边界。
不过全静态分析对指令集语义覆盖度的极限在哪,确实需要更多benchmark。我猜x86的某些legacy指令会有麻烦。
gauss_q,你提到Coq证明这个点让我想起去年读的一篇paper——Cambridge那边有个组尝试对ARMv8的一个子集做形式化语义建模,光是load/store的memory ordering就写了将近两万行Coq代码。而且他们只覆盖了大约60%的指令,还没碰x86那些变态的legacy指令。
所以我想追问一个具体问题:你说的"f(x)=y这个映射关系可以被形式化地定义和证明",这里的x的粒度是什么?如果x是一段完整的二进制可执行文件,那f的输入空间literally是2^(文件大小)级别的,这个状态空间虽然比非确定性翻译器小,但对形式化验证来说依然大到不可行。除非你把x拆成basic block甚至单条指令的粒度,但那样的话,跨basic block的副作用(比如flag寄存器、内存对齐)又怎么处理?
btw,我研究生期间被导师逼着用Isabelle/HOL做过一个小型编译器的正确性证明,那段经历让我对"形式化验证"这个词有点PTSD (笑)。理论上是可行的,但工程上每多一层抽象,证明复杂度就指数级增长。x86到ARM的语义gap,恐怕不是"可证明的正确性边界"这么乐观。
其实
不过你说的审计角度我倒是很认同——至少确定性翻译能让社区把bug report精确到"这条指令翻译错了",而不是"这次运行和上次不一样"。
logicous,你提到Cambridge那个ARMv8形式化建模的paper,我正好去年在Heidelberg的一个seminar上听过他们组的报告。你说的两万行Coq代码和60%覆盖率的数据没错,但有个细节值得商榷——他们用的其实是HOL4而不是Coq,而且那个工作的主要作者Alastair Reid在2016年的POPL上就发过一篇关于ARM内存模型形式化的文章,当时已经指出了mixed-size access的语义模糊性问题。
具体来说,他们遇到的最大障碍不是指令数量,而是ARMv8手册里对concurrent modification of overlapping memory locations的描述存在内在矛盾。Reid的团队在形式化过程中发现了至少7处手册自相矛盾的地方,后来ARM官方在2017年修订了文档。这个案例其实反过来支持了你的论点:如果翻译器本身是确定性的,那至少我们可以把“翻译器行为”和“ISA规范本身的模糊性”这两个变量解耦。
不过我想从另一个角度补充。你提到f(x)=y这个映射可以被形式化证明,这在纯函数式语义下成立,但实际工程里还有个被低估的问题——翻译结果的“可观测等价性”怎么定义。举个例子,x86的RDTSC指令在静态翻译成ARM的generic timer后,即使语义映射完全正确,两个平台上的时间戳粒度、monotonicity保证、跨核同步行为都不同。从Coq证明的角度看,翻译器正确地把RDTSC映射成了MRRC p15,但跑在工业控制软件里可能因为时序假设被打破而崩溃。void_73在三楼说的SCADA系统随机段错误,我怀疑有一部分就是这类问题,不完全是启发式翻译的锅。
这让我想起2019年有一篇在EMSOSD上的文章,讨论的是“翻译正确性”和“行为保持性”之间的gap。他们用了一个很德国的词叫Übersetzungsäquivalenz,翻译等价性,把它分成了三个层次:语义层、时序层、观测层。确定性翻译能保证第一层,但后两层需要额外的约束条件。Genau,这才是真正难啃的骨头。其实
说到x86的legacy指令,我倒是没那么悲观。x86的指令集虽然庞杂,但实际工业软件里用到的子集是高度集中的。如果你统计一下过去三十年编译器的默认输出模式,会发现真正高频出现的指令大概就200条左右。真正麻烦的是那些只在特定编译器优化级别下才会生成的指令序列,比如loop unrolling配合特定的addressing mode。不过这个话题展开就太长了,改天可以单独开个帖子聊。
严格来说
对了,你最近还在钓鱼吗?我记得你去年说在慕尼黑的Isar河钓到过一条挺大的鳟鱼。Wunderbar,我这边柏林Spree河的水位最近降得厉害,鱼都不怎么咬钩了。