本地编译是作为字节编译的副作用实现的(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-or-file 编译为本地代码。 参数 function-or-file 可以是函数符号、Lisp 形式, 或是包含待编译 Emacs Lisp 源代码的文件名(字符串)。 如果提供可选参数 output,它必须是字符串, 指定用于写入编译代码的文件名。 否则,如果 function-or-file 是函数或 Lisp 形式, 该函数返回编译后的对象; 如果 function-or-file 是文件名, 函数返回为编译代码创建的文件的完整绝对路径。 输出文件默认使用 .eln 扩展名。
该函数会在独立子进程中运行本地编译的最后阶段, 通过 libgccjit 调用 GCC, 子进程使用与调用该函数的 Emacs 相同的可执行文件。
该函数在批处理模式下对 Emacs 命令行指定的文件执行本地编译。
它只能用于 Emacs 的批处理执行,因为编译完成后会退出 Emacs。
如果一个或多个文件编译失败,Emacs 进程会尝试编译所有其他文件,
并以非零状态码退出。
可选参数 for-tarball 非nil 时,
告知函数将生成的 .eln 文件放入
native-comp-eln-load-path 的最后一个目录中(see 库搜索);
这主要用于首次构建 Emacs 源码压缩包的场景,
此时源码压缩包中缺失的本地编译文件应生成在构建目录中,而非用户缓存目录。
本地编译可以完全异步运行,在主 Emacs 进程的子进程中执行。
这使得编译在后台运行时,主 Emacs 进程可正常使用。
当某个 Lisp 文件或字节编译文件没有对应的本地编译版本时,
Emacs 会使用此方法对其进行本地编译。
注意:由于使用子进程,本地编译可能产生字节编译不会出现的警告和错误,
因此 Lisp 代码可能需要修改才能正常工作。
更多细节参见 see 本地编译变量 中的 native-comp-async-report-warnings-errors。
该函数异步编译指定的 files。
参数 files 应为单个文件名(字符串)或一个包含多个文件/目录名的列表。
如果列表中包含目录,可选参数 recursively 应设为非nil,
使编译递归进入这些目录。
如果 load 非nil,Emacs 会加载每个成功编译的文件。
可选参数 selector 用于控制编译哪些 files,可以是以下值之一:
nil 或省略选择 files 中的所有文件和目录。
选择名称匹配该正则表达式的文件和目录。
谓词函数,对 files 中的每个文件和目录调用,
应返回非nil 表示该文件或目录需要被选中编译。
在拥有多个 CPU 执行单元的系统上,当 files 包含多个文件时,
该函数通常会并行启动多个编译子进程,
数量由 native-comp-async-jobs-number 控制(see 本地编译变量)。
此命令将当前缓冲区访问的文件编译为本地代码, 前提是该文件自上次本地编译后已被修改。
此命令与 emacs-lisp-native-compile 类似,
将当前缓冲区访问的文件编译为本地代码,
但编译完成后还会加载该本地代码。
以下函数允许 Lisp 程序在运行时检测本地编译是否可用。
如果运行中的 Emacs 进程内置了本地编译支持,该函数返回非nil。
在动态加载 libgccjit 的系统上,它还会确保该库可用并能被加载。
需要提前知道本地编译是否可用的 Lisp 程序应使用此谓词函数。
默认情况下,异步本地编译将生成的 *.eln 文件
写入 native-comp-eln-load-path 变量指定的第一个可写目录的子目录中(see 本地编译变量)。
你可以在启动文件中使用以下函数修改此行为:
该函数设置异步本地编译将生成的 *.eln 文件写入 cache-directory,
它必须是单个目录(字符串)。
它还会破坏性修改 native-comp-eln-load-path,
使其第一个元素为 cache-directory。
如果 cache-directory 不是绝对路径,
则相对于 user-emacs-directory 解析(see The Init File)。