编译器架构Compiler Architecture(下)
编译器架构Compiler Architecture(下)
Combining Scanning and Parsing
实际上没有必要将扫描(词法分析/标记化)与解析(语法分析/树生成)分开。基于PEGs的系统,比如Ohm,实际上是无扫描的:它们以一种预测的方式执行解析,将词汇和语法规则混合在一起。(但是,像Ohm这样的系统需要一个预解析阶段来处理缩进和凹陷。)
当使用无扫描系统时,语言设计者和编译器编写者仍然会考虑符号和短语,但不必担心像所谓的最大Munch原则这样的复杂规则。Lookahead捕获您需要的任何类型的标记化方案。此外,无扫描解析的预测性意味着我们不必确定*是一元运算符指针解引用令牌,还是二进制乘法运算符令牌或星形令牌。在进行预测性分析时,我们总是有上下文。
Semantic Analysis
在语义分析过程中,我们必须检查合法性规则,同时,我们将语法树的片段(通过解析标识符引用、为隐式强制插入强制转换操作等)捆绑起来,形成一个语义图。
继续上面的例子:
显然,每种语言的合法性规则是不同的。您可能会在类似Java的语言中看到的合法性规则示例包括:
一个范围内的变量的多个声明
在变量声明之前引用它
引用没有声明的标识符
违反访问(公共、私有、受保护等)规则
方法调用中的参数太多
方法调用中没有足够的参数
类型不匹配(有很多这样的情况)
练习:列举以上每一个例子。
在此阶段发生的错误称为静态语义错误。
练习:Pascal语言在表达式方面有一种不同寻常的语法:它赋予and运算符(需要布尔操作数)比关系运算符更高的优先级!说明这意味着表达式x-4<=5和2<y是静态语义错误。
中间代码生成Intermediate Code Generation
中间代码生成器生成一个流图,由分组到基本块中的元组组成。对于上面的例子,我们可以看到:
可以在其他地方阅读更多关于中间表示的内容。
Machine Independent Code Improvement
对语义图或中间代码进行的代码改进称为与机器无关的代码优化。在实践中,有无数已知的优化(er,改进),但没有一个真正适用于我们的运行示例。
Code Generation
代码生成产生实际的目标代码,或者类似的代码。这是我在使用面向x86-64的gcc 6.3进行组装时得到的结果,没有任何优化:
以下是ARM的代码,使用gcc 5.4,无需优化:
MIPS代码,gcc 5.4也未优化:
Machine Dependent Code Improvement
通常编译的最后阶段是清理和改进目标代码。对于上面的例子,我在将优化级别设置为-O3时得到了如下结论:
Optimized ARM code:
Optimized MIPS code:
编译器架构Compiler Architecture(下)的更多相关文章
- 编译器架构Compiler Architecture(上)
编译器架构Compiler Architecture(上) 编译器是程序,通常是非常大的程序.它们几乎都有一个基于翻译分析综合模型的结构. CONTENTS Overview • Compiler C ...
- NVIDIA Turing Architecture架构设计(下)
NVIDIA Turing Architecture架构设计(下) GDDR6 内存子系统 随着显示分辨率不断提高,着色器功能和渲染技术变得更加复杂,内存带宽和大小在 GPU 性能中扮演着更大的角色. ...
- 微内核架构(Microkernel Architecture)
微内核架构(Microkernel Architecture) 微内核架构有时也被成为插件架构模式(plug-in architecture pattern),通常用于实现基于产品的应用,如Eclip ...
- 事件驱动架构 (Event-Driven Architecture,EDA) 简介
EDA 是一种侧重于以生成/消费为基础的异步通信的架构模式.这主要对照于传统的基于线程的同步系统. EDA 是一种以事件 (event)为核心,提供事件产生,路由,消费已经结果回调等机制的架构模式. ...
- TOGAF架构内容框架之架构制品(下)
TOGAF架构内容框架之架构制品(下) 4.2.31 数据生命周期图(Data Lifecycle Diagram) 数据生命周期图是在业务流程的约束之下对业务数据在其整个生命周期(从概念阶段到最终退 ...
- 朱晔的互联网架构实践心得S1E8:三十种架构设计模式(下)
朱晔的互联网架构实践心得S1E8:三十种架构设计模式(下) [下载本文PDF进行阅读] 接上文,继续剩下的15个模式. 数据管理模式 16.分片模式:将数据存储区划分为一组水平分区或分片 一直有一个说 ...
- 大数据分析的下一代架构--IOTA架构设计实践[下]
大数据分析的下一代架构--IOTA架构设计实践[下] 原创置顶 代立冬 发布于2018-12-31 20:59:53 阅读数 2151 收藏 展开 IOTA架构提出背景 大数据3.0时代以前,Lam ...
- LLVM编译器架构
LLVM编译器架构 LLVM概述 LLVM项目是模块化和可重用的编译器及工具链技术的集合.尽管名称如此,LLVM与传统虚拟机关系不大.名称" LLVM"本身不是缩写.它是项目的全名 ...
- 架构(Architecture)和框架(Framework)杂谈
1. 架构和框架的设计层次不同 类似于硬件设计,软件设计也分为不同的层次.典型的软件设计层次如下图: 在这个图中我们可以看到,Framework处于Micro-archite ...
随机推荐
- DVWA之SQL Injection
SQL Injection SQL Injection,即SQL注入,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的.SQL注入漏洞的危害是巨大的,常常 ...
- 神经网络与机器学习 笔记—单神经元解决XOR问题
单神经元解决XOR问题 有两个输入的单个神经元的使用得到的决策边界是输入空间的一条直线.在这条直线的一边的所有的点,神经元输出1:而在这条直线的另一边的点,神经元输出0.在输入空间中,这条直线的位置和 ...
- ThinkPHP5查询-select与find理解
出现问题 在tp5框架中判断select查询结果是否为空时,无论查询条件是否满足,判断查询结果都不为空 解析问题 select查询的是多条数据,若查询数据为空,则返回一个空的二维数组 array(ar ...
- python通过字符串定义函数名
记录python里的一个有意思的小技巧:通过字符串定义函数名称. import sys m=sys.modules[__name__] def temp(x): return x+1 setattr( ...
- c++通讯录管理系统
代码拷贝 #include<iostream> #include<string> #include<stdlib.h> #define MAX 1000 using ...
- Django(19)QuerySet API
前言 我们通常做查询操作的时候,都是通过模型名字.objects的方式进行操作.其实模型名字.objects是一个django.db.models.manager.Manager对象,而Manager ...
- Can’t update table ‘xxx’ in stored function/trigger because it is already used by statement which invoked this stored function/trigger
MySQL: Solution for ERROR 1442 (HY000): Can't update table 'xxx' in stored function/trigger because ...
- [笔记] 《c++ primer》书店程序 Chapter2
Sales_data.h 1 #ifndef SALES_DATA_H 2 #define SALES_DATA_H 3 4 #include "Version_test.h" 5 ...
- Linux_磁盘管理理论概述
一.磁盘阵列 1.什么是磁盘阵列? 1️⃣:磁盘整列就是将多块独立的磁盘组合到一起,形成容量大的磁盘组. 2️⃣:将相同的数据存放到不多个的磁盘的不同位置 2.RAID0 1️⃣:RAID0是磁盘整列 ...
- 回车与换行的区别:CRLF、CR、LF
引言 以下是 MySQL 8 导出数据的窗口,导出数据时需要选择记录分隔符,这就需要你明白 CRLF.CR 和 LF 分别代表什么,有何区别,否则可能导出数据会出现莫名其米的问题. 名词解释 CR:C ...