计算机编译原理第三版什么是NFA?

最新资料 &&&& &&&&&&&&&&&&&&&& &&&&&&&&
学习资料库,由广大资源爱好者通过共享互助而共享各种学习资料,大家可以免费下载学习使用,但学习资料库无法保证所共享
& 版权所有 Gzip enabled编译原理NFA转DFA_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
编译原理NFA转DFA
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩14页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢词法分析(4)---NFA与DFA的转化&编译原理
1. 子集构造(Subset Construction)
  这是一个转换NFA到DFA的算法。我们知道NFA和DFA的区别最主要的就是一个状态和一个input
symbol是否能够确定一个状态的问题,对于NFA,它将确定一个组状态,而DFA将确定一个状态,因此,我们有一个很好的办法就是把NFA的状态集对应每个DFA的状态,这就是subset
construction的思想,不过这只是大概泛泛而论,我们需要更加明确的认识
  1) NFA在任何一个input
symbol下,映射的状态集(通过move函数,这个集合通常用T字母表示)应该被知道
  2) 必须保证1)中状态集都对应了DFA中的一个状态
  具体算法:
  Input : 一个NFA N
  Output : 接受相同语言的DFA D
  Method : 为D构架一个transition table(转换表)
Dtran,每个DFA的状态是一个NFA的状态集合(这里一定要注意前面说过的1)2)两点)。我们定义一些操作:
  s 表示NFA的状态,T 表示NFA的状态集合,a表示一个input symbol
  ε-transition(ε转换)就是说input symbol为ε时的transition(转换)
  操作(operation)
  描述(description)
  ε-closure(s)
  从NFA的状态s出发,只通过ε-transition到达的NFA的状态集合
  ε-closure(T)
  NFA的集合T中的状态p,只通过ε-transition到达的NFA的状态集合,再求这些集合的交集。用数学表达就是 {p|p
属于 ε-closure(t) , t属于T}
  move(T,a)
  NFA的集合,这个集合在input symbol为a,状态为T中任意状态情况下,通过一个转换得到的集合
  注意一下,所有的操作都是针对NFA的状态或者状态集合,得到的时NFA的状态集合,或者说是DFA看为一个状态
  Subset Construction
  初始Dstates,它仅仅含有状态(D的状态)ε-closure(s0),并且状态未被标记,s0表示开始状态,注意,Dstates放的是D的状态
