MicroC

功能介绍

在MicroC的基础上进行部分扩展。由于续算只实现了Expr部分和for循环,所以只展示无续算版本Comp.fs

功能 示例 对应文件
变量赋值声明 int i = 0; test_init.c
前置与后置自增、自减 ++i; --i; i++; i–; test_selfplus.c
for循环 for(i=0; i<3; i++){ } test_for.c
三目运算符 a?b:c test_ternary.c
do-while do{ }while(i<3); test_dowhile.c
while while(i<3){ } test_while.c
for i in range(0,3) for i in range(0,3)}{ } test_range.c
Switch-case(-default) switch(){case 1:…; case 2:…; default:…; } test_switch.c
+= -= *= /= %= i += 2; … test_primAssign.c
与 或 非 异或 & | ~ ^ a ^ b; a | b; a & b; ~a; test_bitop.c
移位运算 >> << a << 2; a >> 2; test_shift.c
Max Min max(e1, e2); min(e1, e2); test_minmax.c

执行命令

  • dotnet fslex --lexlib Microsoft.FSharp.Text.Lexing --unicode CLex.fsl
    生成CLex.fs词法分析器

  • dotnet fsyacc --lexlib Microsoft.FSharp.Text.Lexing --parslib Microsoft.FSharp.Text.Parsing --module CPar CPar.fsy
    生成CPar.fs语法分析器与CPar.fsi

  • javac Machine.java
    生成虚拟机

  • dotnet fsi -r FsLexYacc.Runtime.dll Absyn.fs CPar.fs CLex.fs Parse.fs Interp.fs ParseAndRun.fs
    可以启用fsi的运行该编译器。

  • fsi中输入:
    open ParseAndComp;;

  • 之后则可以在fsi中使用使用:

    • fromString:从字符串中进行编译

    • fromFile:从文件中进行编译

    • compileToFile:生成中间表示

示例:

compileToFile (fromFile "test/test_init.c") "test/test_init.out";;
#q;;fromString "void main(){int i = 1;}";;

生成中间表示之后,便可以使用虚拟机对中间代码进行运行得出结果:

虚拟机功能:

  • java Machine 运行中间表示
  • java Machinetrace 追踪堆栈变化

示例:

java Machine test_init.out
java Machinetrace test_init.out

