发现了一个好东西,asmjit
如题,asnjit 是一个基于 C++ 的 JIT 库,可以在程序运行时实时编译出机器码。只需调用 asmjit 的接口,告诉 asmjit 需要编译的程序的框架结构和执行细节,就可以当场编译出可执行的机器码。
这是一个开源项目,github 上可以直接搜到。
以下是我基于 asmjit 和 C++ 写的一个支持数学函数定义的计算器。它的函数处理部分就用到了 asmjit。函数处理的大概流程是这样的:
1. 基于 flex 的词法分析
2. 基于 bison 的语法分析
3. IRGenerator 类生成 IR 中间表示代码
4. IRTranslator 类翻译 IR 代码为 asmjit 调用
5. asmjit 编译出机器码和对应的函数指针
6. IRExecution 类执行函数
运行截图:
(以 @ 开头的是指令语句,图中 @enumeration-functions 是打印所有已定义的函数的指令,func[$x] 是函数定义,表示以 x 为自变量定义函数 func)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=6493f2758c504fc2a25fb00dd5dce7f0/e514367adab44aed65cec099a41c8701a08bfbd3.jpg?tbpicau=2025-03-01-05_5c6ea06c6d481f94b2cebb5106e8c12d)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=3862c6fcdc1349547e1ee86c664f92dd/342011dfa9ec8a13059a299de003918fa1ecc0d3.jpg?tbpicau=2025-03-01-05_88a4892be235d80a9ab965ad93a043d1)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=fb36ed53bfd3fd1f3609a232004f25ce/43a8462309f79052e19f39431bf3d7ca7acbd5d3.jpg?tbpicau=2025-03-01-05_dabe991ac15c9858632848be25012cb6)
如题,asnjit 是一个基于 C++ 的 JIT 库,可以在程序运行时实时编译出机器码。只需调用 asmjit 的接口,告诉 asmjit 需要编译的程序的框架结构和执行细节,就可以当场编译出可执行的机器码。
这是一个开源项目,github 上可以直接搜到。
以下是我基于 asmjit 和 C++ 写的一个支持数学函数定义的计算器。它的函数处理部分就用到了 asmjit。函数处理的大概流程是这样的:
1. 基于 flex 的词法分析
2. 基于 bison 的语法分析
3. IRGenerator 类生成 IR 中间表示代码
4. IRTranslator 类翻译 IR 代码为 asmjit 调用
5. asmjit 编译出机器码和对应的函数指针
6. IRExecution 类执行函数
运行截图:
(以 @ 开头的是指令语句,图中 @enumeration-functions 是打印所有已定义的函数的指令,func[$x] 是函数定义,表示以 x 为自变量定义函数 func)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=6493f2758c504fc2a25fb00dd5dce7f0/e514367adab44aed65cec099a41c8701a08bfbd3.jpg?tbpicau=2025-03-01-05_5c6ea06c6d481f94b2cebb5106e8c12d)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=3862c6fcdc1349547e1ee86c664f92dd/342011dfa9ec8a13059a299de003918fa1ecc0d3.jpg?tbpicau=2025-03-01-05_88a4892be235d80a9ab965ad93a043d1)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=fb36ed53bfd3fd1f3609a232004f25ce/43a8462309f79052e19f39431bf3d7ca7acbd5d3.jpg?tbpicau=2025-03-01-05_dabe991ac15c9858632848be25012cb6)