c语言代码先来先服务算法_【算法可视化计划】启程

【0923】更新在线编译

地址:bajdcc/clibalgserver

目前先VS编译用着,等功能完善了再跨平台。

就是这么酸爽!

2df9bf4f5b1802c854e7bad354ea385c.png
https://www.zhihu.com/video/1159511596609994752

----------------------------------

最近看到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实现。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值