美文网首页
编译原理 -- 编译以及编译过程

编译原理 -- 编译以及编译过程

作者: 羽裳有涯 | 来源:发表于2019-11-12 15:15 被阅读0次

前言

为了了解编译器是什么? 为什么需要编译器?

编译器、高级语言、源代码、机器语言

  • 编译器:首先也是一种电脑程序。它会将用某种编程语言写成的源代码(原始语言),转换成另一种编程语言(目标语言)。
  • 高级计算机语言便于人编写,阅读,维护
  • 低阶机器语言是计算机能直接解读、运行的
  • 编译器主要的目的是将便于人编写,阅读,维护的高级计算机语言所写作的源代码,翻译为计算机能解读、运行的低阶机器语言的程序
  • 编译器原始程序(Source program)作为输入,翻译产生使用目标语言(Target language)的等价程序。
  • 源代码一般为高阶语言 (High-level language), 如Pascal、C、C++、C# 、Java 等,而 目标语言则是汇编语言目标机器的目标代码(Object code),有时也称作机器代码(Machine code)。

编译器的各步骤

image.png

名称解释

- 词法分析
  • 编译器的第一个步骤称为词法分析或扫描.
  • 词法分析器读入组成源程序的字符流,并将其组成有意义的词素的序列。形如<token-name, attribute-value>这样的词法单元。(token-name是由语法分析使用的抽象符号,attribute-value是指向符号表中关于这个词法单元的条目,符号表条目的信息会被语义分析和代码生成步骤使用)

例如源程序包含如下赋值语句:position = initial + rate * 60
对其进行词法分析:


经过词法分析之后,赋值语句的词法单元序列:<id, 1> < = > <id, 2> < + > <id, 3> < * > <60>
  • 1、语法是语言学的一个分支,研究按确定用法来运用的词类、词的屈折变化或表示相互关系的其他手段以及词在句中的功能和关系。包含词的构词、构形的规则和组词成句的规则。
    举个例子:我是人;他学习汉语;你爬山...........这样的句子有千千万万。那么人们会总结出来:主语+谓语+宾语 这样的语法规则来。由于计算机的特殊性,因此计算机的语法逻辑性更强,更注重算术和表达式等。所以就没有那么简单的“主谓宾”,我们看的更多的可能类似 x = y + 1,等;
  • 2、文法:自然语言汉语中的意思
    1.法制;法规。
    2.文章的作法。
    3.语法。语言的结构方式。包括词的构成和变化﹐词组和句子的组织。

文法即文章的书写法规,一般用来指以文字、词语、短句、句子的编排而组成的完整语句和文章的合理性组织。
文法即语言中的每个句子可以用严格定义的规则来构造.


2.语法分析

编译的第2个步骤称为语法分析解析
语法分析器使用由词法分析器生成的各词法单元的第一个分量来创建树形的中间表示。该中间表示给出了词法分析产生的词法单元的语法结构。常用的表示方法是语法树,树中每个内部节点表示一个运算,而该节点的子节点表示运算的分量。

以上赋值语句表示成语法树:


3.语义分析

数据的含义就是语义
简单的说,数据就是符号。数据本身没有任何意义,只有被赋予含义的数据才能够被使用,这时候数据就转化为了信息,而数据的含义就是语义)

语义分析器使用语法树符号表中的信息来检查源程序是否和语言定义的语义一致 。它同时收集类型信息,并存放在语法树符号表中,以便在中间代码生成过程使用。

语义分析的一个重要部分就是类型检查
强类型语言:比如很多语言要求数组下标必须为整数,如果使用浮点数作为下标,编译器就必须报错。
弱类型语言:很多语言允许某些类型转换,称为自动类型转换。

上图例子中显示了一个这样的自动类型转换,假设position,initial和rate已经被声明为浮点型,而词素60是一个整数。语义分析器输出中有一个inttofloat的额外节点,明确的把60转换为一个浮点数。

4.中间代码生成

源程序翻译成目标代码的过程中,一个编译器可能构造出一个或多个中间表示。这些中间表示可以有多种形式。语法树是一种中间表示形式,它们通常在语法分析和语义分析中使用。

源程序语法分析语义分析完成之后(也会生成中间表示,区别语法树),很多编译器生成一个明确的低级的或类机器语言的中间表示。该中间表示有两个重要的性质:1.易于生成;2.能够轻松地翻译为目标机器上的语言。

5.代码优化

代码优化试图改进中间代码,以便生成更好的目标代码。即更快(省时),更短(省空间)或能耗更低。

6.代码生成

代码生成中间表示形式作为输入,并把它映射为目标语言。如果目标语言是机器代码,则必须为每个变量选择寄存器或内存位置中间指令则被翻译为能够完成相同任务的机器指令序列

参考:
编译原理学习(一)--编译以及编译过程

相关文章

  • 编译原理 -- 编译以及编译过程

    前言 为了了解编译器是什么? 为什么需要编译器? 编译器、高级语言、源代码、机器语言 编译器:首先也是一种电脑程序...

  • Xcode编译原理

    Xcode编译原理 1.xcode 编译的过程 源文件.c --> 编译 --> 目标文件.o --> 链接 --...

  • Swift5.1 学习笔记(一)

    基础语法以及汇编原理 oc与swift汇编的区别 编译分为前端编译、后端编译。下面的图就描述了oc和swift编译...

  • 深入理解JVM,类加载机制ClassLoader流程

    编译原理请查看之前内容,.java文件编译过程和执行过程分析以及计算机简单认识 需要了解更多Java原创资料,请加...

  • 2019-02-28

    iOS APP 的编译以及运行原理,相关文章: Build过程 编译器 Mach-O 可执行文件 趣探 Mach-...

  • iOS App 编译过程

    这篇文章是对于自己学习 App编译过程的一个总结 学习的相关文章 iOS App的编译过程iOS 编译过程的原理和...

  • 编译原理

    编译原理 标签(空格分隔): 编译原理 编译和解释 编译 整个程序全部翻译结束之后,程序才能开始运行;编译和运行是...

  • iOS App编译和启动原理

    编译原理: 将编译过程分为前端和后端两部分处理 Clang(编译器前端):GCC的替代品,Clang的编译速度比G...

  • iOS的编译原理和应用

    iOS的编译原理和应用 什么是编译和编译器 在一般的编程过程中,都要先编译再执行。所谓编译就是把C语言等编程语言编...

  • 《你不知道的JavaScript(上)-作用域和闭包》学习笔记

    1.编译原理: (1)编译器、作用域、引擎 编译器会忽略重复声明 编译原理(p7): 例如:var a=2,编译器...

网友评论

      本文标题:编译原理 -- 编译以及编译过程

      本文链接:https://www.haomeiwen.com/subject/xurfictx.html