设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2586|回复: 2

[原创发布] 抽象语法树提取/加载

[复制链接]

Lv4.逐梦者

梦石
0
星屑
13559
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

发表于 2021-1-9 01:30:33 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 SixRC 于 2021-1-9 03:53 编辑

虽然本来确实不想写了
但还是来了

简介:
   ruby1.8执行代码的方式是分析代码->生成语法树->执行语法树 (1.9之后也会构建语法树 但是在执行前会生成字节码 目测这样)
这个脚本可以预先提取语法树 然后加载执行 即省去了代码处理的过程  即消去了明文代码
   代码依旧可以通过语法树进行还原 只要有耐心
当然 加上混淆会更好 不过暂时不想写了 手动混淆吧

正文:

仅适用于RGSS103J
ast.zip (254.2 KB, 下载次数: 12, 售价: 1 星屑)

评分

参与人数 1星屑 +100 收起 理由
RyanBern + 100 精品文章

查看全部评分

Lv4.逐梦者

梦石
0
星屑
5060
在线时间
705 小时
注册时间
2018-12-11
帖子
241
发表于 2021-1-9 10:26:25 | 显示全部楼层
本帖最后由 lisliz 于 2021-1-9 10:38 编辑

js里也有类似的技术,V8的snapshot。

看来像js和ruby的常规模式都是这样【分析代码->生成语法树->字节码->执行】

但js的V8引擎还会在运行时尝试把热点代码编译成【特定于CPU架构的本地代码(机器码)】,让代码跑得更快。
此外js里还有还有AOT模式,就是代码一加载就预先编译成特定于CPU架构的本地代码(机器码)的模式。

即为【分析代码->机器码->执行】,因为V8引擎有这种强大的特点,我个人倒是觉得js的运行效率比ruby更快。


例如下面一段代码在js里就是AOT模式。

JAVASCRIPT 代码复制
  1. function PhysicsASM(stdlib, foreign, heap) {
  2.         "use asm";
  3.         var HEAP = new stdlib.Float64Array(heap);
  4.         function vectorProduct(x1, y1, x2, y2) {
  5.                 x1 = +x1; y1 = +y1; x2 = +x2; y2 = +y2;
  6.                 return +(+(x1 * y2) - +(x2 * y1));
  7.         }
  8.         return {
  9.                 vectorProduct:vectorProduct
  10.         }
  11. }


运行游戏,打印这个函数,你会发现函数体已经变成了[ native code ],已经被AOT模式编译成机器码。
QQ截图20200909202240.png

点评

ruby2.6后也有热点代码jit了 3.0后有重大改变 虽然效率和js还不能比  发表于 2021-1-9 12:38

评分

参与人数 2星屑 +50 +1 收起 理由
RyanBern + 50 赞认真讨论
SixRC + 1 塞糖

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-3-29 12:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表