# article_articlepost

title: 测试文章（编译原理与技术笔记一）
summary: 用于测试，（编译原理与技术笔记一）
created: 2021-07-18 13:25:26.584815
updated: 2021-07-18 13:25:26.584815
avatar: article/20210718/16210519961.jpg
body:
  # 绪论

  ## 1.0 主要内容

  - 词法分析
  - 语法分析
  - 属性文法与语法制导翻译
  - 语义分析与中间代码生成
  - 符号表与运行时存储空间组织
  - 优化

  ## 1.1 什么是编译

  ### 语言分层

  - 高级语言

    > 类似于数学定义或自然语言的简洁形式，不依赖于特定机器，通过编译转为汇编语言或直接编译转为机器语言

  - 汇编语言

    > 引入助记符，依赖于特定机器，通过汇编Assembling转为机器语言

  - 机器语言

  #### 编译

  > 将高级语言翻译成汇编语言或机器语言的过程

  ### **编译器在语言处理系统中的位置**

  ***源程序***-(预处理器)->***经过预处理的源程序***-(编译器)->**汇编**-(汇编器)->***可重定位的机器代码***->(链接器linker/加载器loader)->***目标机器代码***

  #### 预处理器

  1. 把存储在不同文件中的源程序聚合在一起

  2. 把被称为宏的缩写语句转换为原始语句

  #### 可重定位

  > 在内存中存放的起始位置不是固定的

  起始位置+相对地址=绝对地址

  #### 加载器

  修改可重定位地址；将修改后的指令和数据放到内存中适当的位置

  #### 链接器

  将多个可重定位的机器代码文件（包括库文件），连接到一起

  解决外部内存地址问题

  ## 1.2 编译系统的结构

  ***源语言句子***-(分析源语言)->***句子的语义***-(生成目标语言)->***目标语言句子***

  ### 语义分析：分析源语言

  类似分出主谓宾

  #### 语义：一种中间表示，独立于具体的语言

  #### 语法分析：分析语法后，再分析语义

  > 例如：in the room，是状语，分析语法得到in是介词，the是冠词，room是名词

  #### 词法分析：分析词法后，再分析语法

  <img src="https://shellmia0-blog-1304113800.cos.ap-beijing.myqcloud.com/image-20210319105922802.png" alt="image-20210319105922802" style="zoom:50%;" />

  <img src="https://shellmia0-blog-1304113800.cos.ap-beijing.myqcloud.com/image-20210319105938354.png" alt="image-20210319105938354" style="zoom:50%;" />

  <img src="https://shellmia0-blog-1304113800.cos.ap-beijing.myqcloud.com/image-20210319105948476.png" alt="image-20210319105948476" style="zoom:50%;" />

  ### 编译器的结构

  ![image-20210319110010711](https://shellmia0-blog-1304113800.cos.ap-beijing.myqcloud.com/image-20210319110010711.png)

  ![image-20210319110147842](https://shellmia0-blog-1304113800.cos.ap-beijing.myqcloud.com/image-20210319110147842.png)

  ## 1.3 词法分析

  ### 主要任务

  从左向右逐行扫描源程序的字符，识别出各个单词，确定单词的类型。将识别出的单词转换成统一的机内表示——词法单元（token）格式

  token：<种别码，属性值>

  ![image-20210319110551106](https://shellmia0-blog-1304113800.cos.ap-beijing.myqcloud.com/image-20210319110551106.png)

  ![image-20210319110609049](https://shellmia0-blog-1304113800.cos.ap-beijing.myqcloud.com/image-20210319110609049.png)

  #### 如何实现词法分析？

  ## 1.4 语法分析

  ### 主要任务

  语法分析器(parser)从词法分析器输出的token序列中识别出各类短语，并构造语法分析树(parse tree)

  ![image-20210319110810504](https://shellmia0-blog-1304113800.cos.ap-beijing.myqcloud.com/image-20210319110810504.png)

  ![image-20210319110930419](https://shellmia0-blog-1304113800.cos.ap-beijing.myqcloud.com/image-20210319110930419.png)

  #### 如何根据语法规则为输入句子构造分析树？

  ## 1.5 语义分析

  ### 主要任务

  #### 收集标识符的属性信息

  - 种属(kind)

    > 简单变量、复合变量（数组、记录、···）、过程、···

  - 类型

    > 整型、实型、字符型、布尔型、指针型、···

  - 存储位置、长度

    > 相对地址、长度啥的

  - 值

  - 作用域

  - 参数和返回值信息

    > 参数个数、参数类型、参数传、返回值类型、···
    >
    > ![image-20210319112225142](https://shellmia0-blog-1304113800.cos.ap-beijing.myqcloud.com/image-20210319112225142.png)

  #### 语义检查

  - 变量或过程**未经声明就使用**
  - 变量或过程名**重复声明**
  - **运算分量**类型不匹配
  - **操作符**与**操作数**之间的类型不匹配
    - **数组下标**不是整数
    - 对**非数组变量**使用数组访问操作符
    - 对**非过程名**使用过程调用操作符
    - 过程调用的**参数类型或数目**不匹配
    - 函数**返回类型**有误

  ## 1.6 中间代码生成和编译器后端

  ### 常用的中间表示形式

  #### 三地址码(three-address code)_线性结构

  > 三地址码由类似于汇编语言的指令序列组成，每个指令最多有三个操作数（operand）![image-20210319113842131](https://shellmia0-blog-1304113800.cos.ap-beijing.myqcloud.com/image-20210319113842131.png)

  ##### 三指令指令的表示

  - 四元式(Quadruples)

    > - （op,y,z,x）
    > - ![image-20210319114123684](https://shellmia0-blog-1304113800.cos.ap-beijing.myqcloud.com/image-20210319114123684.png)

  - 三元式(Triples)

  - 间接三元式(Indirect triples)

  #### 语法结构树/语法树(syntax trees)_树形结构

  ![image-20210319115131269](https://shellmia0-blog-1304113800.cos.ap-beijing.myqcloud.com/image-20210319115131269.png)

  ### 目标代码生成器

  以源程序的***中间表示形式***作为输入，并把它映射到***目标语言***

  目标代码生成的一个重要任务是为程序中使用的变量***合理分配寄存器***

  ### 代码优化

  为改进代码所进行的程序变换，使其运行快一些、占用空间少一些

  ### 一个结构

  <img src="https://shellmia0-blog-1304113800.cos.ap-beijing.myqcloud.com/image-20210319115513841.png" alt="image-20210319115513841" style="zoom:33%;" />

  ### 遍或趟(pass)

  对源程序或源程序的中间结果从头至尾扫描一次，并作有关的加工处理，生成新的中间结果或目标程序的处理过程成为一遍

  > 可以把一个阶段分为若干遍，也可以把多个阶段合为一遍，通常有一遍和多遍编译程序

  ## 完


# comment_comment

created: 2021-07-18 12:48:24.067339
updated: 2021-07-18 12:48:24.067339
body:
  <p><img alt="smiley" height="23" src="http://127.0.0.1:8000/static/ckeditor/ckeditor/plugins/smiley/images/regular_smile.png" title="smiley" width="23" /></p>


# django_session

session_key: f5sq44p8j53c0rh8iq3r3xs67tx1mb71
expire_date: 2021-08-01 12:46:10.913464
session_data:
  .eJxVjDsOwjAQBe_iGlmx119Kes4Q7Xo3OIAcKZ8KcXeIlALaNzPvpXrc1tpvi8z9yOqsjDr9boTlIW0HfMd2m3SZ2jqPpHdFH3TR14nleTncv4OKS_3WXUcUM4DPXoKlAmQIBJwPPmEYBDBLLM6kkBziYCOngOgys1CEzqr3B9YdN9U:1m56BO:H4tusF7ARZR1vaTmIOsGNoIZnrLTEoVoSdLDiPe0EUw


