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

Project1

 找回密码
 注册会员
搜索
查看: 243|回复: 15

[随意闲聊] 项目暂时结束 Ruby转C

[复制链接]

[动态]受到戏蹑群星斗的挑战,成功击败了对方。 (打开TA的战斗卡片)

Lv4.逐梦者

梦石
0
星屑
5772
在线时间
1699 小时
注册时间
2014-10-4
帖子
518
发表于 2019-3-29 17:31:39 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 SixRC 于 2019-3-29 17:33 编辑

不知不觉又过了一年啦
一年前 我发了篇 某搞笑而高效的优化方法..Ruby翻·译
那时候我基本能把一段 Ruby 代码人工写成对应的 C 代码 效果挺好的 但是效率挺差的
要翻译一段代码 挺花时间的 主要是烦 就和流水线一样 让人疯魔
所以那时我就想 能不能自动转换啊 就没那么烦人了
不过那时候没实践 没想太多 (主要可能是懒)
哦不对主要还是在想 这玩意怎么写 得很难吧
得自动读取函数逻辑 我啥也不懂 有毒
得 先算了 就这样搁着了

然后上礼拜想起来这个问题
也不知道当时怎么想的 就开始搞了
于是先开始看 Ruby 源码 想看它怎么实现的
看啊查啊的就知道了词法分析和语法分析
于是抛开源码 开始查 啥是词法分析啥是语法分析
然后开始看书 开始学
搞懂了基本概念 然后回过来想到 ruby 用了 bison
然后 哦 这什么玩意 嗯 语法分析工具 怎么用 哦 这样
然后继续开始搞 有问题查 看文档  想想想
每天就是 除了吃饭睡觉打坛游上课 几乎就想着这玩意了 像是
今天收获不错 写了if 完成了 and or 的短路处理 不过那个规则还能这样那样改
我靠要去上课了 这个bug还没修
什么 我没吃饭吗 我说我怎么感觉这么饿
这歌好听 听着歌好像效率高了
...等等等
我也不记得最开始从哪个部分开始的了
不过自从慢慢搞懂大致逻辑后 基本就是靠之前的东西写语法规则和相应的c语句逻辑
前天可能是写完了读取函数名称 这个最不核心的东西
然后想着把 RMXP 的原生脚本都处理一遍
然后 呃 我又觉得烦了 就没进行了
因为我写了针对逻辑语句的处理 但没写for 还有块的处理
因为这个 1.8.1 的版本就没支持从c传入块 反正我没翻到 逻辑和我想的不太一样 就得先手动处理一下再自动处理再手动修正一下
循环我是加了goto去实现的 总之得自己先处理一下
再总之就是 得先浏览一下ruby代码 看看有没什么语法分析不能解析的 改改 再丢过去
怎么说呢 学习和探索 思索的过程是有趣的 而机械劳动就很无聊了
处理到了 Game_Battler 2 就没继续处理下去了 因为也没啥意义
哎哎 虽然写了自动处理的工具 效率比一年前高了百倍 还是因为懒而屈服了
所以 暂时结束项目 状态成功 虽然不完美 日后慢慢整吧

收获 应该还是蛮多的
原来语法分析还是挺好实现的 毕竟 lex 和 yacc 就放在那 又不要求把算法自己实现一遍
实现了自己搁了一年的想法
遇到想做的事情了 得有一种去干架的气势吧
真的想着要把它做好 不死不休 大概会比较有杀气 专杀遇到的问题
不管什么事情 不做总归不会成功 试试再说吧
我以前一直真的 没法理解语法分析这个东西 然后其实 还好吧 谢谢 yacc
果然技术与知识改变生活啊
K

[动态]受到戏蹑群星斗的挑战,被揍得晕头转向。 (打开TA的战斗卡片)

Lv4.逐梦者 (管理员)

老黄鸡

梦石
0
星屑
12833
在线时间
6243 小时
注册时间
2009-7-6
帖子
12798

开拓者贵宾

发表于 2019-3-29 18:24:51 | 显示全部楼层
翻译的话可能难度就太大了,一般就是拿到地址直接用
常用的函数其实也不多,funcall和define的几个都拿到就差不多了

在C里面写代码块好像也没什么问题?(我没实验过
RETURN_ENUMERATOR和rb_yeild ,xx我都忘了(死
RGDirect - DirectX驱动的RGSS,点我了解.
长期合作请联系QQ1213237796(暂停)
定制RM全系列脚本,黑科技,请联系QQ349570812(暂停)。
不接受私人问题咨询
回复 支持 反对

使用道具 举报

[动态]受到戏蹑群星斗的挑战,成功击败了对方。 (打开TA的战斗卡片)

Lv4.逐梦者

梦石
0
星屑
5772
在线时间
1699 小时
注册时间
2014-10-4
帖子
518
 楼主| 发表于 2019-3-29 19:33:33 | 显示全部楼层
fux2 发表于 2019-3-29 18:24
翻译的话可能难度就太大了,一般就是拿到地址直接用
常用的函数其实也不多,funcall和define的几 ...

嗯 写块是没问题的 就是好像不能传递块
funcall 传递的参数是函数的参数 块是另一个机制
我也不太懂 应该是块不是直接参数 而是一个环境要素
ruby解释器执行的时候会把块加入环境中
然后 block_given? 据此告知有没有块
yield 就执行那个块
我不知道怎么在c里直接把块加入这个环境中
就用了替代做法
新建一个方法作为块 然后eval xxx.xxx(a,b,&(method(:block)))
也不错
先不研究了 啥都没坛游有意思 赶紧打架
K
回复 支持 反对

使用道具 举报

[动态]受到一只老牛王的挑战,被揍得晕头转向。 (打开TA的战斗卡片)

Lv4.逐梦者 (版主)

梦石
0
星屑
11871
在线时间
1425 小时
注册时间
2011-7-8
帖子
2232

开拓者

发表于 2019-3-29 21:42:36 | 显示全部楼层
印象中ruby2.6好像添加了语法树的功能?

点评

玩坛游gkd  发表于 2019-3-29 23:12
知道了!是这个 RubyVM::InstructionSequence 2.6有了 RubyVM::AST 然后看了说明啥也没看懂 好了 现在真不看了  发表于 2019-3-29 23:07
奥 抽象语法树好像确实是2.6新有的 我也不记得我记得的2.5有的是啥了..不管了  发表于 2019-3-29 22:55
说到这个 我当初确实是想 能不能把2.6版本生成的c代码套用到别的地方 然后发现不行...一大堆内部函数和定义 直接放弃 果然还是自己动手 丰衣足食  发表于 2019-3-29 22:53
最后做出了手动jit  发表于 2019-3-29 22:46
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
163
在线时间
249 小时
注册时间
2014-7-18
帖子
44
发表于 2019-4-8 03:00:27 | 显示全部楼层
N久没翻坛子了,顶着坟回,安慰一下搞编译的……
Emmm,似乎真的一年了呢……
脑壳疼是搞编译的日常,毕竟过于硬核,真玩这个的太少了。
讲真,非ProofOfConcept的编译器都很脑壳疼……
不过,词法分析也好,语法分析也罢,这些【frontend偷起懒来,也就一个下推自动机】和那个只有两个栈的“表达式求值器”没啥本质区别。(CompilerCompiler其实是很笨重的,不过那就是另一回事了……直观感受就是TCC好有道理。
Ruby好用不只在于它的语法【其实CC严重地拖累Ruby表达力的后腿了】,灵活的Block闭包上下文传递才是最好用,也是脑壳疼的地方。
闭包怎么传,这个问题就很玄学了。GC问题就更玄学了,以后再说了……
啥都不管,Force模拟,就是经典解释器模型。
跑VM,把CPU架起来,就是大多数工业编程语言的模型。
真要带着lambda玩就必然涉及JIT,不过JIT最适合跑在RAM上,跟Cache天生不合,而现代计算机全靠cache就很那啥了说。
> 理论上,完备的JustInTimeOptimisiveCompiler是不存在的。
上边那句话的意思和哥德尔不完备定理差不多……
IR怎么弄其实全靠对控制流和数据流的理解。
AST只是传统工业流水模型下的一种解决方案,就是:什么理解都没有。
LISP的话,咱不是很懂……不了解……
摸着石头过河吧……

点评

我没做编译.. 所以我也没怎么看懂..我也不知道说啥  发表于 2019-4-9 23:47
Role Play Games had saved me, but I can never save them.
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv2.观梦者

梦石
0
星屑
876
在线时间
1380 小时
注册时间
2010-8-9
帖子
3470
发表于 2019-4-8 09:08:38 | 显示全部楼层
本帖最后由 寒冷魔王 于 2019-4-8 09:15 编辑

编译到 C 的话,因为是机器翻译,闭包学习一下 C++11 的实现,可以搞成 functor ,也支持 mutable capture 。(这种只适合静态编译)
不知道你要翻译成哪种形式,其实要是直接翻译成中间码的话,还算好实现的。

C 也可以通过 jit 实现闭包,动态生成函数,这样可以在 eval 的模式下使用。

Ruby 转 C ,如果不对翻译以前的代码进行约束的话,翻译后的 C 必然带一个小型的 runtime (或者你可能直接用 ruby.h 来做),其实性能上可能还不如原生 cruby 。

点评

我不知道你的理解 我就是转成了原生cruby 我感觉 你们都想复杂了..我啥也不懂  发表于 2019-4-9 23:58
SRPG on RM 项目研发组 正式成立。目前SRPG·RMVA系统进度88.8%。SMRC Kernel 进度90%
↖(^ω^)↗热烈庆祝~SMRC Ver5.1 SRPG战棋地图移动范围生成脚本正式发布~~
-----------------------------------------------------------------------------------------
SMRC具有高性能、高兼容、定制自由、使用方便的特点。
1.性能,100移动力轻松算出,无压力;
2.兼容,RGSS1-3通吃,效率保证;
3.支持移动形状定制,支持4方位、6方位、正方形或其他任意有移动规律的形状;
4.可以充当高性能寻路来使用。
【链接点此】
-----------------------------------------------------------------------------------------
【2016/01/06更新 | 改版】RM脚本编辑器Gemini
-----------------------------------------------------------------------------------------
回复 支持 反对

使用道具 举报

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

本版积分规则

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

站长信箱:fux2@moe9th.com|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2019-6-21 01:17

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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