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

2019-12-11 18:15发布

首先是参考的原始码,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是斐波那契数列递归调用,用户可能需要调整栈大小

基于C4改造的虚拟机.zip (10.77 KB, 下载次数: 38) 2019-10-19 09:44 上传 点击文件名下载附件
基于C4改造的虚拟机
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
浮华一生
1楼-- · 2019-12-12 15:45
 精彩回答 2  元偷偷看……
Pupil
2楼-- · 2019-12-12 18:18
这个牛逼,听讲
takashiki
3楼-- · 2019-12-12 21:41
浮华一生 发表于 2019-10-19 14:48
宏定义能用不?   其实能把clang 移植一下 最爽了  哈哈。

不支持宏定义及各种编译指令,连#include都不支持。支持枚举,数值就用枚举代替吧,其他的就得自己展开了。反正只是个脚本虚拟机,也不用写啥大程序
clang用的llvm指令集指令太多了,我太懒了
takashiki
4楼-- · 2019-12-13 00:38
shiva_shiva 发表于 2019-10-19 14:43
下了个c4示例代码执行一直不成功。。。。

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

是的,他的代码默认64位,有点变态,32位下能编译不能运行,要屏蔽这行
fakeCode
5楼-- · 2019-12-13 00:56
不是有tyinc吗?
nanfang2000
6楼-- · 2019-12-13 02:04
 精彩回答 2  元偷偷看……

一周热门 更多>