收藏本站
繁體浏览
切换到宽版
请
登录
后使用快捷导航
没有帐号?
新人加入
帐号
自动登录
找回密码
密码
登录
新人加入
快捷导航
TCAX
程序
特效
手册
TCAX 用户手册 (关键帖子汇总)
其他
历史
招募
入门
提问
报道
介绍
下载
教程
FAQ
作品展示
内置特效
特效代码
在线预览
博客
源代碼
RH字幕组
搜索
搜索
热搜:
TCAX
教程
TCAS
ASS
特效
本版
帖子
用户
TCAX 字幕特效制作工具官方论坛 | ASS | TCAS | Python | Aegisub | Lua
›
TCAX
›
TCAX 使用交流 & 作品展示
›
自由讨论
›
浅入浅出LuaJIT
返回列表
查看:
3326
|
回复:
0
[其他]
浅入浅出LuaJIT
[复制链接]
Seekladoom
Seekladoom
当前离线
UID
2546
积分
159
帖子
30
主题
5
论坛币
868
威望
0
EP值
134
MP值
0
阅读权限
50
注册时间
2015-5-9
在线时间
52 小时
最后登录
2024-10-20
正式会员
电梯直达
楼主
发表于 2022-3-26 22:45:53
|
只看该作者
|
正序浏览
本帖最后由 Seekladoom 于 2022-3-26 23:04 编辑
来源链接:
https://blog.csdn.net/ecidevilin/article/details/78630176
JIT
什么是JIT
JIT = Just In Time即时编译,是动态编译的一种形式,是一种优化虚拟机运行的技术。
程序运行通常有两种方式,一种是静态编译,一种是动态解释,即时编译混合了这二者。Java和.Net/mono中都使用了这种技术。
然而IOS中禁止使用(不是针对JIT,而是所有的动态编译都不支持)!
为什么要使用JIT
解释执行:
1.效率低。
2.代码暴露。
静态编译:
1.不够灵活,无法热更新。
2.平台兼容性差。
JIT:
1.效率:高于解释执行,低于静态编译。
2.安全性:一般都会先转换成字节码。
3.热更新:无论源码还是字节码本质上都是资源文件。
4.兼容性:虚拟机会处理平台差异,对用户透明。
JIT是如何实现的
这里讲的实际上是JIT的一个变种:自适应动态编译(adaptive dynamic compilation)。它分为两种:Method JIT和Trace JIT。
如图所示,这是jvmjit的流程:
2022-3-26 22:58:14 上传
下载附件
(50.22 KB)
简单来讲:
1.跟踪热点函数或trace,编译成机器码执行,并缓存起来供以后使用。
2.非热点函数解释执行。
为什么只编译热点函数?
对只执行一次的代码而言,解释执行其实总是比JIT编译执行要快。对这些代码做JIT编译再执行,可以说是得不偿失。而对只执行少量次数的代码,JIT编译带来的执行速度的提升也未必能抵消掉最初编译带来的开销。只有对频繁执行的代码,JIT编译才能保证有正面的收益。
LuaJIT
vs. Lua
Lua主要由以下三部分组成:
1.语法实现。
2.库函数。
3.字节码。
LuaJIT主要由以下四部分组成:
1.语法实现。
2.Trace JIT编译器。
3.库函数。
(1)原生库++(强化过的原生库)
(2)
bit
(3)
ffi
(4)
jit
4.字节码。
注:最新luajit对应lua5.1.5。
trace jit编译器
2022-3-26 22:58:44 上传
下载附件
(51.81 KB)
与jvmjit大致相同。
所谓trace便是一段线性的字节码序列。热点trace被编译成机器码,非热点trace解释执行。
注:并不是所有的代码都能被JIT。(NYI)
bytecode
bytecode基本上可以认为是虚拟机的指令码(“基本上”是因为luajit使用了uleb128)。
优点:
1.减少文件大小。
2.生成函数原型更快。
3.增加被破解的难度。
4.对源代码轻微的优化。
库函数和可执行文件
编译步骤分三步走:
2022-3-26 22:59:05 上传
下载附件
(9.6 KB)
1.minilua:实际上是lua原生代码的一个子集,用来执行lua脚本并生成平台相关的指令。
2.buildvm:用来生成操作码/库函数到汇编/C语言的映射,用来jit编译。
3.lib
4.exec:可以执行lua代码活转换字节码。
编码
命令行执行
luajit –b <in> <out>。
复制代码
虚拟机会判断是否是字节码,所以无需做额外的操作。
另外,可以混用,即:一部分文件编成字节码,另一部分保持源代码。
iOS64位报错问题
Cannot load incompatible bytecode!
这个错是因为在luajit里使用gcr用来比较对象指针,在64位环境下只有47位有效值(默认用户内存不会超过128T)。其余17位中有4位保存对象类型,即一段内存中保存了两条信息。所以在函数栈操作中有些地方需要一个空值占位。因为字节码直接反映了函数栈操作,所以64位和32位字节码不同。
参考文献
https://www.zhihu.com/question/37389356
https://zhuanlan.zhihu.com/hllvm/19977592
http://wiki.luajit.org
用好Lua+Unity,让性能飞起来——Lua与C#交互篇
在windows程序中嵌入Lua脚本引擎–使用VS IDE编译Luajit脚本引擎
Luajit-2.1.0-beta1的发布和生成arm64用bytecode的解脱
Peeking inside LuaJIT
收藏
0
举报
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
新人加入
发表回复
GitHub
|
TCAX 主页
GMT+8, 2024-11-22 14:05
Powered by
Discuz!
X2
© 2001-2011
Comsenz Inc.
积分 0, 距离下一级还需 积分
回顶部
RealH