编译器架构Compiler Architecture(上)

编译器是程序,通常是非常大的程序。它们几乎都有一个基于翻译分析综合模型的结构。

CONTENTS

Overview • Compiler Components • Lexical Analysis (Scanning) • Syntax Analysis (Parsing) • Combining Scanning and Parsing • Semantic Analysis • Intermediate Code Generation • Machine Independent Code Improvement • Code Generation • Machine Dependent Code Improvement

Overview

编译器执行翻译。每一个非平凡的翻译都需要分析和综合:

分析和综合都是由内部相位组成的。

Compiler Components

以下是生成汇编语言或机器语言的生产编译器的主要功能组件(如果您只是针对C之类的高级语言或虚拟机,则可能没有那么多阶段):

还可以标识错误恢复子系统和符号表管理器。

You might also identify an error recovery subsystem and a symbol table manager, too.

Lexical Analysis (Scanning)

扫描器将源程序的字符流转换为令牌流。这样,它会像

删除评论

展开宏(如C语言),

检查缩进并创建INDENT和DEDENT标记,使用具有空格意义的语言,如Python和Haskell

删除空白(在考虑缩进和删除后)

An example in C:

#define ZERO 0

unsigned  gcd(   unsigned   int  // Euclid’s algorithm

x,unsigned   y) {   while ( /* hello */  x>   ZERO

){unsigned temp=x;x=y   %x;y  = temp ;}return y ;}

标记化为 gets tokenized into:

与扫描仪有关的问题包括:

区分大小写(或不敏感)

空白是否重要

新行是否重要

是否可以嵌套注释

扫描过程中可能出现的错误称为词法错误,包括:

遇到不在语言字母表中的字符

单词或行中的字符太多(是的,这种语言确实存在!)

未闭合的字符或字符串

注释中的文件结尾

Syntax Analysis (Parsing)

解析器将令牌序列转换为抽象语法树。对于上面的例子,我们得到这个树:

树也可以存储为字符串

(fundecl unsigned gcd
  (params (param unsigned x) (param unsigned y))
  (block
    (while
      (> x 0)
      (block (vardecl unsigned temp y) (= x (% y x)) (= y temp)))
    (return y)))

从技术上讲,AST中的每个节点都存储为一个带有命名字段的对象,其中许多字段的值本身就是树中的节点。注意,在编译的这个阶段,树肯定只是一棵树。没有循环。

在构造解析器时,需要关注语法的复杂性(例如语法是LL还是LR),以及是否有任何可能需要破解的消歧规则。有些语言实际上需要一些语义分析来解析。

练习:说明C中的(x)-y可以有两种不同的句法解释。提示:你的答案可能包含“减法”、“typedef”、“cast”和“negation”。

