Java的Leyden项目引入Condenser


Java为了提高启动时间性能,在Leyden项目中引入Condenser冷凝器。

Condenser冷凝器专注于最小化或转移计算以提高性能,或者说未来将是允许将基于 Java 的程序直接打包为静态独立可执行文件,Java 应用程序不必“预热”。

这是探索一种模式:在编译时执行通常在运行时完成的操作。

Leyden 目标是选择性地转移和约束计算
移动Shifting计算是将通常在运行时执行的工作移至运行时之前的较早阶段,或者移至运行时稍后的某个点。
我们可以通过下面两点来移动计算:

  1. 静态转换(例如,替换Class.forName("com/foo/Bar")为ldc Constant_Class_info[com/foo/Bar])
  2. 或通过动态分析(例如,在构建时运行应用程序代码并记录结果以供以后使用)。

限制Constraining计算意味着缩小应用程序通常具有的运行时选项的范围,例如动态重新定义类的选项。

选择性Selectively地转移和约束意味着开发人员可以灵活地选择要转移的计算类型:

  • 例如,提前编译代码但保留动态去优化,以及
  • 何时转移它们,例如,不必费心提前编译对于普通的编译和测试周期,但对于升级的构建则这样做。

移动Shifting计算的主要手段是condenser冷凝器。

condenser是一种对程序进行转换的组件,转换后的程序在语义上等同于既定的约束条件(如 "类 X 不会被重新定义"),但可能更小、更快或更适合特定的执行环境。

编写冷凝器的 API 看似简单:

interface Condenser {
    ApplicationModel condense(ApplicationModel model);
}

冷凝器“只是”应用模型的功能变换,因此可以轻松地组合冷凝器。

网友解释:
1、condenser 建议是一种将优化应用于 Java 代码的方法 - 有点像您在 LLVM 或 GCC 等编译器中看到的优化过程。
这与注释处理器/Codegen/字节码操作工具有何不同?
与注释处理器或字节码库不同,冷凝器专注于最小化或转移计算以提高性能。转移计算有两种主要方法:

  • forwards及时(应用程序运行后),通过Computed Constants提案等方式
  • backwards及时(在应用程序运行之前),通过替换或修改代码片段的评估

冷凝器通过转换代码的抽象表示来工作,而不是直接操作源文件。这种表示有点像编译器中的 AST(抽象语法树)。
Source Code Model -> Transform 1 -> ... -> Transform N -> Final Model

一个关键的优点是冷凝器很容易通过将它们链接在一起来组成:

type ModelTransformFn = (Model) -> Model

modelPipeline = pipe(
  deadCodeEliminationPass,
  replaceConstantsPass,
  resolveLambdasPass
)

finalModel = modelPipeline.run(originalModel)

冷凝器在封装代码结构和语义的不可变模型上运行。

condensers 允许灵活地组合优化,将工作从运行时转移出去,同时保持代码表示易于分析和转换。


总之,condenser冷凝器是一个有趣的概念,它是许多开发环境中迫切需要的一个(也就是说,为了使编译时语言尽可能强大并与真实的东西兼容,Zig 中投入了大量的工作,还有巨大的 PITB 正在用 C++ 做这些事情)