首页
学习
活动
专区
工具
TVP
发布

Coding迪斯尼

专栏作者
321
文章
261421
阅读量
96
订阅数
自己动手写编译器:从正则表达式到NFA状态机
在编译器开发中有两个非常重要的工具名为lex和yacc,他们是编译器的生成器。本质上我们不需要一行行去完成编译器的代码,只需要借助这两个工具,同时制定好词法解析和语法解析的规则后,这两个工具就会自动帮我们把代码生成,我们后续的任务就是使用go语言将这两个工具实现。
望月从良
2022-12-02
9910
自己动手写编译器:while,for,do等循环语句的中间代码生成
我们的简易编译器完成了一大部分,但还有一些关键的语法结构没有处理,那就是for, while, do..while等循环语句对应的中间代码还没有生成,本节我们就针对这些语法结构进行相应的中间代码生成。
望月从良
2022-06-21
1K1
自己动手写数据库:实现交易对象和恢复管理器
前面一节我们完成了用于实现系统恢复的日志,本节我们看看如何基于日志内容实现系统恢复。我们将设计一个系统恢复管理器,它在系统启动时读取日志内容,根据读到的日志对数据进行恢复,由于所谓“恢复”其实是交易的回滚,因此我们首先实现交易对象,前面为了测试方便,我们简单的提供了交易对象的几个简单接口,这里我们将实现一个逻辑完整的交易对象,只不过我们暂时忽略其并发管理逻辑,并发功能我们将在后面的章节进行实现。
望月从良
2022-06-21
2810
自己动手写编译器:实现if判断中“||“和“&&“条件判断的中间代码生成
上一节我们完成了if条件判断语句的中间代码生成,我们看到针对if语句的生成代码,我们针对if 条件满足时所要执行的代码赋予了一个跳转标签,同时对if(){…} 右边大括号后面的代码也赋予一个跳转标签,这样我们就能根据if条件判断成立与否进行跳转。
望月从良
2022-06-21
6050
动手写编译器:手动构造语法树,驱动中间代码生成
在前面章节中我们给出了语法解析树对应节点的设计,这些节点能够针对其内容完成中间代码的输出,这一节我们继续完善必要节点的设计,然后手动构造语法树,并驱动语法树实现中间代码生成。
望月从良
2022-04-27
3070
自己动手写编译器:通过语法编译构建语法树并实现中间代码生成
上一节我们手动构造了语法树,然后调用各个节点实现中间代码生成。语法树的构建由语法解析完成,本节我们要完成语法解析逻辑,在语法解析过程中构造语法树,然后再像上一节那样实现中间代码生成。
望月从良
2022-04-27
6170
自己动手写编译器:中间代码生成1
我们到了简单编译器开发的最后一个阶段,也就是生成中间代码。以前我们提到过编译器分为两部分,分别为前端和后端,所谓前端就是将代码转译成中间语言,后端负责进行优化和转译成目标平台的机器指令,现在我们来到了前端的最后一个阶段。由于中间代码生成是当前所有阶段中逻辑最为复杂的部分,因此我们需要将其分解成多个容易理解的小部分,逐个击破。我们的计划是这样,首先完成比较简单的代码的中间代码生成,然后不断提升目标代码的复杂度,然后生成更加复杂的中间代码。
望月从良
2022-04-27
5590
自己动手写编译器:符号表及其实现
大家如果对c, c++, java有所了解,那么就会知道作用域这个概念。所谓作用域就是变量在一个范围内起作用,一旦出了既定范围,那么它就会失效。c,c++,java用{表示作用域的起始,用}表示作用域的结束。内层作用域的变量会覆盖上一层作用域的变量。例如在上面代码中最外层定义了两个变量,分别是int类型的x,和char类型的y,在内层作用域又定义了一个bool类型的同名变量y,它会覆盖外面的char类型y,在内层作用域访问y时,我们访问的是类型为bool的y,但由于内层作用域没有定义x,因此访问x时,它对应外层作用域的x,因此我们的任务是识别作用域,同时解析出变量在不同作用域中对应的类型。
望月从良
2022-04-27
7010
从零动手写数据库系统:数据库系统的日志模块实现
任何一个应用只要冠以”系统“二字,那么它一定离不开一个模块,那就是”日志“。既然我们要开发一个数据库系统,那么它必然要有自己的日志模块。日志通常用于记录系统的运行状态,有点类似于快照,一旦系统出现异常,那么管理员或者它的代码本身可以通过扫描分析日志来确定问题所在,或者通过日志执行错误恢复,这点对数据库系统更加重要。
望月从良
2022-04-27
4520
动手写编译器:左递归消除和无歧义算术表达式解析代码实现
在前面章节中我们看到,语法生产式本质上指导了我们如何展开代码,例如对于生产式A->X Y Z,那么我们在解析A的时候,对于的代码就是:
望月从良
2022-04-27
2790
从零写个数据库系统:磁盘的基本原理和数据库底层文件系统实现
我做过操作系统,完成过tcpip协议栈,同时也完成过一个具体而微的编译器,接下来就剩下数据库了。事实上数据库的难度系数要大于编译器,复杂度跟操作系统差不多,因此我一直感觉不好下手。随着一段时间的积累,我感觉似乎有了入手的方向,因此想试试看,看能不能也从0到1完成一个具有基本功能,能执行一部分sql语言的数据库系统。由于数据库系统的难度颇大,我也不确定能完成到哪一步,那么就脚踩香蕉皮,滑到哪算哪吧。
望月从良
2022-04-27
3330
用go做个编译器:语法解析树及其实现
语法解析一个非常重要的功能就是要构建一个树形数据结构,也叫语法解析树,无论是解释器执行当前语句还是编译器将语句转换为低级语言,解析树都是一个承上启下的重要结构。对任何生产式A -> X Y Z,它都会生成一个以A为父节点,X,Y,Z为子节点的多叉树,而且X,Y,Z作为节点出现的顺序与他们在生产树中出现的位置一样,如下图所示:
望月从良
2022-03-28
1.1K0
能动手就别逼逼:词法解析实现(文字版)
编译原理是非常基础,难度也大,而且是比较晦涩难懂的基础理论。也难怪说世界上能做编译器的人总共坐不满一个教室。虽然不简单,但我们也不要随意放弃,尽自己最大努力,看看能不能在教室里挤出个座位。
望月从良
2022-03-28
5060
使用Go开发去中心化交易平台:基本数据结构
前面章节我们了解了区块链的基本原理,涉足到其底层加密算法,现在我们可以开始将区块链技术应用起来,我们看看如何建立一个基于区块链技术的,去中心化的交易平台。这里我们使用go来实现区块链的基本算法,使用gin完成后台restful服务功能,然后使用reactjs完成前端开发,通过具体的应用,我们看看区块链技术如何保证信息的不可篡改性,同时我们也逐步了解多节点共识,网络同步等重要概念。
望月从良
2022-03-28
2830
go实现分布式高可用后台:使用gRPC实现日志微服务
掌握了gRPC的基本原理后,我们可以借助它来实现日志的微服务功能。在构建高并发系统时,内部的服务组件通常使用gRPC来实现高效数据传输,因此我们把前面使用json完成的日志服务改成用gRPC来完成。
望月从良
2022-03-28
2180
GO实现高可用高并发分布式系统:使用gRPC实现一对多和多对多交互
在上一节我们使用gRPC实现了客户端和服务端的一对一通讯,也就是客户端向服务端发出一个请求,服务端返回一个结果。但是在很多场景下可能需要客户端向服务端连续发送多个请求后,服务端才能进行处理然后返回一个结果,例如客户端向服务端发送多个订单号,让服务端对订单号进行记录,然后服务端把所有订单号记录后返回结果;或者是客户端发送一个订单号查询所有大于给定订单号的交易记录,然后服务端返回满足条件的十几条记录等。
望月从良
2022-03-28
9790
GO实现高可用高并发分布式系统:gRPC实现客户端与服务端的一对一通讯
分布式系统的特点是不同的功能模块会以独立服务器程序的方式运行在不同主机上。当服务A想请求位于另一台机器的服务B完成特定请求时,就必须将要处理的数据提交给B。这个过程就涉及到一系列问题,首先A需要把数据进行序列化然后通过网络连接发送给B,B接收到数据后需要进行反序列化得到数据原型,进行相应处理得到结果,接着把结果序列化后再传递给A,A收到结果后进行反序列化,得到处理结果的数据结构。
望月从良
2022-03-28
9250
大量实例详解Go反射机制原理与应用
有一些高级语言提供了涉及到编程元素深层信息的接口,这些信息通常是运行时或编译器有用,但语言也通过接口将其暴露出来,这样开发者就能使用它们实现一些类似黑客的功能。这些能让开发者攫取到编程元素深层信息或者进行深度操作的接口就叫反射,在Go和Java都有提供,运用好反射功能可以开发出功能强大的程序,但是反射由于涉及到编译原理,因此比较抽象,在此我们用丰富的例子来说清楚GO的反射接口应用。
望月从良
2022-03-28
3900
go实现高并发高可用分布式系统:设计类似kafka的高并发海量数据存储机制2
上一节我们完成了数据的存储和索引,本节我们看如何写入数据和进行查询。我们将创建一个Segment对象,它一方面接收发送来的请求,也就是Record数据结构,然后将数据写入到store和index,基本架构如下:
望月从良
2022-01-17
5000
go实现高并发高可用分布式系统:设计类似kafka的高并发海量数据存储机制1
上一节我们实现了日志微服务,它以http服务器的模式运行,客户端通过json方式将日志数据post过来,然后通过http get的方式读取日志。当时我们的实现是将所有日志信息添加到数组末尾,这意味着所有日志信息都会保存在内存中。但分布式系统的日志数量将非常巨大,例如推特一天的日志数量就达到一万亿,国内微博,微信,淘宝等超大规模系统的日志数量估计也是这个等级。假设我们使用一百台服务器运行日志微服务,那么一台将处理10亿条日志,再假设一条日志为64字节,那么如果直接将日志存放在内存就需要消耗64G,再考虑到很多日志存储后很可能再读取,而且一台服务器还需要提供其他程序运行,因此直接将日志存储在内存将是一种巨大的损耗。
望月从良
2022-01-15
5000
点击加载更多
社区活动
Python精品学习库
代码在线跑,知识轻松学
【玩转EdgeOne】征文进行中
限时免费体验,发文即有奖~
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·干货材料·成员作品·最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档