
小白打造编译器
参考课程《编译原理之美》,内涵个人学习笔记与思考总结
见见大魔王
我很懒
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【小白打造编译器系列12】了解汇编语言
对于静态编译型语言,比如 C 语言和 Go 语言,编译器后端的任务就是生成汇编代码,然后再由汇编器生成机器码,生成的文件叫目标文件,最后再使用链接器就能生成可执行文件或库文件了。汇编语言汇编语言,简单来说,是可读性更好的机器语言,基本上每条指令都可以直接翻译成一条机器码。用 C 语言写的例子来生成一下汇编代码。#include <stdio.h>int main...原创 2020-04-05 10:30:48 · 748 阅读 · 0 评论 -
【小白打造编译器系列11】运行时机制
程序运行环境程序运行的过程中,主要是跟两个硬件(CPU 和内存)以及一个软件(操作系统)打交道。关注 CPU 和内存我们重点关注的是 寄存器 以及 高速缓存,它们跟程序的执行机制和优化密切相关。寄存器是 CPU 指令在进行计算的时候,临时数据存储的地方。CPU 指令一般都会用到寄存器,比如,典型的一个加法计算(c = a + b)的过程是这样的:指令 1(mov)...原创 2020-04-04 10:44:08 · 446 阅读 · 0 评论 -
【小白打造编译器系列10】编译器的后端技术
我们前面已经在探讨了编译器的前端技术。它的重点,是让编译器能够读懂程序。无结构的代码文本,经过前端的处理以后,就变成了 Token、AST 和语义属性、符号表等结构化的信息。基于这些信息,我们可以实现简单的脚本解释器。编译器后端要解决的问题:现在给你一台计算机,你怎么生成一个可以运行的程序,然后还能让这个程序在计算机上正确和高效地运行?程序运行机制我们关注的是两个底层硬件...原创 2020-04-04 09:57:24 · 1513 阅读 · 1 评论 -
【小白打造编译器系列9】实现面向对象特性
面向对象的特点在于封装。对象可以把数据和对数据的操作封装在一起,构成一个不可分割的整体,尽可能地隐藏内部的细节,只保留一些接口与外部发生联系。面向对象的语义特征我们从以下三个语义角度去理解面向对象的封装特性。从类型角度 我们允许程序员可以创建自己的类型,提高程序的扩展性。从作用域角度类的可见性。作为一种类型,他应该再整个程序范围内都是可见的。 对象...原创 2020-04-03 20:35:25 · 462 阅读 · 0 评论 -
【小白打造编译器系列8】作用域和生存期:实现块作用域和函数
为什么要引入作用于和生存期呢?我们来看看下面几个问题:如果要实现函数功能,要升级变量管理机制; 引入作用域机制,来保证变量的引用指向正确的变量定义; 提升变量存储机制,不能只把变量和它的值简单地扔到一个 HashMap 里,要管理它的生存期,减少对内存的占用。作用域(Scope)作用域是指计算机语言中变量、函数、类等起作用的范围。我最早看到这个名词还是在 C Primier ...原创 2020-04-02 11:01:20 · 768 阅读 · 0 评论 -
【小白打造编译器系列7】Anltr 重构脚本语言
表达式语法表达式语法的着重点请参照:小白打造编译器系列4】确保表达式正确的优先级、左递归和结合性,我进行了总结与解释。Antlr 可以自动的解决左递归的问题,所以在写表达式的时候,不用担心是否回进入死循环。但这样,我们还是要为每个运算写一个规则,逻辑运算写完了要写加法运算,加法运算写完了写乘法运算,这样才能实现对优先级的支持,还是有些麻烦。这时,Antlr 可以进一步帮助我们,用最...原创 2020-04-02 10:09:59 · 909 阅读 · 0 评论 -
【小白打造编译器系列6】认识编译器前端工具:Antlr
通过【小白打造编译器系列】我们已经完成了一个简单的编译器,它仅支持简单的运算和识别几个关键字。而在实际应用中,这些简单的词法和语法规则根本不能满足我们的需要。因此我们需要借助现成的前端工具。当然,编译器的前端工具有很多,而我们选择 Antlr 的原因是它能支持更广泛的目标语言,以及它的语法更加简单。AntlrAntlr 是一个开源的工具,支持根据规则文件生成词法分析器和语法分析器,它自身是...原创 2020-04-01 11:16:23 · 1065 阅读 · 0 评论 -
【小白打造编译器系列5】实现一门简单的脚本语言
我们可以在前面计算器的基础上继续补充代码,实现一门简单的脚本语言。添加的功能支持变量声明和初始化语句。"int age;","int age = 45;",“int age = 4 + 5;” 支持赋值语句。"age = 45;" 在表达式中可以使用变量。"age + 10 * 2;" 完成一个命令行终端的实现。完善语法规则声明语句以 int 开头,后面跟标识符,然后...原创 2020-03-30 14:23:17 · 750 阅读 · 0 评论 -
【小白打造编译器系列4】确保表达式正确的优先级、左递归和结合性
二元表达式并没有想的那么简单,我们需要处理表达式的优先级、结合性还有左递归的问题。原创 2020-03-29 11:14:57 · 1266 阅读 · 0 评论 -
【小白打造编译器系列3】实现简单的公式计算器(加法和乘法)(JAVA实现)
我们在前文【小白打造编译器系列1】编译器的前端技术是什么?已经知道语法分析的结果是生成一个 AST。那么我们通过实现一个简单的公式计算器来加深对生成 AST 过程的理解。本文的重点是:递归下降算法 和 上下文无关文法。我们简单的计算器这里只考虑 加法 和 乘法。(减法和除法原理上是一样的,这里就不重复完成了)变量声明语句我们先来看看变量声明语句,理解什么是“下降”。之前提到过了,对于 ...原创 2020-03-26 12:56:33 · 1465 阅读 · 0 评论 -
【小白打造编译器系列2】实现词法分析器(JAVA)
通过前文【小白打造编译器系列】编译器的前端技术是什么?我们已经对整个编译器的前端有了一定的了解,那么我们接下来实战一下,实现一个简单的词法分析器。实现词法分析器,就是写出正则表达式,画出有限自动机的图形,然后根据图形直观地写出解析代码的过程。我们实现的词法分析器,包括:关系表达式:age >= 45 变量声明:int age = 40 算术表达式:2*3+5解析ag...原创 2020-03-24 20:03:32 · 1179 阅读 · 0 评论 -
【小白打造编译器系列1】编译器的前端技术是什么?
个人原创学习笔记,参考极客时间。编译器的整个宏观流程我们先来看看整个编译过程编译器做了那些事情吧。这里我们随便写一个复杂的 Hello World 程序。#include <stdio.h>int main(int argc, char* argv[]) { int age = 45; if (age >= 17 + 8 + 20) { printf("H...原创 2020-03-24 09:46:17 · 1467 阅读 · 2 评论