难以理解 LLVM 文本 IR 与跨版本二进制表示之间兼容性的不对称性
Difficulty understanding the asymmetry in compatibility between LLVM text IR vs binary representation across versions
在阅读有关 LLVM 及其自己的文档的各种文章时,我看到了对 属性 的引用,我对它的 IR 的向后兼容性感到奇怪。
很多关于 IR 的文档都提到它不稳定,几乎随时都可能崩溃。然而,它也经常提到,对于给定的特定 LLVM 版本,位码 IR 比文本 IR 更向后兼容(如 'often valid across more versions')。
我的理解是字节码-> 位码转换几乎是一种直接映射。知道这些,why/how是不是文本IR不太兼容?我似乎无法找到有关驱动此行为的实际机制的文档。
可以在此处找到关于 IR 兼容性的此类声明的一个示例:http://llvm.org/docs/DeveloperPolicy.html#ir-backwards-compatibility
作为开发人员而不是开发 LLVM 的人发言。
正如您想象的那样,位码更像是一个虚拟机,它有一个特定的指令设置为 64 位,在量子计算机指令流行之前,它很少会改变。由于新的 64 位芯片具有增量增强功能,因此对 'append' 新的位码处理来说并不是什么大手术。
另一方面,IR 是一种文本表示形式,它将通过一次或多次传递来获得位码或机器码。为了支持新功能,显然有一个 net 'add'(新指令)以及对现有指令的修改。这不仅会影响 IR parsers/emitters,还会影响它们之间使用的许多 intermediate/ephemeral 数据模型。显然,这也会影响 C/C++ LLVM API。确实要保持向后兼容性非常昂贵。
我认为 LLVM 开发人员 选择 承诺对位码具有更高的兼容性,因为与文本表示相比,有更多明显的用例受益于向后兼容的位码。
例如,您可以将库存储和分发为 LLVM 位码,并将它们加载到某种用户语言的即时编译解释器中。每当升级解释器时都必须升级位码可能会很不方便。 Bitcode 是一种机器接口,在定义明确的兼容性下更有用。
文本 LLVM IR 更常用于 LLVM 的调试、文档或内部测试,在这种情况下,每当(不经常)对表示进行更改时更改任何失败的代码更为实用。中间代码长期存储或广泛分布的可能性似乎较小。
由于保持向后兼容性会对实现工作(例如,参见 C++ 解析器)和语言的未来发展(想想现代编程语言为处理过去不明智的决策而做出的努力)产生负面影响,
LLVM 社区选择仅在有明显好处时才这样做。我认为格式中没有固有的技术原因,因为两种格式都必须正确解析和处理。
在阅读有关 LLVM 及其自己的文档的各种文章时,我看到了对 属性 的引用,我对它的 IR 的向后兼容性感到奇怪。
很多关于 IR 的文档都提到它不稳定,几乎随时都可能崩溃。然而,它也经常提到,对于给定的特定 LLVM 版本,位码 IR 比文本 IR 更向后兼容(如 'often valid across more versions')。
我的理解是字节码-> 位码转换几乎是一种直接映射。知道这些,why/how是不是文本IR不太兼容?我似乎无法找到有关驱动此行为的实际机制的文档。
可以在此处找到关于 IR 兼容性的此类声明的一个示例:http://llvm.org/docs/DeveloperPolicy.html#ir-backwards-compatibility
作为开发人员而不是开发 LLVM 的人发言。
正如您想象的那样,位码更像是一个虚拟机,它有一个特定的指令设置为 64 位,在量子计算机指令流行之前,它很少会改变。由于新的 64 位芯片具有增量增强功能,因此对 'append' 新的位码处理来说并不是什么大手术。
另一方面,IR 是一种文本表示形式,它将通过一次或多次传递来获得位码或机器码。为了支持新功能,显然有一个 net 'add'(新指令)以及对现有指令的修改。这不仅会影响 IR parsers/emitters,还会影响它们之间使用的许多 intermediate/ephemeral 数据模型。显然,这也会影响 C/C++ LLVM API。确实要保持向后兼容性非常昂贵。
我认为 LLVM 开发人员 选择 承诺对位码具有更高的兼容性,因为与文本表示相比,有更多明显的用例受益于向后兼容的位码。
例如,您可以将库存储和分发为 LLVM 位码,并将它们加载到某种用户语言的即时编译解释器中。每当升级解释器时都必须升级位码可能会很不方便。 Bitcode 是一种机器接口,在定义明确的兼容性下更有用。
文本 LLVM IR 更常用于 LLVM 的调试、文档或内部测试,在这种情况下,每当(不经常)对表示进行更改时更改任何失败的代码更为实用。中间代码长期存储或广泛分布的可能性似乎较小。
由于保持向后兼容性会对实现工作(例如,参见 C++ 解析器)和语言的未来发展(想想现代编程语言为处理过去不明智的决策而做出的努力)产生负面影响, LLVM 社区选择仅在有明显好处时才这样做。我认为格式中没有固有的技术原因,因为两种格式都必须正确解析和处理。