PowerPoint Presentation

Similar documents
PowerPoint Presentation

大侠素材铺

Microsoft PowerPoint - compiler

第 15 章 程 式 編 写 語 言 15.1 程 式 編 写 語 言 的 角 色 程 式 編 寫 語 言 是 程 式 編 寫 員 與 電 腦 溝 通 的 界 面 語 法 是 一 組 規 則 讓 程 式 編 寫 員 將 字 詞 集 合 起 來 電 腦 是 處 理 位 元 和 字 節 的 機 器, 與

02

Microsoft PowerPoint - ch1.ppt [兼容模式]

2/80 2

<4D F736F F F696E74202D20B5DA31D5C220D2FDC2DB2E BD6BBB6C15D205BBCE6C8DDC4A3CABD5D>

Microsoft Word _2 課本1225_OK_0222修.doc

CH01.indd

Microsoft PowerPoint - plan06.ppt

摘 要 在 這 忙 碌 的 社 會 中, 普 遍 人 們 運 動 時 間 其 實 並 不 充 裕, 體 力 越 來 越 差 的 情 況 下 還 隨 意 飲 食 導 致 身 體 健 康 越 來 越 差, 因 此 本 專 題 打 算 利 用 健 康 飲 食 的 方 式 改 善 這 些 人 的 體 質,

Learning Java

PowerPoint 演示文稿

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

Java 1 Java String Date

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

大侠素材铺

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un

CC213

第3章.doc

Microsoft PowerPoint compiler [Compatibility Mode]

什么是函数式编程?

2007 CS Part 05: (ONO, Kouichi)

本 课 程 作 为 非 计 算 机 专 业 本 科 通 识 课 程, 是 一 门 理 论 和 实 践 紧 密 结 合 的 实 用 课 程, 内 容 包 括 计 算 机 基 础 部 分 和 程 序 设 计 部 分 计 算 机 基 础 部 分 涵 盖 计 算 机 软 硬 件 组 成 数 制 表 示 操

Microsoft Word 電腦軟體設計.doc

untitled

