【0923】更新在线编译
地址:bajdcc/clibalgserver
目前先VS编译用着,等功能完善了再跨平台。
就是这么酸爽!
----------------------------------
最近看到algorithm-visualizer这个网站,惊到我了,本来就有一个这样的想法,没想到有人已经先做了并且做的这么好。该网站支持编译java、c++、js语言,其中js是本地编译。
想到需要教授c++语言,因此拿js语言去示范是不合适的,而束于自己的渣水平,写个编译c++的编译器工作量太大,而最近才搞定c语言的编译、虚拟机阶段,可以拿来试手,讲算法么用c语言就足够了。
可行性分析
bajdcc/GameFramework本身实现的c语言文法采用LR分析,支持:
- 四则运算,自增,函数,struct(链表和红黑树已ok),union,enum
- switch等控制流
- 指针,解引用,强制转换
- 基本数据类型全覆盖(i8,i16,i32=int,i64=long,float,double)
- 数组
- 函数内static声明
- 参数从右向左压栈,不定参数
- 字符串转义支持,数字转义支持
- 宏:__line__等
- include
- debug相关:AST信息,报错位置,打印堆栈等
目前的bug是解析struct时导致回溯呈指数增长(因为要支持文法二义,出此下策)。
尚不支持宏功能(主要在第一遍扫描阶段,需要初次解析token,懒了)。
目前的语法可以覆盖大部分算法。
在线/离线编译的实现
如果在离线编译,那就可以做一个exe,输入为c语言文件,输出为html,里面是动画代码。
在线编译,需要代码上嵌入一个服务器(ORZ c++服务器真难找),提供个接口就ok。
algorithm-visualizer好是好,但是代码是服务端渲染,不喜欢,因此拿点框架重写个(最近接触了pixi像这种就好了)。
大体是c++当服务器实现编译接口,返回运行片段。
是否需要用js实现虚拟机
这个难度有点高,像是那种jslinux就算了,另外一种思路:代码的执行可以利用服务器渲染好。
如果有一份c代码,那么c++虚拟机跑一趟,可以直接返回跑回的结果,这就跟http://ideone.com是一样的。也可以一步步调试,但这样的话,1)可以在返回的json中包括每个虚拟指令,但这样的话js要做解释器;2)返回系统状态的增量(内存,文件系统,寄存器,进程状态等),这种难度相对较低,但返回的数据量也多(不过应该可以压缩)。
algorithm-visualizer的做法是代码中明确哪些东西需要tracer掉,那么只要在编译器中寻找tracer就可以了。
因此,方案为解析显式tracer,并生成ir,在虚拟机中记录下来。
网页中visualizer的实现
题图中用的是react,没有canvas,那既然选择的js是原生的(不然就是两个项目了),就用用bajdcc/cliblan中使用的pixi来渲染(分webgl和canvas)。
选用平台
c++语言的跨平台就用Qt吧,目前的虚拟机限制只能使用32位编译,看看后面能否用64位。由于要做接口,因此要去除单例模式保证安全。
API设计为:读取c文件,返回tracer步骤json,整个网站由c++ http server实现。