双击代码全选
while ( Dstates 有未标记的状态 T ) { // T是D中的一个状态,也是N中一个状态集
    标记 T;
    for ( input symbol a ){                  // 遍历所有的input symbol
       U = ε-closure(move(T, a));        // move为NFA的move函数
       if ( U 不在 Dstates 中 )
          把U作为尚未标记的状态加入D
       Dtran[T, a] = U
  注意,状态s,ε-closure(s)一定包含s
  我们先来熟悉上面的操作operation,再来看上面的算法
双击代码全选
ε-closure(0) = {0, 1, 2, 4, 7}   // 从0状态出发的,input symbol为ε的所有状态的集合
ε-closure(3) = {1, 2, 3, 4, 6, 7}
ε-closure(8) = {8}
ε-closure( {3, 8} ) = ε-closure(3) U ε-closure(8) = {1, 2, 3, 4, 6, 7, 8}
move(0,a) = 空
move(7,a) = {8}
move(8,b) = {9}
move( {0, 1, 2, 4, 7}, a) = move(0,a) U move(1,a) U move(2,a) U move(4,a) U move(7,a) = {3, 8}
  现在可以回去理解一下算法了。
  这里再说说求ε-closure(T)的算法:
双击代码全选
把T的所有状态压入stack(栈);
ε-closure(T)的初始值为 T 中的所有元素 ;  // 也就是一定包含他们本身
while( 栈非空 ) {
    弹出栈顶元素 t ;
    for( 每个属于 move(t, ε) 的状态 u ){
       if( u 不在 ε-closure(T) 中 ){
          u 加入 ε-closure(T);
          把 u 入栈;
       }
  下面对上图如何使用Set Construction算法来构建DFA做一个详细的描述:
  1. 初始化Dstates 把集合 ε-closure(s0) = {0, 1, 2, 4, 7}作为第一个状态,设此状态为
  2. 现在转化,input symbol {a, b},因此,求:
  ε-closure(move(A, a));
  ε-closure(move(A, b));
  这里会得到2个状态
  ε-closure(move(A, a)) = {1, 2, 3, 4, 6, 7, 8},设其为 B
  ε-closure(move(A, b)) = {1, 2, 4, 5, 6, 7}, 设其为C
  B,C放入Dstates
  改写 Dtrans
  最终得到的 Dtrans 为:
  A = {0, 1, 2, 4, 7}
  B = {1, 2, 3, 4, 6, 7, 8}
  C = {1, 2, 4, 5, 6, 7}
  D = {1, 2, 4, 5, 6, 7, 9}
  因此,NFA转化成为DFA:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。您所在的位置: &
编译原理 目录
编译原理 目录
机械工业出版社
《编译原理(原书第2版)》本书全面、深入地探讨了编译器设计方面的重要主题,包括词法分析、语法分析、语法制导定义和语法制导翻译、运行时刻环境、目标代码生成、代码优化技术、并行性检测以及过程间分析技术,并在相关章节中给出大量的实例。本节为目录部分。
前言第1章&引论&21.1 语言处理器&21.1.1 &1.1节的练习&41.2 一个编译器的结构&41.2.1 词法分析&51.2.2 语法分析&61.2.3 语义分析&71.2.4 中间代码生成&71.2.5 代码优化&81.2.6 代码生成&81.2.7 符号表管理&91.2.8 将多个步骤组合成趟&91.2.9 编译器构造工具&91.3 程序设计语言的发展历程&101.3.1 走向高级程序设计语言&101.3.2 对编译器的影响&111.3.3 1.3节的练习&111.4 构建一个编译器的相关科学&121.4.1 编译器设计和实现中的建模&121.4.2 代码优化的科学&121.5 编译技术的应用&131.5.1 高级程序设计语言的实现&141.5.2 针对计算机体系结构的优化&15并行性&15内存层次结构&151.5.3 新计算机体系结构的设计&16RISC&16专用体系结构&171.5.4 程序翻译&17二进制翻译&17硬件合成&17数据查询解释器&18编译然后模拟&181.5.5 软件生产率工具&18类型检查&19边界检查&19内存管理工具&191.6 程序设计语言基础&191.6.1 静态和动态的区别&201.6.2 环境与状态&201.6.3 静态作用域和块结构&221.6.4 显式访问控制&241.6.5 动态作用域&241.6.6 参数传递机制&26值调用&26引用调用&26名调用&271.6.7 别名&271.6.8& 1.6节的练习&271.7 第一章的总结&281.8 第一章的参考书目&29
第2章 一个简单的语法制导翻译器&22.1 引言&22.2 语法定义&42.2.1文法定义&42.2.2 推导&52.2.3 语法分析树&62.2.4 二义性&82.2.5 运算符的结合性&82.2.6 运算符的优先级&92.2.7 2.2节的练习&122.3 语法制导翻译&132.3.1 后缀表示&142.3.2 综合属性&152.3.3 简单语法制导定义&172.3.4 树的遍历&172.3.5 翻译方案&182.3.6 2.3节的练习&212.4 语法分析&212.4.1 自顶向下分析方法&222.4.2 预测分析法&252.4.3 何时使用?-产生式&262.4.4&设计一个预测语法分析器&272.4.5&左递归&282.4.6 2.4节的练习&292.5 简单表达式的翻译器&292.5.1抽象语法和具体语法&302.5.2调整翻译方案&312.5.3非终结符号的过程&332.5.4 翻译器的简化&342.5.5 完整的程序&352.6 词法分析&372.6.1 剔除空白和注释&382.6.2 预读&392.6.3 常量&392.6.4 识别关键字和标识符&402.6.5 词法分析器&422.6.6 2.6节的练习&452.7 符号表&462.7.1 为每个作用域设置一个符号表&472.7.2 符号表的使用&502.8 中间代码生成&522.8.1 两种中间表示形式&522.8.2 语法树的构造&532.8.4 三地址码&602.8.5 2.8节的练习&662.9 第2章的总结&66
第3章 词法分析&23.1 词法分析器的作用&23.1.1词法分析及解析&43.1.2词法单元、模式、词素&53.1.3词法单元的属性&63.1.4词法错误&73.1.5 3.1节的练习&83.2 输入缓冲&93.2.1缓冲区对&93.2.2哨兵标记&103.3 词法单元的规约&103.3.1 串和语言&113.3.2 语言上的运算&133.3.3 正则表达式&143.3.4 正则定义&173.3.5 正则表达式的扩展&183.3.6 3.3节的练习&193.4 词法单元的识别&223.4.1 状态转换图&243.4.2 保留字和标识符的识别&263.4.3 完成我们的连续性例子&273.4.4 基于状态转换图的词法分析器的体系结构&283.4.5 3.4节的练习&303.5 词法分析器生成工具Lex&343.5.1 Lex的使用&343.5.2 Lex程序的结构&353.5.3 Lex中的冲突解决&383.5.4 向前看运算符&383.5.5 3.5节练习&403.6 有穷自动机&413.6.1 不确定的有穷自动机&413.6.2 转换表&423.6.3 NFA接受输入字符串&433.6.4 确定的有穷自动机&443.6.5 3.6节的练习&453.7 从正则表达式到自动机&463.7.1 从NFA到DFA的转换&473.7.2 NFA的模拟&503.7.3 NFA模拟效率&513.7.4 从正则表达式构造NFA&533.7.5 字符串处理算法的效率&573.7.6 3.7节的练习&603.8词法分析器生成工具的设计&603.8.1 被生成的词法分析器的结构&613.8.2 基于NFA的模式匹配&623.8.3 词法分析器使用的DFA&643.8.4实现向前看运算符&653.8.5 3.8的练习&663.9 基于DFA的模式匹配器的优化&673.9.1 NFA的重要状态&673.9.2 根据抽象语法树计算得到的函数&693.9.3 计算nullable、firstpos及lastpos&703.9.4 计算followpos&713.9.5 根据正则表达式构建DFA&733.9.6 最小化一个DFA的状态数&743.9.7 词法分析器的状态最小化&783.9.8 在DFA模拟中用时间换取空间&793.9.9 3.9节的练习&803.9.10 第3章的总结&813.11 参考文献&83
第4章&语法分析&24.1 引论&34.1.1 语法分析器的角色&34.1.2 代表性的文法&44.1.3 语法错误的处理&54.1.4 错误恢复策略&64.2 上下文无关文法&84.2.1 上下文无关文法的正式定义&84.2.2符号表示的惯例&9推导&10语法分析树和推导&12二义性&144.2.6验证文法生成的语言&154.2.7上下文无关文法和正则表达式&164.2.8 4.2节的练习&17写文法&204.3.1 词法分析和语法分析&204.3.2 消除二义性&214.3.3左递归的消除&234.3.4提取左公因子&254.3.5非上下文无关的语言构造&264.3.6 4.3节的练习&27自顶向下的语法分析&284.4.1 递归下降的语法分析&304.4.2 FIRST和FOLLOW&314.4.3 LL(1)文法&334.4.4 非递归的预测分析&374.4.5 预测分析中的错误恢复&394.4.6 4.4节的练习&42自底向上的语法分析&444.5.1 归约&454.5.2 句柄剪枝&464.5.3 移入-归约语法分析技术&474.5.4移入-归约语法分析中的冲突&494.5.5 4.5节的练习&51LR语法分析技术介绍:简单LR技术&524.6.1 为什么使用LR语法分析器?&524.6.2 项和LR(0)自动机&534.6.3 LR-语法分析算法&594.6.4 构造SLR-分析表&634.6.5 可行前缀&674.6.6 4.6节的练习&684.7 更强大的LR语法分析器&704.7.1 规范LR(1)项&714.7.2 构造LR(1)项集&724.7.3 规范LR(1)分析表&764.7.4 构造LALR语法分析表&774.7.5 LALR语法分析表的高效构造方法&814.7.6 LR语法分析表的压缩&864.7.7 4.7节的练习&884.8 使用二义性文法&894.8.1 用优先级和结合性解决冲突&904.8.2 "悬空-else"二义性&924.8.3 LR语法分析中的错误恢复&944.8.4 4.8节的练习&964.9 语法分析器的生成工具&984.9.1 语法分析器的生成工具Yacc&984.9.2 使用Yacc处理二义性文法&1024.9.3 用Lex创建Yacc的词法分析器&1054.9.4:Yacc中的错误恢复&1064.9.5 4.9节的练习&1084.10:第4章的小结&1084.11 第4章的参考文献&111
第5章 语法制导的翻译&15.1 语法制导定义&25.1.1 继承属性和综合属性&25.1.2 在一棵语法分析树的结点上对一个SDD求值&45.1.3 5.1节的练习&65.2 SDD的求值顺序&65.2.1 依赖图&65.2.2 属性求值的顺序&75.2.3:S-属性定义&85.2.4 L-属性定义&85.2.5 具有受控副作用的语义规则&95.2.6 5.2节的练习&115.3 语法制导翻译的应用&115.3.1 抽象语法树的构造&125.3.2 类型的结构&145.3.3:5.3节的练习&155.4 语法制导的翻译方案&155.4.1 后缀翻译方案&165.4.2 后缀SDT的语法分析栈实现&165.4.3 产生式内部带有语义动作的SDT&175.4.4 从SDT中消除左递归&185.4.5 L-属性定义的SDT&205.4.6 5.4节的练习&245.5 实现L-属性的SDD&245.5.1 在递归下降语法分析过程中进行翻译&255.5.2 边扫描边生成代码&275.5.3 L-属性的SDD和LL语法分析&295.5.4 L-属性的SDD的自底向上语法分析&325.5.5 5.5节的练习&355.6 第5章的总结&355.7 第5章的参考文献&36
第6章 中间代码生成&26.1 语法树的变体&36.1.1 表达式的有向无环图&36.1.2 构造DAG的值编码方法&46.1.3& 6.1节的练习&66.2 三地址代码&66.2.1 地址和指令&76.2.2 四元式表示&86.2.3 三元式表示&96.2.4 静态单赋值形式&106.2.5 6.2节的练习&116.3 类型和声明&116.3.1 类型表达式&126.3.2类型等价&136.3.3 声明&136.3.4 局部变量名的存储布局&146.3.5 声明的序列&156.3.6 记录和类中的域&166.3.7 6.3节的练习&176.4 表达式的翻译&176.4.1 表达式中的运算&176.4.2 增量翻译&196.4.3 数组元素的寻址&196.4.4 数组引用的翻译&206.4.5 6.4节的练习&216.5 类型检查&226.5.1 类型检查规则&236.5.2 类型转换&246.5.3 函数和运算符的重载&256.5.4 类型推导和多态函数&266.5.5 一个合一算法&296.5.6 6.5节的练习&316.6 控制流&316.6.1 布尔表达式&316.6.2 短路代码&326.6.3 控制流语句&326.6.4 布尔表达式的控制流翻译&346.6.5 避免冗余的goto指令&356.6.6 布尔值和跳转代码&366.6.7 6.6节的练习&376.7 回填&386.7.1 使用回填技术的一趟式目标代码生成&386.7.2 布尔表达式的回填&396.7.3 控制转移语句&406.7.4 Break-, Continue-和Goto-语句&426.7.5 6.7节的练习&436.8 Switch-语句&446.8.1 Switch语句的翻译&446.8.2 Switch语句的语法制导翻译&456.8.3 6.8节的练习&456.9 过程的中间代码&466.10 第6章的总结&476.11 第6章参考文献&48
第7章 运行时刻环境&27.1 存储组织&27.1.1 静态和动态存储分配&47.2 空间的栈式分配&47.2.1 活动树&47.2.2 活动记录&67.2.3 调用代码序列&77.2.4 栈中的变长数据&97.2.5 7.2节的练习&107.3 栈中非局部数据访问&117.3.1 没有嵌套过程时的数据访问&117.3.2 和嵌套过程相关的问题&127.3.3 一个允许嵌套过程声明的语言&127.3.4 嵌套深度&137.3.5 访问链&147.3.6 处理访问链&157.3.7 过程型参数的访问链&157.3.8 显示表&167.3.9 7.3节的练习&177.4 堆管理&187.4.1 存储管理子系统&187.4.2 一台计算机的存储层次结构&197.4.3 程序中的局部性&207.4.4 碎片整理&217.4.5 人工回收请求&247.4.6 7.4节的练习&267.5 垃圾回收介绍&267.5.1 垃圾回收的设计目标&277.5.2 可达性&287.5.3 引用计数垃圾回收器&307.5.4 7.5节的练习&317.6 基于跟踪的回收的介绍&317.6.1 基本的标记并清扫回收器&317.6.2 基本抽象&337.6.3 标记并清扫算法的优化&347.6.4 标记并压缩的垃圾回收器&357.6.5 拷贝回收器&377.6.6开销的比较&397.6.7 7.6节的练习&397.7 短停顿垃圾回收&407.7.1 增量式垃圾回收&407.7.2 增量式可达分析&417.7.3 部分回收基础&437.7.4 世代垃圾回收&447.7.5 列车算法&457.7.6 7.7节的练习&487.8 垃圾回收中的高级论题&487.8.1 并行和并发垃圾回收&497.8.2 部分的对象重新定位&507.8.3类型不安全的语言的保守垃圾回收&517.8.4 弱引用&517.8.5 7.8节的练习&52第7章总结&527.10 第7章的参考文献&54
第8章&代码生成&28.1 代码生成器设计中的问题&48.1.1 代码生成器的输入&48.1.2 目标程序&48.1.3 指令选择&58.1.4 寄存器分配&68.1.5 求值顺序&88.2 目标语言&88.2.1 一个简单的目标机模型&88.2.2 程序和指令的代价&108.2.3 8.2节的练习&118.3 目标代码中的地址&138.3.1 静态分配&138.3.2 栈分配&148.3.3 名字的运行时刻地址&178.3.4 8.3节的练习&188.4 基本块和流图&198.4.1 基本块&198.4.2 后续使用信息&218.4.3 流图&228.4.4 流图的表示方式&238.4.5 循环&238.4.6 8.4节的练习&248.5 基本块的优化&248.5.1 基本块的DAG图表示&248.5.2 寻找局部公共子表达式&258.5.3 死代码消除&268.5.4.代数恒等式的使用&268.5.5 数组指引的表示&288.5.6 指针赋值和过程调用&298.5.7 从DAG图到基本块的重组&298.5.8 8.5节的练习&308.6 一个简单的代码生成器&318.6.1 寄存器和地址描述符&328.6.2 代码生成算法&338.6.3 函数getReg的设计&358.6.4 8.6节的练习&368.7 窥孔优化&368.7.1 消除冗余的加载和保存指令&378.7.2 消除不可达代码&378.7.3 控制流优化&388.7.4 代数简化和强度消减&388.7.5 使用机器特有的指令&398.7.6 8.7节的练习&398.8 寄存器分配和指派&398.8.1 全局寄存器分配&408.8.2 使用计数&408.8.3 外层循环的寄存器指派&418.8.4 通过图着色方法进行寄存器分配&428.8.5 8.8节的练习&438.9 通过树重写进行指令选择&438.9.1 树翻译方案&438.9.2 通过覆盖一个输入树来生成代码&458.9.3 通过扫描进行模式匹配&478.9.4 用于语义检查的子过程&488.9.5 通用的树匹配方法&498.9.6 8.9节的练习&508.10:表达式的优化代码生成&508.10.1 Ershov数&518.10.2 从带标号的表达式树生成代码&518.10.3 寄存器数量不足时的表达式求值&538.10.4 8.10节的练习&548.11 使用动态规划的代码生成&558.11.1 连续求值&558.11.2 动态规划的算法&568.11.3 8.11节的练习&588.12 第8章的小结&588.13 第8章的参考书目&59
第9章 机器无关优化&29.1 优化的主要来源&39.1.1 冗余的原因&39.1.2 一个贯穿本章的例子&39.1.3 保持语义不变的转换&49.1.4 全局公共子表达式&59.1.5 复制传播&69.1.6 死代码消除&69.1.7 代码移动&79.1.8 归纳变量和强度消减&79.1.9 9.1节的练习&99.2 数据流分析简介&99.2.1 数据流抽象&109.2.2 数据流分析方案&119.2.3 基本块上的数据流方案&129.2.4 到达定值&129.2.5 活跃变量分析&189.2.6 可用表达式&199.2.7 小结&229.2.8 9.2节的练习&229.3 数据流分析基础&249.3.1 半格&259.3.2 传递函数&289.3.3 通用框架的迭代算法&309.3.4 数据流解的含义&319.3.5 9.3节的练习&339.4 常量传播&349.4.1 常量传播框架的数据流值集&359.4.2 常量传播框架的交函数&359.4.3 常量传播框架的传递函数&359.4.4 常量传递框架的单调性&369.4.5 常量传播框架的不可分配性&379.4.6 对算法结果的解释&379.4.7 9.4节的练习&389.5 部分冗余消除&399.5.1 冗余的来源&399.5.2 可能消除所有冗余吗?&419.5.3 懒惰代码移动问题&429.5.4 表达式的预期执行&439.5.5 懒惰代码移动算法&439.5.6 9.5节的练习&499.6 流图中的循环&509.6.1支配结点&509.6.2 深度优先排序&529.6.3 深度优先生成树中的边&549.6.4 回边和可归约性&559.6.5 流图的深度&569.6.6 自然循环&569.6.7 迭代数据流算法的收敛速度&579.6.8 9.6节的练习&599.7 基于区域的分析&619.7.1 区域&619.7.2 可归约流图的区域层次结构&629.7.3 基于区域的分析技术的概览&649.7.4 有关传递函数的必要假设&649.7.5 一个基于区域的分析算法&669.7.6 处理不可归约流图&699.7.7 9.7节的练习&709.8 符号分析&709.8.1 参考变量的仿射表达式&719.8.2 数据流问题的公式化&739.8.3 基于区域的符号化分析&759.8.4 9.8节的练习&789.9 第9章的总结&799.10 第9章的参考书目&82
第10章 指令级并行&210.1 处理器体系结构&210.1.1& 指令流水线和分支延时&310.1.2 流水线执行&310.1.3 多指令发送&310.2 代码调度约束&410.2.1 数据依赖&410.2.2 寻找内存访问之间的依赖关系&510.2.3 寄存器使用和并发性之间的折衷处理&610.2.4 寄存器分配阶段和代码调度阶段之间的顺序&810.2.5 控制依赖&810.2.6 对投机执行的支持措施&910.2.7 一个基本的机器模型&1010.2.8 10.2节的练习&1110.3 基本块调度&1210.3.1 数据依赖图&1210.3.2 基本块的列表调度方法&1310.3.3 带有优先级的拓扑排序&1410.3.4 10.3节的练习&1510.4 全局代码调度&1610.4.1 基本的代码移动&1610.4.2 向上的代码移动&1710.4.3 向下的代码移动&1810.4.4 更新数据依赖关系&1910.4.5 全局调度算法&1910.4.6 高级代码移动技术&2110.4.7 和动态调度器的交互&2210.4.8 10.4节的练习&2210.5 软件流水线化&2310.5.1 引言&2310.5.2 循环的软件流水线化&2410.5.3 寄存器分配和代码生成&2610.5.4 Do-Across循环&2610.5.5 软件流水线化的目标和约束&2710.5.6 一个软件流水线化算法&2910.5.7 对无环数据依赖图进行调度&3010.5.8 对有环的数据依赖图进行调度&3110.5.9 对流水线化算法的改进&3510.5.10 模组变量扩展&3510.5.11 条件语句&3810.5.12 软件流水线化的硬件支持&3810.5.13 10.5节的练习&3910.6 第10章的总结&4010.7 第十章的参考数目&41
第11章 并行性和局部性的优化&211.1 基本概念&411.1.1 多处理器&511.1.2 应用中的并行性&611.1.3 循环层次的并行性&711.1.4 数据局部性&811.1.5 仿射变换理论的介绍&911.2 矩阵乘法:一个深入的例子&1211.2.1 矩阵相乘算法&1211.2.2 优化&1411.2.3 高速缓存干扰&1611.2.4 11.2节的练习&1611.3 迭代空间&1611.3.1 从循环嵌套结构中构建迭代空间&1711.3.2 循环嵌套结构的执行顺序&1811.3.3 不等式组的矩阵表示方法&1911.3.4 混合使用符号常量&1911.3.5 控制执行的顺序&2011.3.6 坐标轴的变换&2311.3.7 11.3节的练习&2311.4 仿射的数组下标&2511.4.1 仿射访问&2511.4.2 实践中的仿射访问和非仿射访问&2611.4.3 11.4节的练习&2611.5 数据复用&2711.5.1 数据复用的类型&2811.5.2 自复用&2811.5.3 自空间复用&3111.5.4 组复用&3211.5.5 11.5节的练习&3411.6 数组数据依赖分析&3511.6.1 数组访问的数据依赖关系的定义&3611.6.2 整数线性规划&3711.6.3 GCD测试&3711.6.4 解决整数线性规划的启发式规则&3911.6.5 解决一般性的整数线性规划问题&4111.6.6 小结&4311.6.7 11.6节的练习&4311.7 寻找无同步的并行性&4411.7.1 一个介绍性的例子&4511.7.2 仿射空间分划&4611.7.3 空间分划约束&4711.7.4 求解空间分划约束&4911.7.5 一个简单的代码生成算法&5211.7.6 消除空迭代&5411.7.7 从最内层循环中消除条件测试&5511.7.8 源代码转换&5611.7.9 11.7节的练习&5811.8 并行循环之间的同步&5911.8.1 固定多个同步运算&5911.8.2 程序依赖图&6011.8.3 层次结构化的时间&6211.8.4 并行化算法&6311.8.5 11.8的练习&6311.9 流水线化技术&6411.9.1 什么是流水线化?&6411.9.2 连续过松弛方法:一个例子&6511.9.3 完全可交换循环&6611.9.4 把完全可交换循环流水线化&6711.9.5 一般性的理论&6811.9.6 时间分划约束&6811.9.7 用Farkas引理解时间分划约束&7111.9.8 代码转换&7311.9.9 具有最小同步量的并行性&7611.9.10 11.9节的练习&7811.10 局部性优化&7911.10.1 计算结果数据的时间局部性&8011.10.2 数组收缩&8011.10.3 分划单元的交织&8111.10.5 11.10节的练习&8411.11 仿射转换的其它用途&8511.11.1 分布式内存计算机&8511.11.2 多指令发送处理器&8511.11.3 向量和SIMD指令&8611.11.4 数据预取&8711.12 第11章的总结&8711.13 第11章的引用&89
第12章 过程间分析&212.1 基本概念&212.1.1 调用图&312.1.2 上下文相关&412.1.3 调用串&512.1.4 基于克隆的上下文相关分析&612.1.5 基于摘要的上下文相关分析&612.1.6 12.1节的练习&812.2 为什么需要过程间分析?&912.2.1 虚例程调用&912.2.2 指针别名分析&912.2.3 并行化&1012.2.4 软件错误和漏洞的检测&1012.2.5 SQL注入&1012.2.6 缓冲区溢出&1112.3 数据流的一种逻辑表示方式&1212.3.1 Datalog介绍&1312.3.2 Datalog规则&1412.3.3 内涵断言和外延断言&1512.3.4 Datalog程序的执行&1712.3.5 Datalog程序的增量执行&1812.3.6 有问题的Datalog规则&1912.3.7 12.3节的练习&2012.4 一个简单的指针分析算法&2212.4.1 指针分析为什么困难&2212.4.2 一个指针和引用的模型&2312.4.3 控制流无关性&2412.4.4 在Datalog中的表示方法&2412.4.5 使用类型信息&2512.4.6 12.4节的练习&2612.5 上下文无关的过程间分析&2712.5.1 一个例程调用的效果&2712.5.2 用Datalog来发现调用图&2812.5.3 动态加载和反射&2912.5.4 12.5节的练习&3012.6 上下文相关指针分析&3012.6.1 上下文和调用串&3112.6.2 在Datalog规则中加入上下文信息&3212.6.3 关于相关性的更多讨论&3312.6.4 12.6节的练习&3312.7 使用BDD的Datalog的实现&3312.7.1 二分决策图&3412.7.2 对BDD的转换&3512.7.3 用BDD表示关系表&3512.7.4 用BDD操作实现关系操作&3612.7.5 在指针指向分析中使用BDD&3812.7.6 12.7节的练习&3812.8 第12章的小结&3912.9 第12章的参考书目&40【责任编辑: TEL:(010)】&&&&&&
关于&&&&的更多文章
活动目录(Active Directory)是面向Windows Standard Server、W
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
讲师: 39人学习过讲师: 7人学习过讲师: 10人学习过
本书作者具有近10年的互联网营销传播实战经验。书中深
在Android系统从诞生到现在的短短几年时间里,它凭借
《DreamweaverCS5+ASP动态网站建设从入门到精通》第一
本书全面介绍了Windows Server 2003 R2中最常用的各种服务,包括域名服务、动态IP地址服务、Windows名称服务、活动目录服务、Web
51CTO旗下网站

我要回帖

更多关于 编译原理是什么 的文章

 

随机推荐