published on in 编译

JIT・GNU/Lightning

在之前的文章中我们了解了一点基础的汇编语法以及与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

如果编译成功则执行后输出如下内容:

5 + 1 = 6

该程序会在执行过程中动态编译一个「数值增一」的子汇编程序并在之后进行调用。关于上述代码的说明与讲解会写在下一篇文章中,感兴趣的朋友们,敬请期待!