@[TOC](The super tiny compiler(超级小的编译器))

The super tiny compiler(超级小的编译器)

分别用C、RUST、ZIG实现了三个语言的The super tiny compiler,其中C语言版可以用GCC,TCC,CLANG,ZIG CC编译,目前看TCC编译生成的exe文件最小。
原项目地址: https://github.com/jamiebuilds/the-super-tiny-compiler,原项目使用JS实现。
中文翻译地址:https://github.com/521xueweihan/OneFile/blob/main/src/javascript/the-super-tiny-compiler.js

编译器的简单概念

编译器的简单概念:将源语言翻译成目标语言。
编译过程通常由词法分析器(lexer)、语法分析器(parser)、代码生成器(generater)三部分组成。
词法分析器:将源代码序列化为Token数据结构对象。
语法分析器:将Token数据对象进一步序列化为抽象语法树(AST)数据结构对象。
代码生成器:将抽象语法树数据对象序列化为目标代码。
一分钟图文并茂的编译器原理介绍:https://www.bilibili.com/video/BV1Tc411h7rj?is_story_h5=false&p=1&share_from=ugc&share_medium=ipad&share_plat=ios&share_source=WEIXIN&share_tag=s_i&timestamp=1663335535&unique_k=ztfqvLf&vd_source=06969d50da2a83309a5fc7fd4dcc4d73

项目介绍

项目的目标就是简化编译器的概念,并实现一个将类似 LISP 函数调用的源语言编译成类似 C 函数调用的目标语言的编译器。
项目源码地址:https://github.com/Define2017/the_super_tiny_compiler/tree/main

实现的编译效果如下:

源语言 LISP   =======>    目标语言 C
(add 2 2)                 add(2, 2)
(subtract 4 2)            subtract(4, 2)
(add 2 (subtract 4 2))    add(2, subtract(4, 2))

以(add 2 (subtract 4 2))的编译过程为例,详细编译过程如下:

词法分析器过程:

LISP       ===========>   Token
(add 2 (subtract 4 2))    [{ type: 'Parent', value: '('        },{ type: 'Name',   value: 'add'      },{ type: 'Number', value: '2'        },{ type: 'Parent', value: '('        },{ type: 'Name',   value: 'subtract' },{ type: 'Number', value: '4'        },{ type: 'Number', value: '2'        },{ type: 'Parent', value: ')'        },{ type: 'Parent', value: ')'        },]

**算法:**就是逐字符的扫描源码,将一组满足设定Token结构的字符放入Token数据对象中。这里将左右括号分别识别为一个Parent类型的token,将add 、subtract识别为Name类型的token,将数字识别为Number类型的token,虽然例子没有涉及到字符和字符串,但是代码实现上也有考虑,将字符、字符串分别识别为Char、Str类型的token。这个规则不是唯一的,可以自己定义Token的结构,然后实现代码。这里Token类型的种类就是对源语言的关键字、标识符、特殊字符、字面量值作分类。

语法分析器过程:

Token          ========================>      AST
[                                             {{ type: 'Parent', value: '('        },       type: 'Program',{ type: 'Name',   value: 'add'      },           body: [{{ type: 'Number', value: '2'        },             type: 'CallExpression',{ type: 'Parent', value: '('        },             name: 'add',{ type: 'Name',   value: 'subtract' },             params: [{{ type: 'Number', value: '4'        },               type: 'NumberLiteral',{ type: 'Number', value: '2'        },               value: '2',{ type: 'Parent', value: ')'        },               }, {{ type: 'Parent', value: ')'        },               type: 'CallExpression',
]                                                       name: 'subtract',params: [{type: 'NumberLiteral',value: '4',}, {type: 'NumberLiteral',value: '2',}]}]}]}

**算法:**首先增加了一个类型为Program的父节点用来表示程序,程序的主体部分是从Token数据对象中序列化。对Token中类型为Parent的一组左右括号识别为表达式,表达式由类型、名称、参数表组成。参数有两种类型一种是字面量(数值、字符),另一种是表达式。由于表达式中会嵌套表达式作为参数,所以实现时使用了递归方式来解析表达式。递归是常用的方式实现和理解上比较清晰、简单、容易,算法能力强可以考虑循环。

代码生成器过程:

AST         ========================>    destinate code
{                                        add(2, subtract(4, 2))\ntype: 'Program',body: [{type: 'CallExpression',name: 'add',params: [{type: 'NumberLiteral',value: '2',}, {type: 'CallExpression',name: 'subtract',params: [{type: 'NumberLiteral',value: '4',}, {type: 'NumberLiteral',value: '2',}]}]}]
}

**算法:**代码生成过程与语法解析过程相似,根据抽象语法树的内容逐步生成目标代码字符串,程序主体中多个表达式之间用换行符\n分割。表达式参数之间用逗号分割。由于表达式中会嵌套表达式,所以代码生成器同语法分析器一样使用了递归来生成表达式。

