在之前的文章中我们了解了一点基础的汇编语法以及与C程序的混用技巧,现在我们进一步来学习使用及时编译技巧「JIT」。
关于JIT的简介「来自 wiki」
在计算机技术中,即时编译(英语:just-in-time compilation,缩写为JIT;又译及时编译、实时编译),也称为动态翻译或运行时编译,是一种执行计算机代码的方法,这种方法涉及在程序执行过程中(在执行期)而不是在执行之前进行编译。通常,这包括源代码或更常见的字节码到机器码的转换,然后直接执行。实现JIT编译器的系统通常会不断地分析正在执行的代码,并确定代码的某些部分,在这些部分中,编译或重新编译所获得的加速将超过编译该代码的开销。
简单来说就是在其它编程语言中动态生成并编译执行汇编语言。
GNU/Lightning
我们将使用由GNU提供的工具Lightning实现及时编译,关于Lightning的简介如下:
GNU Lightning是一个在运行时生成汇编语言代码的库;它非常快,非常适合即时 编译器,并且它在目标 CPU 上进行抽象,因为它向客户端公开了受 MIPS 和 SPARC 芯片启发的标准化 RISC 指令集。
GNU Lightning可用于复杂的代码生成任务。可用的后端涵盖 aarch64、alpha、arm、hppa、ia64、mips、powerpc、risc-v、s390、sparc 和 x86 架构。
安装Lightning
首先需要下载Lightning,可以去到官方提供的地址http://ftp.gnu.org/gnu/lightning/,下载最新或较新的版本。
下载之后进行解压,然后进入解压后的目录「例如: ~/Workspace/lightning-2.1.3」:
cd ~/Workspace/lightning-2.1.3
根据官方文档的安装说明https://www.gnu……#Installation,执行如下命令进行编译:
# 1.
./configure
# 2.
make check
# 3.
make install # 可能需要使用sudo获取权限
安装之后,我们可以运行命令sudo ldconfig
刷新一下连接库。
编译测试官方示例
我们使用官方示例「incr」来测试一下lightning是否成功安装。
打开编辑器,然后键入如下代码:
#include <stdio.h>
#include <lightning.h>
static jit_state_t *_jit;
typedef int (*pifi)(int); /* Pointer to Int Function of Int */
int main(int argc, char *argv[])
{
jit_node_t *in;
pifi incr;
init_jit(argv[0]);
_jit = jit_new_state();
jit_prolog(); /* prolog */
in = jit_arg(); /* in = arg */
jit_getarg(JIT_R0, in); /* getarg R0 */
jit_addi(JIT_R0, JIT_R0, 1); /* addi R0, R0, 1 */
jit_retr(JIT_R0); /* retr R0 */
incr = jit_emit();
jit_clear_state();
/* call the generated code, passing 5 as an argument */
printf("%d + 1 = %d\n", 5, incr(5));
jit_destroy_state();
finish_jit();
return 0;
}
保存代码并进行编译与执行:
gcc test.c -llightning
./a.out
如果编译成功则执行后输出如下内容:
该程序会在执行过程中动态编译一个「数值增一」的子汇编程序并在之后进行调用。关于上述代码的说明与讲解会写在下一篇文章中,感兴趣的朋友们,敬请期待!