想添加字节码操作?

有时我们需要添加新的字节码操作来表达或优化 JavaScript 的某些功能。本文档旨在帮助你确定是否应该添加字节码操作,以及如果这样做需要进行哪些更改和集成。

可以将此视为功能添加文档的更专业版本。

第一步:你真的需要新的字节码操作吗?

除了增加字节码空间,还有其他替代方案!

  • 自托管内联函数 可以使用 GetIntrinsic 字节码直接从字节码生成器访问。例如,请参阅 BytecodeEmitter::emitCopyDataProperties。对内联函数的调用也可以 (可选地) 使用 CacheIR 进行优化

  • 将你想要的行为转换为一系列已存在的操作。如果可以,这通常是正确的选择:对所有事物的支持大多是免费的。

    • 如果需要特殊处理,是否可以教 JIT 编译器识别你的字节码序列?如果这种习惯用法识别成本过高,那么新的字节码操作可能是更好的选择。

第二步:我们能使你的字节码更快吗?

为了在我们的 JIT 编译器中实现字节码,我们对字节码施加了一些限制。例如,每个字节码都必须是原子的,以支持回退和异常行为。这意味着你的操作不得创建撕裂的对象或无效的状态。

理想情况下,将有一个快速的内联缓存来实现你的字节码,因为这为我们的 BaselineInterpreter 层带来了速度和性能,而不是等待 Warp。

当行为在运行时发生很大变化时(即,我们根据操作数类型选择不同的路径),IC 非常有价值。我们使用它的示例包括 JSOp::OptimizeSpreadCallJSOp::CloseIter,它们都允许我们在常见情况下生成快速路径,或者在必要时回退到更昂贵的方法。