The super tiny compiler(超级小的编译器)相关推荐

  1. 3 天开发物联网应用!腾讯云 IoT 超级小程序来了

    腾讯在物联网的故事要从 6 年前开始说起. 作者 | 唐小引 出品 | CSDN(ID:CSDNnews) 在腾讯复盘起过去的 20 年里有哪些标志性的事件时,马化腾提出腾讯要「连接一切」和「腾讯云正 ...

  2. 腾讯云 IoT 超级小程序来了!3 天极速开发物联网应用

    腾讯在物联网的故事要从 6 年前开始说起. 作者 | 唐小引 出品 | CSDN(ID:CSDNnews) 在腾讯复盘起过去的 20 年里有哪些标志性的事件时,马化腾提出腾讯要「连接一切」和「腾讯云正 ...

  3. GCC(GNU Compiler Collection,GNU编译器套件)

    文章目录 1. GCC 主要软件包 2. GCC 编译过程 2.1 GCC 编译过程 2.2 GCC 单步完成编译 3.GCC 常用 选项和参数 4.C/C++ 程序 常用文件名后缀 5. 链接 可分 ...

  4. 小型c语言编译,GitHub - ming311/Compiler: 小型C语言编译器

    基于java的C语言编译器 采用LL(1)文法进行分析,文法是C语言文法的子集,支持报错,以及错误原因 以前只用编译器编译程序,现在学完编译原理这门课以后,通过编译大作业,我对编译器的工作原理有了比较 ...

  5. UVA11752 The Super Powers【超级幂+暴力+数论】

    We all know the Super Powers of this world and how they manage to get advantages in political warfar ...

  6. Arm Compiler for Embedded 6 编译器工具链常用选项

    目录 1,标准的 armclang 编译选项 1.1 --target选项:指定执行状态 aarch64-arm-none-eabi arm-arm-none-eabi 1.2 -march选项:指定 ...

  7. C语言开发小游戏—编译器篇graphic.h的安装

    用C语言开发小游戏的前期准备-以VS2015编译器为例 要开发小游戏很大 程度上C和C++都会涉及,并且会涉及不少库函数的知识,在这里简单起见,我先把开发一个简单的图形界面游戏需要的东西在这里写一下, ...

  8. phalanger php compiler,phalanger-php的.net编译器 _php技巧

    除了IronPython,微软正试着让.NET平台支持更多你我熟知的动态语言,例如Perl.PHP.Ruby.根据IronPython的创造者.也是微软CLR开发部门主管Jim Hugunin表示,微 ...

  9. 用Python写个超级小恐龙跑酷游戏,上班摸鱼我能玩一天

    目录 啥也不多说,先来一个效果图展示 工具使用 游戏思路解析 项目整体的框架搭建 创建小恐龙对象 创建障碍物对象 创建地板对象 游戏的基本配置信息 啥也不多说,先来一个效果图展示 工具使用 开发环境: ...

最新文章

  1. 根据两点间的经纬度计算距离
  2. 控制反转 IOC 与依赖注入 DI
  3. Python基础(6)--条件、循环
  4. 2018-2019-2 网络对抗技术 20165318 Exp 9 Web安全基础
  5. java核心知识点学习----多线程间的数据共享的几种实现方式比较
  6. 深入理解require与require_once与include以及include_once的区别
  7. php md5校验工具下载,md5校验工具下载_md5校验工具下载「最新|免费」-太平洋下载中心...
  8. 极限中0除以常数_谈用泰勒展开法求极限
  9. cad动态块制作翻转_cad动态块制作教程
  10. 应对新《劳动合同法》 万名华为员工自选去留
  11. 城镇污水处理厂工艺概述及提标改造路线
  12. RFC 822 中文版 MIME解析基础(4)(第5-6也)
  13. 尘埃落定!AI 大牛贾佳亚离开腾讯优图,创立思谋科技,投身差异化 AI 创业
  14. YOLOv3 cfg文件详解
  15. 动态规划——背包问题九解(01背包)
  16. python的多任务处理
  17. 飞图平板电脑android系统怎么更新,苹果平板电脑怎么更新教程【图文】
  18. 度数换算_度数的换算
  19. 计算机图形学算法【1】——直线画法(数值微分法)
  20. CAS的ABA问题及解决代码示例

热门文章

  1. MySQL调优之关联查询、子查询优化
  2. 线程同步之模拟银行取钱实例
  3. Data Stream Median
  4. vue表单验证(验证是否是座机或手机号)
  5. Excel·VBA单元格区域按颜色求和等计算
  6. 入手评测i7 13620H和i9 12900H对比 酷睿i713620H和i912900H选哪个
  7. C++ 中为什么要有“ 指针” 和 “ 引用”
  8. 儿童医疗保健生物识别技术市场现状及未来发展趋势分析
  9. python控制CAD画图
  10. Blender基础操作