1 C++ 2 Bjarne Stroustrup C++ (system programming) 6 (infrastructure) C++ 7 Herb Sutter 8 C++ (efficiency) (flexibility) 9 (abstraction) (productivity

FY.DOC

多層次傳銷與獎金系統

ebook8-30

ebook14-4

Chapter 1 What is Programing Paradigm 1

全国计算机技术与软件专业技术资格(水平)考试

大侠素材铺

科学计算的语言-FORTRAN95


新・解きながら学ぶJava

(Microsoft Word - \261M\256\327\272\353\302\262\263\370\247iEnd.doc)

C/C++程序设计 - 字符串与格式化输入/输出

《大话设计模式》第一章

C/C++ - 字符输入输出和字符确认

中 国 科 学 技 术 大 学 硕 士 学 位 论 文 摘 要 摘 要 当 今 围 绕 着 JVM 的 研 究 和 开 发 日 益 增 多 在 各 种 JVM 发 展 的 同 时, 也 带 来 另 一 种 需 求 如 何 提 供 运 行 在 JVM 上 的 各 种 软 件, 如 何 将 现 有 系

用户大会 论文集2.2.doc

C/C++ - 文件IO

JavaIO.PDF

未命名-1

_汪_文前新ok[3.1].doc

EK-STM32F

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

? (1) (2) (3) (IS) IS 650 信息技术教程 ( 第 7 版 )

软 件 工 程 专 业 习 指 南 目 录 一 软 件 工 程 专 业 设 置 背 景 与 发 展 前 景... 3 二 软 件 工 程 专 业 实 践 教 条 件... 4 三 软 件 工 程 专 业 课 程 类 型 及 核 方 式 软 件 工 程 专 业 课 程 类 型...7

壹、

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

(6) 要 求 付 款 管 理 员 从 预 订 表 中 查 询 距 预 订 的 会 议 时 间 两 周 内 的 预 定, 根 据 客 户 记 录 给 满 足 条 件 的 客 户 发 送 支 付 余 款 要 求 (7) 支 付 余 款 管 理 员 收 到 客 户 余 款 支 付 的 通 知 后, 检

基于ECO的UML模型驱动的数据库应用开发1.doc

untitled

编译技术 Compiler Principles 课程总结 湖南大学信息科学与工程学院软件工程系杨金民 2019/06

碩命題橫式

<4D F736F F D20C8EDC9E82DCFC2CEE7CCE22D3039C9CF>

软件测试(TA07)第一学期考试

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

Abstract arm linux tool-chain root NET-Start! 2

C/C++语言 - C/C++数据

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

吹爆 Intellisense

Microsoft Word - ch04三校.doc

C/C++语言 - 运算符、表达式和语句

PowerPoint 簡報

Windows RTEMS 1 Danilliu MMI TCP/IP QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos eco

untitled

天津天狮学院关于修订2014级本科培养方案的指导意见

<4D F736F F D D524F B9ABB9B2BBB0D3EFB5C4C2DFBCADD3EBCBB5C0ED>

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

epub83-1

此 处 点 勾 的 就 是 启 用 的, 如 果 想 禁 用 某 账 户, 只 要 把 前 边 的 勾 去 掉 即 可 点 击 添 加

新版 明解C言語入門編

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

1 目 錄 1. 簡 介 一 般 甄 試 程 序 第 一 階 段 的 準 備 第 二 階 段 的 準 備 每 間 學 校 的 面 試 方 式 各 程 序 我 的 做 法 心 得 及 筆 記 結 論..

苏州科技学院

Computer Architecture

大侠素材铺

Microsoft Word doc

CC213

大学计算机基础B.doc

内 容 提 要 将 JAVA 开 发 环 境 迁 移 到 Linux 系 统 上 是 现 在 很 多 公 司 的 现 实 想 法, 而 在 Linux 上 配 置 JAVA 开 发 环 境 是 步 入 Linux 下 JAVA 程 序 开 发 的 第 一 步, 本 文 图 文 并 茂 地 全 程 指

2011年招生简章

C/C++ - 数组与指针

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

Microsoft PowerPoint - 1-Introduction.ppt

chap07.key

untitled

C C

Microsoft PowerPoint - UNIGA_Presentation.ppt

<4D F736F F D20C9CFBAA3CAD0BCC6CBE3BBFAB5C8BCB6BFBCCAD4C8FDBCB6BFBCCAD4B4F3B8D95FBDA8D2E9B8E55F5F E646F63>

Microsoft Word - 新1-12.doc

中国科学技术大学学位论文模板示例文档

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

untitled

Transcription:

引论 编译原理和技术 张昱 0551-63603804,yuzhang@ustc.edu.cn 中国科学技术大学计算机科学与技术学院

主要内容 1 2 编程语言及设计 编译器及形式 3 编译器的阶段 4 示例 : 程序的表示 5 基础实验的考虑 张昱 : 编译原理和技术 引论 2

主要内容 1 2 编程语言及设计 编译器及形式 3 编译器的阶段 4 示例 : 程序的表示 5 基础实验的考虑 张昱 : 编译原理和技术 引论 3

编程语言 什么是编程语言 A programming language is a notation for describing computations to people and to machines. 每种编程语言有自己的计算模型 过程型 (Procedural): C, C++, C#, Java 声明型 (Declarative): SQL, 逻辑型 (Logic): Prolog, 函数式 (Functional): Lisp/Scheme, Haskell, ML, 脚本型 (Scripting): AWK, Perl, Python, PHP, Ruby, 张昱 : 编译原理和技术 引论 4

求最大公约数 gcd 张昱 : 编译原理和技术 引论 5

编程语言百花齐放 众多 :GitHub -- 开源项目涉及 337 种编程语言 (2017.9) http://www.99-bottles-of-beer.net/ 用 1500 种语言编写 语言自身在不断发展 C - C90, C99, C11; C++ - 1998,, 2011, 2014, 2017 最流行的语言 ( 动态变化 ) Tiobe https://www.tiobe.com/tiobe-index/ https://octoverse.github.com/ 2017.8:1Java, 2C, 3C++, 4C#, 5Python, 6VB.NET 2010 年 :1Java, 2C, 3PHP, 4C++, 5VB, 6C#, 7Python 1970 年 :1Fortran, 2Lisp, 3Cobol, 4Algol60, 5APL, 6Snobol4 张昱 : 编译原理和技术 引论 6

99 Bottles of Beer 99 bottles of beer on the wall, 99 bottles of beer. Take one down and pass it around, 98 bottles of beer on the wall. 98 bottles of beer on the wall, 98 bottles of beer. Take one down and pass it around, 97 bottles of beer on the wall.... 2 bottles of beer on the wall, 2 bottles of beer. Take one down and pass it around, 1 bottle of beer on the wall. 1 bottle of beer on the wall, 1 bottle of beer. Take one down and pass it around, no more bottles of beer on the wall. No more bottles of beer on the wall, no more bottles of beer. Go to the store and buy some more, 99 bottles of beer on the wall. [Traditional] 张昱 : 编译原理和技术 引论 7

C: 99 Bottles of Beer #define MAXBEER (99) void chug(int beers); main() { register beers; for(beers = MAXBEER; beers; chug(beers--)) puts(""); puts("\ntime to buy more beer!\n"); exit(0); } void chug(register beers) { char howmany[8], *s; s = beers!= 1? "s" : ""; printf("%d bottle%s of beer on the wall,\n", beers, s); printf("%d bottle%s of beeeeer...,\n", beers, s); printf("take one down, pass it around,\n"); if(--beers) sprintf(howmany, "%d", beers); else strcpy(howmany, "No more"); s = beers!= 1? "s" : ""; printf("%s bottle%s of beer on the wall.\n", howmany, s); } [Bill Wein] 张昱 : 编译原理和技术 引论 8

class bottles { Java: 99 Bottles of Beer public static void main(string args[]) { String s = "s"; for (int beers=99; beers>-1;) { System.out.print(beers + " bottle" + s + " of beer on the wall, "); System.out.println(beers + " bottle" + s + " of beer, "); if (beers==0) { System.out.print("Go to the store, buy some more, "); System.out.println("99 bottles of beer on the wall.\n"); System.exit(0); } else System.out.print("Take one down, pass it around, "); s = (--beers == 1)?"":"s"; System.out.println(beers + " bottle" + s + " of beer on the wall.\n"); } } } [Sean Russell] 张昱 : 编译原理和技术 引论 9

AWK: 99 Bottles of Beer BEGIN { for(i = 99; i >= 0; i--) { print ubottle(i), "on the wall,", lbottle(i) "." print action(i), lbottle(inext(i)), "on the wall. print } } function ubottle(n) { return sprintf("%s bottle%s of beer", n? n : "No more", n - 1? "s" : "") } function lbottle(n) { return sprintf("%s bottle%s of beer", n? n : "no more", n - 1? "s" : "") } function action(n) { return sprintf("%s", n? "Take one down and pass it around," : \ "Go to the store and buy some more,") } function inext(n) { return n? n - 1 : 99 } [Osamu Aoki, http://people.debian.org/~osamu] 张昱 : 编译原理和技术 引论 10

程序语言的设计 为什么那么多语言? 单个语言不能适用所有应用 程序员对语言的好坏 如何编程有自己的观点和看法 没有评价语言好坏的普遍接受的标准 语言进化之驱动力 应用的多样性 提高软件开发生产力 (productivity) 改善软件的安全性 可靠性和可维护性 支持并行 (parallelism) 与并发 (concurrency) 移动和分发, 模块化, 多范型 张昱 : 编译原理和技术 引论 11

程序语言设计的计算思维 计算思维 (Computational Thinking) Jeannette M. Wing Computational Thinking CACM, vol. 49, no. 3, pp. 33-35, 2006 Computational thinking is a fundamental skill for everyone, not just for computer scientists. To reading, writing, and arithmetic, we should add computational thinking to every child s analytical ability. Just as the printing press facilitated the spread of the three Rs, what is appropriately incestuous about this vision is that computing and computers facilitate the spread of computational thinking. 语言设计中的计算思维 Problem Domain Mathematical Abstraction Mechanizable Model of Computation Programming Language 张昱 : 编译原理和技术 引论 12

主要内容 1 2 编程语言及设计 编译器及形式 3 编译器的阶段 4 示例 : 程序的表示 5 基础实验的考虑 张昱 : 编译原理和技术 引论 13

编译器是什么 源程序 编译器 Compiler 输入 目标程序 输出 张昱 : 编译原理和技术 引论 14

目标语言 另一种编程语言 CISCs( 复杂指令集 ):x86 IA64 RISCs( 精简指令集 ):MIPS ARM 多核 / 众核 GPUs : CUDA OpenCL FPGAs 量子计算机 TPU,NPU 张昱 : 编译原理和技术 引论 15

解释器 源程序 输入 解释器 Interpreter 输出 直接在输入上执行源程序 张昱 : 编译原理和技术 引论 16

Java 编译器 源程序.java 翻译器 Translator (javac) 输入 中间表示 Intermediate Representation.class Java 虚拟机 Virtual Machine (java) 输出 张昱 : 编译原理和技术 引论 17

编译器的其他形式 交叉编译器 (Cross compiler) 在一个平台上生成另一个平台上的代码 PC arm-linux-gcc ARM 增量编译器 (Incremental compiler) 以增量地编译源程序, 只编译修改的部分, 如 Freeline 即时编译器 (Just-in-time compiler) 在运行时对 IR 中每个被调用的方法进行编译, 得到目标机器的本地代码, 如 Java VM 中的即时编译器 预先编译器 (Ahead-of-time compiler ) 在程序执行之前将 IR 翻译成本地码, 如 ART 中的 AOT 张昱 : 编译原理和技术 引论 18

Java 虚拟机 类加载器 Class loader 输入 垃圾收集器 Garbage collector Java 字节码.class 字节码解释器 Bytecode Interpreter 输出 即时编译器 JIT Compiler 机器代码 Machine code 输出 输入 张昱 : 编译原理和技术 引论 19

C 编译器 C 源程序 预处理器 Preprocessor (cpp).i 连接器 Linker (ld) 目标文件.o 库代码 Library routines 输入 机器代码 Machine code C 编译器 Compiler (cc) 汇编.s 汇编器 Assembler (as) 输出 张昱 : 编译原理和技术 引论 20

主要内容 1 2 编程语言及设计 编译器及形式 3 编译器的阶段 4 示例 : 程序的表示 5 基础实验的考虑 张昱 : 编译原理和技术 引论 21

编译器的阶段 source program Front end 前端 Back end 后端 target program Lexical Analyzer 词法分析器 Token Stream 记号流 Syntax Analyzer 语法分析器 Syntax Tree 语法树 Semantic Analyzer 语义分析器 Annotated Syntax Tree 带注解的语法树 Interm. Code Gen. 中间代码生成器 Interm. Rep. 中间表示 Code Optimizer 代码优化器 Interm. Rep. 中间表示 Code Gen. 代码生成器 Symbol Table 符号表 张昱 : 编译原理和技术 引论 22

编译器的阶段 source program Front end 前端 Program input Lexical Analyzer 词法分析器 Syntax Analyzer 语法分析器 Semantic Analyzer / Interm. Code Gen. 语义分析器 / 中间代码生成器 Tree-walk routines 树遍历程序 Program output Token Stream 记号流 Syntax Tree 语法树 Abstract Syntax Tree or other Interm. Rep. 抽象语法树或其他中间表示 Symbol Table 符号表 张昱 : 编译原理和技术 引论 23

主要内容 1 2 编程语言及设计 编译器及形式 3 编译器的阶段 4 示例 : 程序的表示 5 基础实验的考虑 张昱 : 编译原理和技术 引论 24

int main( ) { int i = getint( ), j = getint( ); A B } Parse Tree 分析树 张昱 : 编译原理和技术 引论 25

A while (i!= j) { if ( i > j ) i = i j; else j = j i; } B putint( i ); Parse Tree 分析树 张昱 : 编译原理和技术 引论 26

Abstract Syntax Tree 抽象语法树 Symbol Table 符号表 张昱 : 编译原理和技术 引论 27

int main( ) { int i = getint( ), j = getint( ); A while (i!= j) { if ( i > j ) i = i j; else B j = j i; C } D putint( i ); } 张昱 : 编译原理和技术 引论 28

主要内容 1 2 编程语言及设计 编译器及形式 3 编译器的阶段 4 示例 : 程序的表示 5 基础实验的考虑 张昱 : 编译原理和技术 引论 29

基础实验的考虑 词法分析器 记号流 http://llvm.org 源代码 Parser0 Parser 是否合法? 高级中间表示 (AST) 解释器 是否合法? 程序变换器优化器 语义检查器 低级中间表示 ( 如 LLVM IR) 低级中间代码生成器 (AST2LIR) LLVM 编译器工具链 代码生成器 寄存器分配器 JIT 汇编码 ( 如 x86, MIPS) 张昱 : 编译原理和技术 引论 30

解析器的生成器 生成器 生成 Lexer:Flex(for windows) Jflex 生成 Parser LALR: Bison(for windows) Java CUP LL: JavaCC ANTLR LL(*) [PLDI2011] 文法对 Parser 的影响 LR Parser 的优势 : 速度快 表达能力强 LL Parser 的优势 : 代码结构与文法对应, 易理解, 容易增加错误处理和错误恢复 张昱 : 编译原理和技术 引论 31

ANTLR ANTLR(ANother Tool for Language Recognition) [http://www.antlr.org/] Prof. Terence Parr, since 1989 支持多种代码生成目标 Java C++ C# Python Go JavaScript Swift 张昱 : 编译原理和技术 引论 32

基于 开展的实验 开源 : 源码阅读, 消化 理解生成 器基于的原理 各种语言实现 :31 种模式 1. 从文法到递归下降识别器 2. LL(1) 递归下降词法分析器 3. LL(1) 递归下降语法解析器 4. LL(k) 递归下降语法解析器 5. 回溯解析器 6. 记忆解析器 7. 谓词解析器 8. 解析树 ( 分析树 ) 9. 同型抽象语法树 10. 规范化异型 AST 11. 不规则的异型 AST 12. 内嵌遍历器 13. 外部访问者 14. 文法访问者 15. 模式匹配者 ( 子树 ) 16. 单作用域符号表 17. 嵌套作用域符号表 18. 数据聚集的符号表 19. 类的符号表型 20. 计算表达式的类型 21. 自动类型提升 22. 静态类型检查 23. 动态类型检查 24. 语法制导的解释器 25. 基于树的解释器 26. 字节码汇编器 27. 栈式解释器 28. 寄存器解释器 29. 语法制导的翻译器 30. 基于规则的翻译器 张昱 : 编译原理和技术 引论 31. 模型驱动的转换 33

我听到的会忘掉, 我看到的能记住, 我做过的才真正明白 张昱 : 编译原理和技术 引论 34