在解析过程中可能发生的错误,称为语法错误,在C语言中包括如下内容。

  • j = 4 * (6 − x;
  • i = /5
  • 42 = x * 3

编译器架构Compiler Architecture(上)的更多相关文章

  1. 编译器架构Compiler Architecture(下)

    编译器架构Compiler Architecture(下) Combining Scanning and Parsing 实际上没有必要将扫描(词法分析/标记化)与解析(语法分析/树生成)分开.基于P ...

  2. NVIDIA Turing Architecture架构设计(上)

    NVIDIA Turing Architecture架构设计(上) 在游戏市场持续增长和对更好的 3D 图形的永不满足的需求的推动下, NVIDIA 已经将 GPU 发展成为许多计算密集型应用的世界领 ...

  3. 微内核架构(Microkernel Architecture)

    微内核架构(Microkernel Architecture) 微内核架构有时也被成为插件架构模式(plug-in architecture pattern),通常用于实现基于产品的应用,如Eclip ...

  4. 事件驱动架构 (Event-Driven Architecture,EDA) 简介

    EDA 是一种侧重于以生成/消费为基础的异步通信的架构模式.这主要对照于传统的基于线程的同步系统. EDA 是一种以事件 (event)为核心,提供事件产生,路由,消费已经结果回调等机制的架构模式. ...

  5. DLNA架构在机顶盒上播放云存储文件的实现

    DLNA 架构在机顶盒上播放云存储文件的实现   摘要: 随着越来越多的数码设备,音像设备等对 UPNP 协议的支持和普及,业界对多媒体内容提供服务的需求越越来越强烈,为了实现遵循 UPNP 协议和  ...

  6. 企业架构研究总结(33)——TOGAF架构内容框架之架构制品(上)

    4. 架构制品(Architectural Artifacts) 架构制品是针对某个系统或解决方案的模型描述,与架构交付物和构建块相比,架构制品既不是架构开发方法过程各阶段的合约性产物,亦不是企业中客 ...

  7. TOGAF架构内容框架之架构制品(上)

    TOGAF架构内容框架之架构制品(上) 4. 架构制品(Architectural Artifacts) 架构制品是针对某个系统或解决方案的模型描述,与架构交付物和构建块相比,架构制品既不是架构开发方 ...

  8. 朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上)

    朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上) [下载本文PDF进行阅读] 设计模式是前人通过大量的实践总结出来的一些经验总结和最佳实践.在经过多年的软件开发实践之后,回过头来去看23种设 ...

  9. Java架构师线上问题排查,这些命令程序员一定用得到!

    Java架构师线上问题排查,这些命令程序员一定用得到! 线上问题排查,以下场景,你遇到过吗? 一.了解机器连接数情况 问题:1.2.3.4的sshd的监听端口是22,如何统计1.2.3.4的sshd服 ...

随机推荐

  1. POJ 3613 快速幂+Floyd变形(求限制k条路径的最短路)

    题意:       给你一个无向图,然后给了一个起点s和终点e,然后问从s到e的最短路是多少,中途有一个限制,那就是必须走k条边,路径可以反复走. 思路:       感觉很赞的一个题目,据说证明是什 ...

  2. Intel汇编程序设计-整数算术指令(中)

    7.3  移位和循环移位的应用 7.3.1  多双字移位 要对扩展精度整数(长整数)进行移位操作,可把它划分为字节数组.字数组或双字数组,然后再对该数组进行移位操作.在内存中存储数字时通常采用的方式是 ...

  3. linux中定时运行php(每分钟执行一次为例)

    注:使用Crontab定时执行php脚本文件 1. 安装crontab yum install crontabs 说明:/sbin/service crond start //启动服务/sbin/se ...

  4. 修改wordpress版权信息

    修改页脚版权信息位置:找到C:\wamp64\www\wordpress\wp-content\themes\travelify\library\structure\footer-extensions ...

  5. Django(5)django配置信息

    前言 Django的配置文件settings.py用于配置整个网站的环境和功能,核心配置必须有项目路径.密钥配置.域名访问权限.App列表.中间件.资源文件.模板配置.数据库的连接方式 基本配置信息 ...

  6. c++通讯录管理系统

    代码拷贝 #include<iostream> #include<string> #include<stdlib.h> #define MAX 1000 using ...

  7. Spring Cloud Alibaba(11)---Sentinel+Nacos持久化

    Sentinel+Nacos持久化 有关Sentinel之前有写过两篇 Spring Cloud Alibaba(9)---Sentinel概述 Spring Cloud Alibaba(10)--- ...

  8. OC与Swift混编,三种场景的实现方式

    多语言并存时期,混编成为一种必须的方式 ,在多场影中实现OC和Swift语言的并存原来是如此简单 第一种场景,App中实现混编 创建桥接文件*.h 新建一个桥接文件,New File 选择 Heade ...

  9. [刷题] 19 Remove Nth Node From End of List

    要求 给定一个链表,删除倒数第n个节点 示例 1->2->3->4->5->NULL , n=2 1->2->3->5 边界 n是从0还是从1计 n不合 ...

  10. 与find不同,locate并不是实时查找。你需要更新数据库,以获得最新的文件索引信息。updatedb

    find是实时查找,如果需要更快的查询,可试试locate:locate会为文件系统建立索引数据库,如果有文件更新,需要定期执行更新命令来更新索引库: $locate string 寻找包含有stri ...