ZCMUCZX的博客

学习的脚步

基于LLVM-分析Pass的制作

分析Pass在实际不修改IR的情况下提供关于IR的更高级的信息,而这些信息可以被其他的分析Pass使用来计算其结果,只要一个分析的Pass计算得出了结果,这个计算结果可以被不同的Pass拿来多次使用,直到一个Pass改变了这个IR 我们先编写下我们需要去进行测试的代码 int func...

2018-06-29 19:36:28

阅读数:53

评论数:0

基于LLVM-自定义Pass

首先我们要先去编写一个 FuncBlockCount.c文件 #include "llvm/IR/Function.h" #include "llvm/Pass....

2018-06-29 14:46:25

阅读数:175

评论数:0

基于LLVM的Pass优化

当我们如果完成了对源码的转换,得到了LLVM的IR表示形式,它是作为一种向汇编代码转换的一个公共平台,依赖不同的后端会得到不同的汇编码,在转换为汇编码之前,如果我们对IR进行优化的话就可以得到执行效率更高的代码 在LLVM的架构当中,Pass的作用就是优化LLVM IR,Pass作用于L...

2018-06-29 12:12:31

阅读数:95

评论数:0

基于LLVM-增加JIT支持

JIT其实就是Just-In-Time也就是即时编译,在程序运行的时候会将代码翻译成机器码并且去执行,与之相对的就是AOT(Ahead Of Time),它在程序运行之前就会将代码翻译成机器码,JIT结合了AOT和解释执行的优势,它能够产生高效的机器码,并且具备足够的灵活性 首先我们定义...

2018-06-28 10:24:39

阅读数:167

评论数:0

基于LLVM-自定义二元运算符的重载

