关于涡扇IR执行的独特性的问题

Questions about the uniqueness of turbofan IR execution

我正在研究 V8 的涡轮风扇,我有几个关于涡轮风扇 IR 的问题:

  1. 涡扇IR的执行顺序是否唯一? tf不唯一,请问是什么原因?
  2. 有没有 属性 的唯一性? (例如,在某种块单元中保留了唯一性。)
  3. 是否存在两个实际存在副作用的操作之间没有副作用边缘的情况?

+) 有文档描述Turbofan IR的语义吗?我发现这个 IR 源自 Sea-of-Node(by Cliff Click),因此从他的论文中获得了一些提示。不过涡扇的IR好像和原来的有点不一样。例如,在原始节点海中没有效果边缘。所以如果有任何文档解释Turbofan IR,那将是非常有帮助的。

谢谢。

  1. observable 操作顺序必须(当然!)不能被编译器改变。考虑到您在评论中提到的示例:
console.log(1);
console.log(2);

编译器不得对这两个调用重新排序,因为这会改变程序的行为,而编译器不允许这样做(原因很明显)。
不可观察 指令可以按照编译器需要的任何方式重新排序。例如,1 + x + 2 可以重新排序为 x + 1 + 2,然后简化为 x + 3
(请注意,这与 Turbofan(甚至 JavaScript)无关,它是适用于所有语言的所有编译器的通用声明。)

  1. Turbofan 在节点之间使用“效果”边来确保始终保留可观察到的操作顺序。

  2. 那将是一个错误。

您可以在此处找到一些文档:https://v8.dev/docs/turbofan