
编译
rv0p111
之前由于一些原因博客没有更新,现在还是正常更新,继续分享..
展开
-
词法分析
词法分析其实是编译的第一个阶段,它的主要任务就是从左到右逐个字符地对源程序进行扫描,会去产生一个一个单词序列,用于语法分析。执行词法分析的程序称为词法分析程序或者是扫描程序词法分析工作可以是独立的遍历一遍源程序,把字符流的源程序变成单词序列,输出到一个中间文件,这个文件作为语法分析程序的输入而继续编译过程。不过更一般的情况就是将词法分析程序设计成一个子程序,每当语法分析程序需要一个单词...原创 2018-06-02 19:53:10 · 3476 阅读 · 0 评论 -
LLVM简单介绍
LLVM全称为Lower Level Virtual Machine,最初是以C/C++为编译目标,现如今LLVM已经能够为ActionScript、D、Fortran、Haskell、Java、Objective-C、Swift、Python、Ruby、Rust、Scala等众多语言提供了编译支持,有一些新兴的语言就直接使用LLVM作为后端编译简单来说其实就是把人类可读的高级语言映射...原创 2018-06-17 12:37:45 · 1659 阅读 · 0 评论 -
基于LLVM的Pass优化
当我们如果完成了对源码的转换,得到了LLVM的IR表示形式,它是作为一种向汇编代码转换的一个公共平台,依赖不同的后端会得到不同的汇编码,在转换为汇编码之前,如果我们对IR进行优化的话就可以得到执行效率更高的代码在LLVM的架构当中,Pass的作用就是优化LLVM IR,Pass作用于LLVM IR,用来处理IR,分析IR,寻找优化的机会并修改IR,从而产生优化的代码。在下面命令行工具o...原创 2018-06-29 12:12:31 · 2740 阅读 · 0 评论 -
Clang的不同作用
clang编译器可以拿来作为预处理器、编译器驱动、前端以及代码生成器使用,它的输出是取决于你指定的参数的接下来我们写下如下的代码#include<stdio.h>int main(){ printf("Hello World\n"); return 0;}使用下面的命令可以生成可执行文件,clang可以用作编译器驱动,编译得到可执行文件a.ou...原创 2018-06-17 19:30:09 · 1426 阅读 · 0 评论 -
基于LLVM-自定义Pass
首先我们要先去编写一个 FuncBlockCount.c文件#include &amp;quot;llvm/IR/Function.h&amp;quot;#include &amp;quot;llvm/Pass.h&amp;quot;#include &amp;quot;llvm/Support/raw_ostream.h&amp;quot;//引入llvm命名空间,可以让其实用LLVM当中的函原创 2018-06-29 14:46:25 · 1461 阅读 · 0 评论 -
基于LLVM-for循环结构的支持
循环结构通常需要先初始化一个归纳变量,然后之后就要对这个变量做更新(增加或减少其数值),以及一个表示循环结束的终止条件,我们的for循环可以定义如下所示,其中i=1表示的是条件、idef printstar(n x) for i = 1, i &lt; n, 1.0 in x + 1 还是一样的我们先去配置tokenenum Token_Type { ...原创 2018-06-25 13:23:15 · 1858 阅读 · 4 评论 -
简易C++词法分析程序
词法分析往往是编译程序的第一步,词法分析器会把程序代码的输入流切分为token,然后语法分析器会接受这些token,并且去把token流构建成AST(抽象语法树),一般来说,被解析成token的语言是基于上下文无关语法的,一个token可以是一个字符串,由一个或者多个同一范畴的字符组成 输入字符流构成token的过程称为符号化,我们如果要把输入的字符分组成token,还需要有特定的分界符...原创 2018-06-18 14:48:59 · 1347 阅读 · 0 评论 -
基于LLVM-分析Pass的制作
分析Pass在实际不修改IR的情况下提供关于IR的更高级的信息,而这些信息可以被其他的分析Pass使用来计算其结果,只要一个分析的Pass计算得出了结果,这个计算结果可以被不同的Pass拿来多次使用,直到一个Pass改变了这个IR我们先编写下我们需要去进行测试的代码int func(int a,int b){ int sum=0; int iter; fo...原创 2018-06-29 19:36:28 · 867 阅读 · 0 评论 -
定义抽象语法树结构
有的时候真的觉得技术更新换代的太快以致于有些版本不同就会很容易的造成很多错误的产生..历经九九八十一难,才可以成功一个技术点…下面就简单的讲下抽象语法树的一些概念和定义其的具体结构 抽象语法树是一门编程语言源码的抽象语法结构的树形表示各种语言组件,例如表达式、条件控制语句等,都有相应的AST,并被区分为操作符和操作数AST并不表示这些代码如何生成,而是表达了语言组件之...原创 2018-06-19 16:46:06 · 2437 阅读 · 0 评论 -
语法分析器的基本要素
语法分析是编译的第二个阶段,语法分析的基本任务就是根据指定的文法识别输入的句子当中的各类短语并构造它的分析树,其实也就是识别由词法分析给出的单词符号串是否是给定文法的正确句子(程序)语法分析器根据语言的语法规则来解析代码,解析阶段决定了输入的代码是否能够根据既定的语法组成token流语法分析器则会定义一些函数来把代码组织成一种被称为AST的数据结构。解析器可以采用递归下降的解析技术...原创 2018-06-19 17:59:20 · 1378 阅读 · 0 评论 -
为AST类定义IR代码的生成
上次说到的是现在所有的必要的信息都是存储在AST这一个数据结构当中,下一个阶段就是从AST中生成的LLVM IR在代码的生成的过程当中,我们可以去使用LLVM的API,通过内建的API可以生成预定义格式的LLVM IR我们需要在BaseAST类和其的子类当中去添加Codegen函数,因为我们需要去生成其的中间表示形式的代码,其中在有些子类当中的Codegen函数的返回值是LLVM Va...原创 2018-06-19 23:28:13 · 3136 阅读 · 0 评论 -
基于LLVM-自定义二元运算符的重载
下面就简单的介绍下,我们去构造 | (逻辑或运算符)作为样例,TOY语言当中的 | 运算符是这样使用的,其中前面的binary代表的是标识符,代表的是二元运算符的表示,然后后面就是| 运算符,再就是(LHS RHS) 根据这两个参数进行选择def binary | 5 (LHS RHS)if LHS then1else if RHS then1else0;这段代码的意思...原创 2018-06-27 22:40:39 · 588 阅读 · 0 评论 -
基于LLVM-处理if/then/else结构
感觉自己这个辣鸡,深入怕是难度太大,还是先简单的介绍下上层的使用吧,这里的讲解还是基于之前所讲的来的,我们主要进行某些方法的改动以及另一个AST类的添加和解析首先我们如果要去添加对if、else、then的判断,那么我们的token的解析肯定是要有的,所以我们需要在枚举类型当中去添加它们相应的token,这样方便判断enum Token_Type { EOF_TOKEN...原创 2018-06-24 11:50:36 · 2230 阅读 · 0 评论 -
程序设计语言及其文法
编译器要对高级语言进行词法语法等分析,要想让计算机能够自动的分析语言 要把语言学知识文法提供给计算机,文法也就是文章的书写法规,一般用来指以文字、词语、短句、句子的编排而组成的完整语句和文章的合理性组织计算机中如何表示语言和它的文法英语是由句子组成的集合,而句子又是由单词和标点符号组成的序列程序设计语言Pascal或者是C语言是由一切Pascal或者是C程序所组成的集合,而程...原创 2018-05-31 21:40:15 · 2690 阅读 · 0 评论 -
自顶向下语法分析概述
自顶向下分析方法也称为面向目标的分析方法,也就是从文法的开始符号出发企图推导出与输入单词符号串完全相匹配的句子 按照分析树的构造方向,我们可以把语法分析分为两类第一类就是从顶部的根节点向底部的叶节点方向构造分析树,这种方法就是自顶向下的语法分析第二类就是从底部的叶节点向顶部的根节点构造分析树,这种方法就是自底向上的分析方法给定一棵分析树,对应的推导可能不是唯一的,因为在...原创 2018-06-06 18:55:42 · 1575 阅读 · 0 评论 -
将NFA转换为等价的DFA
设L为一个由不确定的有穷自动机接受的集合,则存在一个接受L的确定的有穷自动机,将NFA转换为接受同样语言的DFA的算法叫作子集法 在正式介绍之前,我们要熟悉下一些概念,状态集合I的ε-闭包,表示为ε-closure(I),定义为一个状态集,是状态集I中的任何状态S经任意条ε弧而能到达的状态集合。状态集合I的α弧转换,表示为move(I,α),定义为状态集合J,其中J是所有那些可以从I中的某...原创 2018-06-03 20:58:07 · 3213 阅读 · 1 评论 -
LL(1)文法的递归预测分析法和非递归预测分析法
关于递归的预测分析法,可以先看下下面的示例图如果是非递归的预测分析法,预测分析器由一个输入带,读头和一个带有预测分析表的控制器构成,从下面这样的自动机的构造来看其实和有穷自动机的构造是相似的,有穷自动机就是一个状态遇到输入符号然后去改变状态,和有穷自动机不同的就是增加了一个栈也叫做下推存储器起到记忆的作用,因此这个自动机也叫做下推自动机下推自动机比有穷自动机的识别能力更强,有穷自动机的识别能力不强...原创 2018-06-11 14:48:02 · 6854 阅读 · 0 评论 -
词法分析程序统计字符和行数
利用lex的工具进行词法分析程序统计字符和行数,首先我们要先去写一个lex描述文件,设置辅助定义部分,规则部分和用户子程序部分,其中lex工具是一个词法分析程序的自动构造工具 lex描述文件部分如下所示%{ int num_lines=0,num_chars=0;%}%%\n {++num_lines;++num_chars;}. {++num_chars;}%...原创 2018-06-04 18:18:35 · 2253 阅读 · 0 评论 -
LR分析法
LR文法是最大的、可以构造出相应的移入-归约语法分析器的文法类,其中L表示的是对输入进行从左到右的扫描,而R代表的就是反向构造出一个最右的推导序列 LR分析法就是会给出一种能根据当前分析栈中的符号串和向右顺序查看输入串中的k(k&amp;gt;=0)个符号就可以唯一地确定分析器的动作是移入还是归约和用哪个产生式进行归约LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程...原创 2018-06-12 15:22:12 · 1955 阅读 · 0 评论 -
文法和语言
一个程序设计语言其实就是一个记号系统,和自然语言一样,它的完整定义包括语法和语义两方面。一个语言的语法是指一组规则,用它可以形成和产生一个合适的程序。语法只是定义什么样的符号序列是合法的 用上下文无关法作为程序设计语言语法的描述工具,目前较为广泛使用的,就比如说我们可以定义符号串A:= B + C,是一个合乎语法的赋值语句,但是如果B是实型的,C是布尔型的,或者B、C中任何一个...原创 2018-05-29 23:27:23 · 1085 阅读 · 0 评论 -
PL/0语言编译系统
PL/0语言编译系统是世界著名科学家N.Wirth 编写的,它是由编译程序和解释程序两部分组成的,PL/0编译程序的源语言为PL/0,目标语言是一个类P-code的代码PL/0语言编译系统由编译程序和解释程序两部分组成,分别称为PL/0编译程序和类P-code解释程序。PL/0语言程序会被PL/0编译程序转换为等价的类P-code程序,当编译程序正常结束的时候,PL/0语言编译系统会调...原创 2018-05-28 18:29:15 · 6189 阅读 · 1 评论 -
处理源程序的软件工具
目前我们都是基于IDE进行开发的,在IDE当中集成了编译程序,编译程序本身就是一种软件开发工具,有了编译程序我们才可以使用编程效率高的高级语言来编写程序 很多软件工作人员研发了很多针对源程序进行处理的软件工具,这些软件工具要像编译程序那样对源程序进行分析,下面就拿Xcode举例子1、语言的结构化编辑器 结构化编辑器不仅具有通常的正文编辑器的正文编辑和修改功能,而且还能像编...原创 2018-05-28 15:00:07 · 1152 阅读 · 0 评论 -
编译程序和解释程序
编译程序是一个语言处理程序,它可以把高级语言程序给翻译成某个机器的汇编语言程序或者是二进制代码程序,这个阶段叫做编译阶段,需要注意的是编译和运行是两个分开的阶段,也就是说我程序必须要全部翻译完毕之后,才能运行。但是在一个交互环境当中,并不需要将两个阶段给分开,也就是我们在使用解释程序的时候,它不需要在运行前就去把源程序翻译成目标代码,也可以在某台机器上运行程序,并生成结果解释程序会去接...原创 2018-05-28 14:15:28 · 6677 阅读 · 0 评论 -
词法分析、语法分析、语义分析
这里就是拿翻译句子来举例子,从英语翻译到汉语,我们需要分析句子的语义,要划分句子的成分要想进行语义分析就要划分句子成分,比如说划分为人、铁锤、窗户等等我们要想划分句子当中的各类成分,就要用语法分析来识别出句子中的各类短语,这个过程称之为语法分析根据词性来识别出句子中的各类短语,这一过程称之为词法分析其实关于词法分析、语法分析、语义分析我们可以这样理解,就好比我们要翻译一句英文,先要分析单词的词性比...原创 2018-05-27 23:35:09 · 16679 阅读 · 0 评论 -
编译的那些事
一、简单介绍首先我们先了解下什么是编译,编译其实简单来说就是把我们写的高级代码,翻译成另一种语言(称为目标代码)。而编译是由编译程序来做的,很多计算机都配有不止一种高级语言的编译程序,编译程序又可以理解为语言翻译程序。编译程序的好处 有了编译程序的存在可以使得程序员不必去考虑与机器有关的琐碎的细节,这对于当今机器的数量和种类持续不断地增长的年代是很重要的,如果没有编译程序,我们就需...原创 2018-04-15 20:40:26 · 522 阅读 · 0 评论 -
文法分类
首先先简单的介绍下两个概念 语言是由文法描述的,文法使用有限的规则将无限的语言描述出来 语言的形式化定义:由文法 G 的开始符号 S 推导出的所有句子构成的集合称为文法 G 生成的语言,记作 L(G)接下来讲下文法的分类 文法分为0型文法、1型文法、2型文法、3型文法0型文法只需要对α有要求 至少包含1个非终结符 1型文法在0型文法的基础上进一步的要...原创 2018-05-30 19:27:24 · 3410 阅读 · 0 评论 -
lex识别变量以及遇到的坑
首先我们去写一个lex的描述文件%%"LET" {printf("Keyword");}[0-9A-Fa-f]+H { printf("Number"); }[A-Za-z][A-Za-z0-9]* { printf("Identifier");}"=" { printf("Operator"); }. {}%% 这里需要注意的是如果我们把LET放在第一行是没问原创 2018-06-06 16:38:00 · 5052 阅读 · 0 评论 -
基于LLVM-增加JIT支持
JIT其实就是Just-In-Time也就是即时编译,在程序运行的时候会将代码翻译成机器码并且去执行,与之相对的就是AOT(Ahead Of Time),它在程序运行之前就会将代码翻译成机器码,JIT结合了AOT和解释执行的优势,它能够产生高效的机器码,并且具备足够的灵活性首先我们定义一个执行引擎作为全局静态变量static ExecutionEngine *TheExecutio...原创 2018-06-28 10:24:39 · 2098 阅读 · 0 评论