Jit FFi for android

51 阅读4分钟

最近在写编程语言刚好用android平台来练练手写一个Jit FFi

编程语言实践链接

github.com/zjw-swun/Zl…

目前只是个最基本雏形,尚未完成语法设计以及编译自举

再一次感受到了上学时候编译原理的鞭笞,hhh

编译原理课程参考资料 time.geekbang.org/column/intr…

简单介绍一下JIT和FFI

JITFFI 是两种在计算机编程中常见的技术,它们在处理不同的任务时有不同的作用。让我们先分别理解它们的含义,然后再讨论它们可能结合使用的场景。

JIT(Just-In-Time Compilation)

JIT(即时编译)是一种程序优化技术,它通常用于将高层语言(如 Java、JavaScript 或其他中间语言)在运行时转换为机器代码,从而提升程序的执行效率。

工作原理:

  1. 源代码或字节码:程序首先被编译为一种中间代码,例如 Java 的字节码或 .NET 的中间语言。

  2. 运行时编译:当程序运行时,JIT 编译器会实时将中间代码编译为机器码(即平台特定的二进制代码)。

  3. 执行优化:JIT 编译器可以根据运行时的环境信息来优化代码,比如热点代码(被频繁调用的代码)可以进行特殊优化,以提高执行效率。

优点:

  • 动态优化:JIT 编译器可以根据程序运行的实际情况来进行优化,使得程序在运行时能够适应当前环境。

  • 启动速度:程序启动时不需要完全编译,减少了启动延迟。

  • 性能提升:对于长时间运行的程序,JIT 可以通过热代码优化大大提高性能。

缺点:

  • 内存消耗:JIT 编译需要额外的内存来存储编译后的机器代码。

  • 启动延迟:首次执行时,JIT 编译会增加一些延迟,因为需要将字节码或中间代码编译成机器码。

FFI(Foreign Function Interface)

FFI(外部函数接口)是一种允许程序调用其他编程语言编写的库或函数的机制。它提供了一种标准化的方法来调用外部(通常是用 C 或 C++ 编写的)库函数。

工作原理:

  • 跨语言调用:FFI 允许一个语言(如 Python、Java、Rust 等)调用另一个语言编写的原生代码(例如 C/C++ 的库)。这使得程序可以利用其他语言的高效实现,或者调用操作系统提供的底层功能。

  • 数据转换:由于不同语言的数据表示方式可能不同,FFI 负责处理跨语言调用时的数据格式转换。比如从 Java 调用 C 函数时,FFI 会将 Java 数据转换为 C 函数能够理解的数据类型。

常见使用场景:

  • 调用 C/C++ 库:例如在 Python 中使用 ctypes 或 Cython,在 Java 中使用 JNI(Java Native Interface)。

  • 性能优化:某些功能可能会用更底层的语言(如 C/C++)实现,以提高性能,然后通过 FFI 被其他语言调用。

  • 使用操作系统特性:调用操作系统的系统 API,通常是 C 语言编写的底层函数。

JIT 和 FFI 结合

JIT 和 FFI 这两种技术通常是独立的,但它们也可能结合使用,特别是在某些高性能的应用程序中。例如:

  1. JIT + 外部库调用:JIT 编译器可以优化调用外部库(通过 FFI 机制访问)时的代码。这对于性能非常关键的应用程序非常有用。例如,在 Python 中,你可能使用 FFI 调用 C 库来处理计算密集型任务,JIT 编译器可能会优化这部分代码,提高运行时性能。
  2. JIT 编译和跨语言优化:一些语言(如 Julia、R、JavaScript 等)支持 JIT 编译和动态加载外部 C 函数,它们通过 FFI 来访问高效的 C/C++ 函数,而 JIT 编译器可以进一步优化这些调用的执行。

效果图

image.png

我这里就是实现了一个远程ffi代码在android中动态编译运行

这就是Jit FFi for android上的落地实践了,美滋滋!