功能实现

  • 变量定义

    • 简介:原本的microC只能声明变量,不能顺带赋值。改进后可以同时进行。

    • 对比

      // old
      void main(){int i;i = 1;
      }
      
      // new (test_init.c)
      int main(){int i = 1;print i;
      }
      
    • 堆栈图


  • 自增、自减操作

    • 简介:包含i++ ++i --i i–操作

    • 例子:

      void main(){int i = 1;print i++;print ++i;print i--;print --i;
      }
      ```http://www.biyezuopin.vip
    • 运行结果:


  • FOR循环

    • 简介:增加了for循环

    • 例子:

      void main(){int i;for(i = 0; i < 5; ++i){print i;}
      }
      
    • 运行结果:

    • 运行栈:


  • 三目运算符

    • 简介:三目运算符 a>b?a:b
    • 用例:
      void main(){int a = 2;print a?2:3;print a-2?2:3;
      }
    • 运行结果:

  • for in range

    • 简介:for i in range(0,5) 范围循环

    • 例子:

      void main(){int i;for i in range(0, 5){print i;}
      }
      
    • 运行结果:


  • Switch-case-default

    • 例子:

      void main(){int i = 0;switch(i){case 1: print 1;case 2: print 2;case 0: {int j = 1; print j;}}i = 5;switch(i){case 1: print 1;case 2: print 2;case 0: {int j = 1; print j;}default: print i;}
      }http://www.biyezuopin.vip
      
    • 运行结果:


  • += -= /= *= %=

    int main(){int i=0;int n=1;switch(n){case 1:{i=n+n;break;}case 5:i=i+n*n;}
    }
    
    • 运行结果

  • 与 或 非 异或 & | ~ ^

    void main(){print 1&0;print 1|0;print 2^1;print ~1;
    }
    
    • 运行结果:

  • 移位 << >>功能:

    • 例子:

      void main(){int i = 1;print i << 2;print i >> 1;
      }
      
      • 运行结果


  • Max Min 功能:

  • 例子:

    void main(){print max(10*10,1);print min(10*10,1);
    }
    
    • 运行结果


  • JVM

    BITAND = 26,BITOR = 27,BITXOR = 28,BITLEFT = 29,BITRIGHT = 30, BITNOT = 31
    http://www.biyezuopin.vip

    • 指令集添加:

      • BITAND:

        • 简介:& 与
        • 功能:将两个表达式进行与运算
      • BITOR:
        • 简介:| 或
        • 功能:将两个表达式进行或运算
      • BITXOR:
        • 简介:^ 异或
        • 功能:将两个表达式进行异或运算
      • BITLEFT:
        • 简介:<<
        • 功能:将值左移
      • BITRIGHT:
        • 简介:>>
        • 功能:将值右移
      • BITNOT:
        • 简介:~
        • 功能:二进制取反

心得体会

这学期大作业比较多,导致最后赶完其他5门大作业和两场考试后,只剩4~5天写编译。因为将近1个月没碰编译,所有结构都要重新看过。又由于F#比较灵巧,刚写的功能几分钟后就忘了是怎么实现的。中间想加一些功能,比如 break、try-catch等,我会发现需要对存储环境进行添加,但由于时间有限遂放弃。其次,在写完无续算版本的编译器后,打算尝试续算版本,感受到了自己有多菜,被头部声明的几个跳转函数玩的死去活来,真的记不住啊,写一句就要往上翻。最后也只实现了Expr部分和一个For循环的续算,卡在Switch 好几个小时又放弃了。。。

1、能感受到写一个功能,可能代码量不是很多,但是要想较长时间。

2、没有把概念、精髓融会贯通,对于环境定义总是写写忘忘,脑中无法生成连贯的思路。

3、虽然很多功能没能实现出来,但经过思考,我大概能知道缺少什么结构,对语言设计、存储有了进一步的理解

4、感受到了仅仅30条指令能完成这么多功能的强大,很有趣

5、没有试过llvm,有点遗憾。有时间会再去折腾一下没实现的功能,也会去试试llvm

从《七周七语言》了解并学习了不同类型的语言、到正则表达、词法分析、语法分析等等,最后自己上手解释器、编译器、生成中间代码、用栈式虚拟机运行,都对计算机学习有着极大的帮助。加深了我对计算本质的理解与运用。

MicroC实现Expr部分和for循环,无续算版本Comp.fs展示相关推荐

  1. EHPC通过断点续算和自动伸缩在抢占式实例上实现低成本HPC计算

    摘要: E-HPC 低成本计算方案 E-HPC作为阿里云上的云超算产品将HPCaaS公共云服务提供给客户,将公共云上资源弹性优势,高性能的优势,计算资源的多样性等优势提供给HPC用户,如果HPC用户追 ...

  2. foreach循环怎么获取全部返回值_JavaScript中For循环的3种版本和使用场景

    作者 | Fernando Doglio 译者 | 王强 我们大家都至少会了解一个版本的 For 循环,它如此经典,可能每一种语言都有它的一个版本.但 JavaScript 足足有 3 种 For 循 ...

  3. 宏基d260linux系统,Devuan GNU+Linux 2.0.0 稳定版发布,无systemd自由版本

    评价该项目"Veteran UNIX Admins"已经宣布发布Devuan GNU+Linux 2.0.0,这是该项目的一个新稳定版本,该版本在2014年底派生出Debian,以 ...

  4. CSS+JS自动循环滚动的多图片幻灯切换展示效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 戴尔G3 3579笔记本无法使用耳机上的麦克风/声卡驱动异常/无声音/声卡版本不兼容 的一个解决办法

    戴尔G3 3579笔记本麦克风用不了/声卡驱动异常/无声音/声卡版本不兼容 的一个解决办法 遇到的问题(症状) 戴尔G3 3579笔记本重装系统后插入耳机不再弹出询问框询问插入的是何种设备 识别不到普 ...

  6. 苹果App store app上架转让注意事项,无续费按钮,无转让按钮,给人工打电话

    下面几个注意事项挨个看一下 原账号下App处于活跃状态,即不能欠费 如果欠费,需要原账号 先下载developer App(手机下载就可以) 进行实名认证后,需要先到网页版接受一个协议,网页才会显示续 ...

  7. 掘进循环作业图表_Word版本。煤矿安全生产标准化评分方法(2020)8.4 掘进

    注:以下内容来自于网络,若有侵权请联系QQ3609400292进行删除. 煤矿安全生产标准化管理体系基本要求及评分方法(试行) 8.4  掘    进 一.工作要求(风险管控) 1.生产组织 (1)煤 ...

  8. 佛祖保佑永无BUG python版本

    佛祖保佑 永无BUG # # _ooOoo_ # o8888888o # 88" . "88 # (| -_- |) # O\ = /O # ____/`---'\____ # . ...

  9. 免费去水印软和视频编辑软件—无水印剪辑,版本V1.0.5

    行业解决方案.产品招募中!想赚钱就来传!>>> 免费全免费,无广告 无水印剪辑支持短视频去水印.图片去水印.视频裁剪.视频剪辑.视频图片加水印文字加图涂鸦工具! 1.支持一键解析提取 ...

最新文章

  1. MySQL中查询的看到的日期和Java程序查询出来的日期差了几个小时
  2. 第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击...
  3. HTML+CSS实例——漂亮的查询部件(一)
  4. Android构建流程——篇六
  5. 用udp协议通讯时怎样得知目标机是否获得了数据包?_和相亲对象聊天,你属于UDP还是CDP?...
  6. Redis的碎片整理功能只有在使用jemalloc的时候才支持
  7. 老杨和驳客都在胡言乱语——千条道理不如一个事实
  8. 系统学习NLP(五)--句法分析
  9. PHP的压力测试工具ab.exe 和mpm介绍提高并发数
  10. python微信爬虫
  11. 增强安全性、支持跨页逻辑关系设定的电信运营级EnableQ在线问卷调查引擎V1.60来了......
  12. cm11 android l,【鹰眼出品】安卓4.4.4 CM11已刷,流畅度爆表!《转》
  13. tcl中数字加减的怪异现象
  14. 7-1 愿天下有情人都是失散多年的兄妹 (25 分)
  15. 1.CPU体系架构-RISC指令集和CISC指令集
  16. testmeshpro合批_Unity合批原理及失败的原因
  17. 饿饿,饭饭「每日一题」
  18. cgb2107-day08
  19. 隐藏CAD图层内容,2种方法搞定
  20. 第 5 章 函数和代码复用

热门文章

  1. html 文本换行 \n 不换行 空格无效
  2. 硬件电子开发常用工具
  3. 公司合伙人股权的进入和退出机制
  4. C++中的全局变量声明和定义
  5. linux napi
  6. 链上数据分析—NFT 项目质量评估
  7. ssd测试遇到的问题
  8. sip 信令组成的基本格式 总结
  9. 深度学习(4):NCHW和NHWC
  10. 2018 Google I/O 中最重要的十项更新