写一个简单的解释器(1) 编译过程简介

news/2024/11/20 3:36:53/

编译过程

一般来说,将一份源代码编译为可执行文件包含下面的关键步骤:
源文件 ⇒ 构建标记流 ⇒ 构建编译树 ⇒ 生成可执行文件 \texttt{源文件}\Rightarrow \texttt{构建标记流}\Rightarrow \texttt{构建编译树}\Rightarrow\texttt{生成可执行文件} 源文件构建标记流构建编译树生成可执行文件
以下面一段代码举例:

namespace space1 {class A {var int a, b;func __init__(int a, int b) { this.a = a, this.b = b; }public func int sum() { return a + b; }}func calc(int a, int b, int c, int d) {var A v1 = A(a, b), v2 = B(c, d)return math::max(v1.sum(), v2.sum());}
}

标记流

将代码分割成若干个最小的,有意义的单元的操作,叫做标记流构建,而一个标记就是一个单元,单元有多种类型,比如关键字,标识符,运算符,各种括号,分号…
比如上述代码的第 5 5 5 行,用构建成标记流就是:

[Keyword public] [Keyword func] [Identifier int] [Identifier sum] [SmallBracketL] [SmallBracketR] 
[LargeBracketL] [Keyword return] [Identifier a] [Operator +] [Identifier b] [ExpressionEnd] [LargeBracketR]

编译树

将标记流进行一定的处理,然后用树形结构组织起来,形成代码层级的父子关系。
比如对于上面的代码,构建成编译树就是:

[Namespace space1] [Class A] [VariableDefinition][Type int][Identifier a][Identifier b][FunctionDefinition][Accessibility public][Type A][Identifier A][Argument][Type int][Identifier a][Argument][Type int][Identifier b][Block][Expression][Comma][Assign][CallMember][Identifier this][Identifier a][Identifier a][Assign][CallMember][Identifier this][Identifier b][Identifier b][FunctionDefinition][Accessibility public][Type int][Identifier sum][Block][Return][Expression][Add][Identifier a][Identifier b]...

生成可执行文件

根据编译树,生成对应字节码,这里参照 Java \texttt{Java} Java 设计了一个指令集。

enum class CommandID {label,vbmov, vi32mov, vi64mov, vfmov, vomov, mbmov, mi32mov, mi64mov, mfmov, momov,add, sub, mul, _div, mod, ladd, lsub, lmul, _ldiv, lmod, fadd, fsub, fmul, fdiv, uadd, usub, umul, udiv, umod, badd, bsub, bmul, bdiv, bmod,eq, ne, gt, ge, ls, le, feq, fne, fgt, fge, fls, fle,_and, _or, _xor, _not, lmv, rmv, land, lor, lxor, lnot, llmv, lrmv, uand, uor, uxor, unot, ulmv, urmv, band, bor, bxor, bnot, blmv, brmv,ret, opop, pop,vbgvl, vi32gvl, vi64gvl, vfgvl, vogvl, mbgvl, mi32gvl, mi64gvl, mfgvl, mogvl,push0, push1,pvar0, pvar1, pvar2, pvar3, povar0, povar1, povar2, povar3,arrmem1, arromem1,pack, unpack, _new, jmp, jz, jp,setvar,poparg, push,pvar, povar, pglo, poglo, pstr,mem, omem, sys,arrnew, arrmem, arromem,call, ecall
}

先不解释具体含义。


http://www.ppmy.cn/news/1168760.html

相关文章

Leetcode刷题解析——串联所有单词的子串

1. 题目链接:30. 串联所有单词的子串 2. 题目描述: 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如,如果 words ["…

Hadoop3教程(三十四):(生产调优篇)MapReduce生产经验汇总

文章目录 (164)MR跑得慢的原因(165)MR常用调优参数Map阶段Reduce阶段 (166)MR数据倾斜问题参考文献 (164)MR跑得慢的原因 MR程序执行效率的瓶颈,或者说当你觉得你的MR程…

git初学者使用教程(包含Android studio中git使用)

文章目录 1、登录 / 注册git账号2、创建git仓库3、设置git的用户名和邮箱4、创建git仓库5、已有仓库推送代码到远程仓库6、进阶使用,命令行和Android studio软件使用1. 克隆(Clone)源码仓库2. 查看仓库状态(Status)3. …

JS学习-CryptoJS加密库

CryptoJS加密库 安装库 npm install crypto-js如下例子 对称加密 const CryptoJS require(crypto-js); //引入加密库 var str"123456" //md5加密 console.log(CryptoJS.MD5(str).toString()) var str2 CryptoJS.enc.Utf8.parse(str); //可以把字符串转成UTF-…

怎样找外企/远程的工作

“如果你既不想卷,又不想参与职场的勾心斗角,也不算行业大牛,还不愿意冒太高风险,那还有一种渠道,就是找海外公司的远程工作,比如我有几个程序员朋友,都是拿着硅谷动辄 20w 刀的薪水&#xff0c…

项目管理实战总结(一)-沟通路径问题

前言 那是2021年春节之后,我决定主动申请参与到这个项目,是知道工作强度大、难度大的情况的。有很多的同事是想躲,而我是明知山有虎偏向虎山行。我确定,通过这个项目,一定有我需要的东西。现在项目已经完成了终验专家…

JavaWeb——IDEA相关配置(Maven配置以及创建自己的第一个Maven项目)

写在前面: 笔者根据狂神说的javaweb视频,一步一步跟着配置IDEA中的Maven,在后面,笔者将讲述自己如何从0配置Maven以及创建自己的第一个Maven项目,笔者将自己的心路历程,包括配置的过程,都以文字…

win11恢复win10形式的右键显示

win11恢复win10形式的右键显示 win11恢复win10形式的右键显示一、问题二、解决方法三、恢复方法四、参考 win11恢复win10形式的右键显示 一、问题 win11系统用7z解压文件的时候,右键压缩包文件,还需要点击“显示更多选项”才能看见7z的选项&#xff0c…