18.1 本地编译函数

本地编译是作为字节编译的副作用实现的(see 字节编译)。 因此,对 Lisp 代码进行本地编译总是会同时生成其字节码, 所有为字节编译准备 Lisp 代码的规则与注意事项(see 字节编译函数) 对本地编译同样有效。

你可以使用 native-compile 函数 对单个函数或宏定义,或是整个 Lisp 代码文件进行本地编译。 对文件进行本地编译会生成包含本地代码的 .eln 文件。

本地编译可能产生警告或错误信息; 这些信息通常记录在名为 *Native-compile-Log* 的缓冲区中。 在交互式会话中,它使用专用的 LIMPLE 模式(native-comp-limple-mode), 该模式会为此类日志配置合适的 font-lock,其他方面与基本模式一致。 本地编译产生的信息日志可由变量 native-comp-verbose 控制(see 本地编译变量)。

当 Emacs 非交互式运行时,本地编译产生的信息 通过调用 message 输出(see Displaying Messages in the Echo Area), 通常显示在启动 Emacs 的终端的标准错误流中。

Function: native-compile function-or-file &optional output

该函数将 function-or-file 编译为本地代码。 参数 function-or-file 可以是函数符号、Lisp 形式, 或是包含待编译 Emacs Lisp 源代码的文件名(字符串)。 如果提供可选参数 output,它必须是字符串, 指定用于写入编译代码的文件名。 否则,如果 function-or-file 是函数或 Lisp 形式, 该函数返回编译后的对象; 如果 function-or-file 是文件名, 函数返回为编译代码创建的文件的完整绝对路径。 输出文件默认使用 .eln 扩展名。

该函数会在独立子进程中运行本地编译的最后阶段, 通过 libgccjit 调用 GCC, 子进程使用与调用该函数的 Emacs 相同的可执行文件。

Function: batch-native-compile &optional for-tarball

该函数在批处理模式下对 Emacs 命令行指定的文件执行本地编译。 它只能用于 Emacs 的批处理执行,因为编译完成后会退出 Emacs。 如果一个或多个文件编译失败,Emacs 进程会尝试编译所有其他文件, 并以非零状态码退出。 可选参数 for-tarballnil 时, 告知函数将生成的 .eln 文件放入 native-comp-eln-load-path 的最后一个目录中(see 库搜索); 这主要用于首次构建 Emacs 源码压缩包的场景, 此时源码压缩包中缺失的本地编译文件应生成在构建目录中,而非用户缓存目录。

本地编译可以完全异步运行,在主 Emacs 进程的子进程中执行。 这使得编译在后台运行时,主 Emacs 进程可正常使用。 当某个 Lisp 文件或字节编译文件没有对应的本地编译版本时, Emacs 会使用此方法对其进行本地编译。 注意:由于使用子进程,本地编译可能产生字节编译不会出现的警告和错误, 因此 Lisp 代码可能需要修改才能正常工作。 更多细节参见 see 本地编译变量 中的 native-comp-async-report-warnings-errors

Function: native-compile-async files &optional recursively load selector

该函数异步编译指定的 files。 参数 files 应为单个文件名(字符串)或一个包含多个文件/目录名的列表。 如果列表中包含目录,可选参数 recursively 应设为非nil, 使编译递归进入这些目录。 如果 loadnil,Emacs 会加载每个成功编译的文件。 可选参数 selector 用于控制编译哪些 files,可以是以下值之一:

nil 或省略

选择 files 中的所有文件和目录。

正则表达式字符串

选择名称匹配该正则表达式的文件和目录。

函数

谓词函数,对 files 中的每个文件和目录调用, 应返回非nil 表示该文件或目录需要被选中编译。

在拥有多个 CPU 执行单元的系统上,当 files 包含多个文件时, 该函数通常会并行启动多个编译子进程, 数量由 native-comp-async-jobs-number 控制(see 本地编译变量)。

Command: emacs-lisp-native-compile

此命令将当前缓冲区访问的文件编译为本地代码, 前提是该文件自上次本地编译后已被修改。

Command: emacs-lisp-native-compile-and-load

此命令与 emacs-lisp-native-compile 类似, 将当前缓冲区访问的文件编译为本地代码, 但编译完成后还会加载该本地代码。

以下函数允许 Lisp 程序在运行时检测本地编译是否可用。

Function: native-comp-available-p

如果运行中的 Emacs 进程内置了本地编译支持,该函数返回非nil。 在动态加载 libgccjit 的系统上,它还会确保该库可用并能被加载。 需要提前知道本地编译是否可用的 Lisp 程序应使用此谓词函数。

默认情况下,异步本地编译将生成的 *.eln 文件 写入 native-comp-eln-load-path 变量指定的第一个可写目录的子目录中(see 本地编译变量)。 你可以在启动文件中使用以下函数修改此行为:

Function: startup-redirect-eln-cache cache-directory

该函数设置异步本地编译将生成的 *.eln 文件写入 cache-directory, 它必须是单个目录(字符串)。 它还会破坏性修改 native-comp-eln-load-path, 使其第一个元素为 cache-directory。 如果 cache-directory 不是绝对路径, 则相对于 user-emacs-directory 解析(see The Init File)。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike