搜索
bottom↓
回复: 18

从c4的字节码改编的虚拟机,占用资源超小,单片机可用

  [复制链接]
(42860801)

出0入8汤圆

发表于 2019-10-19 09:47:05 | 显示全部楼层 |阅读模式
首先是参考的原始码,4个函数实现的C编译器,大约500行。真心牛X,对于单片机资源超级吃紧的占用稍微大了点,所以从它生成的字节码中抠出来做成了虚拟机。
c4的源码地址:https://github.com/rswier/c4

然后就发现它的所有字节码都是4字节的,太浪费了,于是搞成1字节的。跳转、全局变量、字符串等等都与代码地址直接绑定,这就不好玩了,于是各种砍,最终我的虚拟机就不支持字符串了-_-|| 全局变量单独处理了。
因为不懂编译原理,原来不爽的地方还是那么不爽,不会改...
优化:同样因为不懂编译原理只是把数值计算给优化了,1 + 2 * 3 << 1 会被直接编译成14而不是傻呵呵的每一步都运算,但为了减小虚拟机ROM占用其他的并没有优化

资源占用:
ROM:虚拟机应该占用2KB左右,M3上可能更小些,51上会大些
RAM:全部静态分配,由用户自己设定几十字节也可以。分成全局变量区和堆栈区两部分,其他的变量总共占用5 * sizeof(int)字节
效率:效率真不敢恭维。我稍微测试了下,比Lua 2.4稍快点,Lua 5.1的70%左右,和C相比那就是5%,捂脸。

压缩包里有虚拟机的源代码,cc.exe是编译器,cc 文件名.cc执行源代码,cc -s 文件名.cc显示反汇编,cc -b 文件名.cc会生成文件名.bin可以由MCU调用。
做了两个例子:test.cc和fib.cc。test.cc是一些基本的语法,语法限制好厉害,要去查看c4的,我不会改。fib.cc是斐波那契数列递归调用,用户可能需要调整栈大小

本帖子中包含更多资源

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

x
(42855809)

出0入0汤圆

发表于 2019-10-19 11:10:17 | 显示全部楼层
利害哇,现在是不是写个C脚本,扔到单片机上就可以跑了哇
(42855623)

出0入0汤圆

发表于 2019-10-19 11:13:23 | 显示全部楼层
foxpro2005 发表于 2019-10-19 11:10
利害哇,现在是不是写个C脚本,扔到单片机上就可以跑了哇

应该是, 但是估计在语法上还有诸多限制。
(42855427)

出0入0汤圆

发表于 2019-10-19 11:16:39 来自手机 | 显示全部楼层
不知道用c写的语法有哪些限制呢?
(42854873)

出0入8汤圆

 楼主| 发表于 2019-10-19 11:25:53 | 显示全部楼层
原本的C4可以直接解析C脚本,我抠出来的虚拟机不可以,必须先编译,这样占用ROM才能小。C4会占用10多kB ROM接近20kB了,我这个才2kB。

语法比标准的C少了好多好多,就是C的一个极小的子集。
数据类型只支持int、char、int*、char*
无法在声明时初始化,无法使用复合运算符,必须分开。
流程控制只支持if、else、while、? ... :,其他的关键字通通不支持。不过这些足够用了,只是写起来不爽
各种算术、逻辑、位、比较运算符这些支持全了。
调用host端我只安排了一个int api(int argc, int* argv)函数,通过这个函数两边可以随意调用。

效率相对lua来说并不那么低是因为它是静态类型的而且事实上只进行了int运算,比较起来不公平。
(42846118)

出0入0汤圆

发表于 2019-10-19 13:51:48 | 显示全部楼层
五百行代码结果能占用10k以上空间吗
(42842997)

出0入0汤圆

发表于 2019-10-19 14:43:49 | 显示全部楼层
本帖最后由 shiva_shiva 于 2019-10-19 15:03 编辑

下了个c4示例代码执行一直不成功。。。。

发现在需要屏蔽:#define int long long
(42842718)

出0入0汤圆

发表于 2019-10-19 14:48:28 | 显示全部楼层
takashiki 发表于 2019-10-19 11:25
原本的C4可以直接解析C脚本,我抠出来的虚拟机不可以,必须先编译,这样占用ROM才能小。C4会占用10多kB ROM ...

宏定义能用不?   其实能把clang 移植一下 最爽了  哈哈。
(42842028)

出0入0汤圆

发表于 2019-10-19 14:59:58 | 显示全部楼层
这个牛逼,听讲
(42840051)

出0入8汤圆

 楼主| 发表于 2019-10-19 15:32:55 | 显示全部楼层
浮华一生 发表于 2019-10-19 14:48
宏定义能用不?   其实能把clang 移植一下 最爽了  哈哈。

不支持宏定义及各种编译指令,连#include都不支持。支持枚举,数值就用枚举代替吧,其他的就得自己展开了。反正只是个脚本虚拟机,也不用写啥大程序
clang用的llvm指令集指令太多了,我太懒了
(42839867)

出0入8汤圆

 楼主| 发表于 2019-10-19 15:35:59 | 显示全部楼层
shiva_shiva 发表于 2019-10-19 14:43
下了个c4示例代码执行一直不成功。。。。

发现在需要屏蔽:#define int long long ...

是的,他的代码默认64位,有点变态,32位下能编译不能运行,要屏蔽这行
(42834778)

出0入0汤圆

发表于 2019-10-19 17:00:48 | 显示全部楼层
不是有tyinc吗?
(42828270)

出0入0汤圆

发表于 2019-10-19 18:49:16 来自手机 | 显示全部楼层
虚拟机适合用来加密核心程序
(34003391)

出0入0汤圆

发表于 2020-1-29 22:10:35 | 显示全部楼层
楼主, cc.exe 源码也能发出来大家参考一下.
(33953180)

出0入0汤圆

发表于 2020-1-30 12:07:26 | 显示全部楼层
真厉害呀
(33944059)

出0入0汤圆

发表于 2020-1-30 14:39:27 | 显示全部楼层
NB,很精简了
(33179447)

出0入0汤圆

发表于 2020-2-8 11:02:59 | 显示全部楼层
谢谢分享
(7857292)

出0入0汤圆

发表于 2020-11-27 12:58:54 | 显示全部楼层
虚拟机是不是可以防止反汇编,但是无法防读片复制这种终极破解
(4311308)

出0入0汤圆

发表于 2021-1-7 13:58:38 | 显示全部楼层
运行效率与标准c生成bin  差距多大?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2021-2-26 11:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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