原创

《编译原理》第一章总结

读万卷书
9 条评论
11 人喜欢
363 次阅读
全文共 943 预计阅读时长 4 分钟

还在丰富中…(可以和Babel,TSC等流程作对比)

目标

  1. 了解不同形式的语言处理器
  2. 了解编译器的结构和编译过程

内容笔记

语言处理器的不同形式

编译器

源程序 => 编译器 => 目标程序

将源程序翻译成一个等价的目标程序,重在等价的翻译,并且需要在翻译的过程中指出源程序中的错误

解释器

输入 => 解释器 => 输出

对输入执行指定的操作,从而得到输出

二者的不同:
编译器:旨在将源程序等价转换成目标程序,类似于JS中的Babel,TSC等,(翻译+语法报错)
解释器:旨在执行,并不进行翻译,类似于JS Engine,(执行+运行时报错)

编译器结构和编译过程

结构

大体可分为三个部分:分析(analysis),优化(optimize),合成(synthesis),其中优化部分是可选的,不过目前绝大部分编译器都会包含这部分

编译过程

过程大致可以分为以下几个步骤:

https://static.jooger.me/img/undefined136356109_1552499343275.png

过程中编译器会记录源程序中使用的变量名,并且收集和变量名有关的各种属性(包括类型、作用域、存储分配、参数数量和类型、参数传递方式,返回值类型等),然后生成符号表

词法分析

英文名为lexcial analysis,又称扫描(scanning),不过在JS中通常称为分词(tokenizer)

源程序字符流 => 词法分析 => 词素(lexeme)序列

对于每个词素,词法分析器产生如下格式的词法单元(token)作为输出:

<token-name, attribute-value>
  • token-name:由语法分析步骤使用的抽象符号
  • attribute-value:符号表中关于这个词法单元的条目

应该是像babel转换过程中出现的{ type: 'paren', value: ’(‘}这种,paren就相当于token-name,value就相当于符号表[attribute-value]

语法分析

英文名为syntax analysis,又称解析(parsing)

token序列 => 语法分析 => 语法树(syntax tree)
语义分析

英文名为semantic analyzer

语法树 => 语义分析(收集信息) => 语法树

利用语法分析得出的语法树和符号表中的信息来检查源程序是否和语言定义的语义一致,同时它也收集类型信息,并且把这些信息放到语法树或者符号表中,以便后续中间代码生成

中间代码生成
语法树 => 中间代码生成 => 中间代码

在语义分析完后,很多编译器会生成一个明确的低级的或类机器语言的中间代码,这些中间代码需要具备两个重要的性质:

  • 易于生成
  • 能够被轻松地翻译为目标程序所使用的语言
代码优化
中间代码 => 语法树优化 => 更易生成目标代码的中间代码

代码优化步骤试图该表中间代码,以便生成更好的目标代码。需要满足以下设计目标:

  • 优化必须是正确的,即不能改变编译程序的含义
  • 优化必须能够改善很多程序的性能
  • 优化所需要的时间必须保持在合理的范围内
  • 所需要的工程方面的工作必须是可管理的
代码生成

codegen

中间代码 => codegen => 目标代码

以中间代码为输入,生成目标代码

QA

Q:语法分析和语义分析有什么区别?
A:语法分析会生成语法树,而语义分析则更偏向于类型检查和收集信息,相当于一个检查步骤

相关文章
9 条评论
中国  -  杭州市 Mac OS X Chrome | 75

<img src="null" onerror="alert('查看图片')">

回复
中国  -  九江市 Windows 7 Mozilla FireFox | 61.0

哇,技术大牛,这都能解决,厉害

回复
中国  -  成都市 Windows 10 Chrome | 70

大佬

回复
中国  -  杭州市 Mac OS X Chrome | 72

来大佬博客观摩学习,准备大佬的界面改写下自己的 😉

5条回复