下面就简单的介绍下,我们去构造 | (逻辑或运算符)作为样例,TOY语言当中的 | 运算符是这样使用的,其中前面的binary代表的是标识符,代表的是二元运算符的表示,然后后面就是| 运算符,再就是(LHS RHS) 根据这两个参数进行选择 def binary | 5 (LHS RHS...

2018-06-27 22:40:39

阅读数:35

评论数:0

基于LLVM-for循环结构的支持

循环结构通常需要先初始化一个归纳变量,然后之后就要对这个变量做更新(增加或减少其数值),以及一个表示循环结束的终止条件,我们的for循环可以定义如下所示,其中i=1表示的是条件、i def printstar(n x) for i = 1, i < ...

2018-06-25 13:23:15

阅读数:54

评论数:0

基于LLVM-处理if/then/else结构

感觉自己这个辣鸡,深入怕是难度太大,还是先简单的介绍下上层的使用吧,这里的讲解还是基于之前所讲的来的,我们主要进行某些方法的改动以及另一个AST类的添加和解析 首先我们如果要去添加对if、else、then的判断,那么我们的token的解析肯定是要有的,所以我们需要在枚举类型当中去添加它...

2018-06-24 11:50:36

阅读数:295

评论数:0

为AST类定义IR代码的生成

上次说到的是现在所有的必要的信息都是存储在AST这一个数据结构当中,下一个阶段就是从AST中生成的LLVM IR在代码的生成的过程当中,我们可以去使用LLVM的API,通过内建的API可以生成预定义格式的LLVM IR 我们需要在BaseAST类和其的子类当中去添加Codegen函数,因...

2018-06-19 23:28:13

阅读数:172

评论数:0

语法分析器的基本要素

语法分析是编译的第二个阶段,语法分析的基本任务就是根据指定的文法识别输入的句子当中的各类短语并构造它的分析树,其实也就是识别由词法分析给出的单词符号串是否是给定文法的正确句子(程序) 语法分析器根据语言的语法规则来解析代码,解析阶段决定了输入的代码是否能够根据既定的语法组成token流 ...

2018-06-19 17:59:20

阅读数:189

评论数:0

定义抽象语法树结构

有的时候真的觉得技术更新换代的太快以致于有些版本不同就会很容易的造成很多错误的产生..历经九九八十一难,才可以成功一个技术点… 下面就简单的讲下抽象语法树的一些概念和定义其的具体结构 抽象语法树是一门编程语言源码的抽象语法结构的树形表示 各种语言组件,例如表达式、条件控制语句...

2018-06-19 16:46:06

阅读数:306

评论数:0

简易C++词法分析程序

词法分析往往是编译程序的第一步,词法分析器会把程序代码的输入流切分为token,然后语法分析器会接受这些token,并且去把token流构建成AST(抽象语法树),一般来说,被解析成token的语言是基于上下文无关语法的,一个token可以是一个字符串,由一个或者多个同一范畴的字符组成 输...

2018-06-18 14:48:59

阅读数:203

评论数:0

Clang的不同作用

clang编译器可以拿来作为预处理器、编译器驱动、前端以及代码生成器使用,它的输出是取决于你指定的参数的 接下来我们写下如下的代码 #include<stdio.h> int main() { printf("Hel...

2018-06-17 19:30:09

阅读数:117

评论数:0

LLVM简单介绍

LLVM全称为Lower Level Virtual Machine,最初是以C/C++为编译目标,现如今LLVM已经能够为ActionScript、D、Fortran、Haskell、Java、Objective-C、Swift、Python、Ruby、Rust、Scala等众多语言提供了...

2018-06-17 12:37:45

阅读数:257

评论数:0

LR分析法

LR文法是最大的、可以构造出相应的移入-归约语法分析器的文法类,其中L表示的是对输入进行从左到右的扫描,而R代表的就是反向构造出一个最右的推导序列 LR分析法就是会给出一种能根据当前分析栈中的符号串和向右顺序查看输入串中的k(k>=0)个符号就可以唯一...

2018-06-12 15:22:12

阅读数:58

评论数:0

LL(1)文法的递归预测分析法和非递归预测分析法

关于递归的预测分析法,可以先看下下面的示例图如果是非递归的预测分析法,预测分析器由一个输入带,读头和一个带有预测分析表的控制器构成,从下面这样的自动机的构造来看其实和有穷自动机的构造是相似的,有穷自动机就是一个状态遇到输入符号然后去改变状态,和有穷自动机不同的就是增加了一个栈也叫做下推存储器起到记...

2018-06-11 14:48:02

阅读数:297

评论数:0

自顶向下语法分析概述

自顶向下分析方法也称为面向目标的分析方法,也就是从文法的开始符号出发企图推导出与输入单词符号串完全相匹配的句子 按照分析树的构造方向,我们可以把语法分析分为两类 第一类就是从顶部的根节点向底部的叶节点方向构造分析树,这种方法就是自顶向下的语法分析 第二类就是从底部的叶节点向顶部的根节...

2018-06-06 18:55:42

阅读数:49

评论数:0

lex识别变量以及遇到的坑

首先我们去写一个lex的描述文件 %% "LET" {printf("Keyword");} [0-9A-Fa-f]+H { printf("Number"); } [A-Za-z][...

2018-06-06 16:38:00

阅读数:300

评论数:0

词法分析程序统计字符和行数

利用lex的工具进行词法分析程序统计字符和行数,首先我们要先去写一个lex描述文件,设置辅助定义部分,规则部分和用户子程序部分,其中lex工具是一个词法分析程序的自动构造工具 lex描述文件部分如下所示 %{ int num_lines=0,num_chars=0; %} ...

2018-06-04 18:18:35

阅读数:110

评论数:0

将NFA转换为等价的DFA

设L为一个由不确定的有穷自动机接受的集合,则存在一个接受L的确定的有穷自动机,将NFA转换为接受同样语言的DFA的算法叫作子集法 在正式介绍之前,我们要熟悉下一些概念,状态集合I的ε-闭包,表示为ε-closure(I),定义为一个状态集,是状态集I中的任何状态S经任意条ε弧而能到达的状态...

2018-06-03 20:58:07

阅读数:165

评论数:0

词法分析

词法分析其实是编译的第一个阶段,它的主要任务就是从左到右逐个字符地对源程序进行扫描,会去产生一个一个单词序列,用于语法分析。执行词法分析的程序称为词法分析程序或者是扫描程序 词法分析工作可以是独立的遍历一遍源程序,把字符流的源程序变成单词序列,输出到一个中间文件,这个文件作为语法分析程序...

2018-06-02 19:53:10

阅读数:207

评论数:0

提示
确定要删除当前文章?
取消 删除
关闭
关闭