编译器架构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 ...
随机推荐
- HTTP协议之分块传输与分段编码
目录 数据的分块传输 数据的分段编码(transfer-encoding) 前置知识:HTTP协议 数据的分块传输 我们都知道http协议是由TCP协议封装而来的应用层协议.我们和服务器之间的每次ht ...
- XCTF-FlatScience
FlatScience 题目描述 啥描述也没有 解题过程 页面有好多链接,除了论文pdf之外,还有子目录下的index.html, 比如:/1/index.html,/1/3/index.html 扫 ...
- 第四部分 数据搜索之使用HBASE的API实现条件查询
因为数据清洗部分需要用到Mapreduce,所以先解决hbase的问题,可以用命令先在hbase存一下简单的数据进行查询,之后只要替换数据就可以实现了原本功能 在看该部分前,确保Hase API看了, ...
- The content of element type "web-app" must match "(icon?,display- name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,servlet- mapping*,session-config?
web.xml头部配置: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app P ...
- [源码解析] 并行分布式任务队列 Celery 之 EventDispatcher & Event 组件
[源码解析] 并行分布式任务队列 Celery 之 EventDispatcher & Event 组件 目录 [源码解析] 并行分布式任务队列 Celery 之 EventDispatche ...
- Windows下 MySQL慢查询配置修改
在剖析服务器性能的过程中,慢查询是一个很好的工具. 我们可以通过设置slow_query_log来开启慢查询日志,long_query_time属性来设置慢查询定义阈值,设置slow_query_lo ...
- Windows 程序自动更新方案: Squirrel.Windows
Windows 程序自动更新方案: Squirrel.Windows 1. Squirrel Squirrel 是一组工具和适用于.Net的库,用于管理 Desktop Windows 应用程序的安装 ...
- mysql order by 多样依照排序
如果先按a排序升序,a相同时按b降序排序 则order by a,b desc
- java集合-哈希表HashTable
一.简介 HashTable也是一种key-value结构,key-value不允许null,并且这个类的几乎全部的方法都加上了synchronized锁,来保证并发安全,由于加了锁所以性能方面会比较 ...
- [DB] CDH集群规划
配置 三台机器:node01.node02.node03 node01:6G+60G node02:2G+40G node03:2G+40G 组件 Cloudera Managerment Servi ...