精华内容
下载资源
问答
  • 编译原理一般认为是较难的一门课.从网上的评论来看,人说了一年半软件理论,就一门编译看不懂;人甚至说它是大本软件课程里最难的一门;人抱怨国内的编译教材没有一本容易懂的 从笔者学习实践来看,第一次了一...

    编译原理一般认为是较难的一门课.从网上的评论来看,有人说学了一年半软件理论,就一门编译看不懂;有人甚至说它是大本软件课程里最难的一门;有人抱怨国内的编译教材没有一本容易懂的 从笔者学习实践来看,第一次学了一个多月,理论部分一知半解,第二次学了一星期,基本看懂词法分析的理论部分,语法分析就一知半解了,第三次学了一星期,才基本看懂词法分析和语法分析.由此看来,这门课确实有难度.网上有的帖子,把编译器的编写搞得高深莫测一般,似乎难度极大,非常人能及.

    编译原理究竟难在哪里?笔者的体会,主要在这几点:

    1.错误认识: 很多人以为编译原理只能应用在写程序语言的编译器上,觉得用处不大,学习兴趣不高.而且可能觉得写编译器就必须完全手工来写.

    2.自动机理论: 象NFA,DFA之类,比较抽象,要费些脑子,特别如果学离散数学时没有学自动机理论的话,更是需要多花点时间.

    3.集合论的推演: 主要是一些闭包运算之类,数学基础不好的话,学起来也会感到吃力.

    4.LR文法: 主要是又引入了自动机

    不管哪本编译教材,即使是绝对经典“龙书“也不例外,都要涉及到这几个难点.由于这些内容本身不好懂,作者有再大的本事,也很难把书写得象小说那么流畅好懂.

    明确了难点,接着想对策.大致有这么几种:

    1.端正认识: 编译原理在静态文本处理上有广泛的应用,举个简单的例子,把HTML文件转化为纯文本,利用编译原理来实现“非常“简单.理解了编译原理的实用性,大概可以提高学习兴趣.

    2.反复看书: 这个办法看起来最笨,却是基本的方法.忘了是哪位名人说过,书只要多看,总能看得懂的.

    3.结合源码来看: 这是经典教材Compiler Design in C的作者Allen Hollub建议的方法.这本教材的特色就是包含了大段yacc,lex的代码.这也是个好方法,而且,只有看懂了代码,才能说在根本上理解了理论.当然,要完全看懂yacc的代码,工作量是很大的,而且同样要先理解理论.

    4.删繁就简,避重就轻.网上流传较广的一篇《编译原理学习导论》(作者四川大学唐良)就基本是这种思路,对于词法分析,作者避免了自动机理论和集合论推演的介绍,直接搬出源码来,大大降低了理解难度,对于语法分析,作者介绍了递归下降和LL文法及相应的源码,而对LR文法,只说“理解理论就可以了“.虽然这种方法回避了对于难点的学习,但是用这种方法学习,可以在较短时间内编写出一个能够运行的词法分析器和语法分析器,可以大大提高学习积极性.

    笔者的思路大体上类似第4种方法,但也稍有不同.由于一个偶然的原因, 笔者需要编写一个词法分析器和语法分析器,用于程序源代码的静态分析.开始无从下手,硬着头皮看了点编译原理,觉得困难很大.后来偶然找到一个类似的开源程序,是利用一个叫做PCCTS的编译器自动生成工具开发的,大受启发.开源就是好!笔者找来了一个叫做ANTLR的工具(它是PCCTS的新版,支持生成java,c++和c#代码),又下载了一个c语言的语法文件(因为笔者需要处理c代码文件),然后自己编了少量动作(action)语句,界面代码,分析处理代码等,就这样,在对编译原理所知甚少(以前学过的因为理解不深都忘了,只记得正则表达式)的情况下,仅用一个星期就写出了程序.

    这次实践使笔者对编译原理兴趣大增,重新又学了一遍编译原理,并归纳出笔者认为比较实用有效的编译原理学习步骤:

    1.先利用ANTLR之类的编译器生成工具,做一个小程序(如上面提到的HTML文件转化成纯文本文件的程序),所需知识只是正则表达式的基本知识和生成工具本身的使用方法(可以看联机帮助和网上教程(tutorial)来掌握). 这样做的好处是:

    1)可以体会到编译原理的实用性,提高学习兴趣

    2)入门容易,消除编译原理学习的畏难情绪.

    3)获得词法分析器和语法分析器的感性认识,有利于加深对理论的理解.

    4)获得编译器自动生成工具(compiler compiler)的使用经验,提高解决实际问题的能力.(实际工作很多都不是手编而是利用工具的)

    2.象ANTLR之类的工具是开源(open source)的,可研究其源码,以便必要时自己手编分析程序.

    3.回过头来看编译原理教材. 这时大概会发现,很多理论很容易懂,剩下的只有上面说的几个难点,多看几遍,重点突破.

    4.结合教材所附源码,进一步加深对教材的理解

    这里顺便提一下,有的编译原理的教材,对于输入子系统不单立一章来讲,有的甚至完全忽略,笔者认为, 输入子系统相对于词法分析器和语法分析器来说当然简单地多,但也是两者的基础,故有必要看源码来理解.在这方面,ANTLR的实现机制和Lex是不同的(当然和java与c的差异有关),可对照着看.

    人打赏

    0人 点赞

    主帖获得的天涯分:0

    举报 |

    楼主

    |

    楼主发言:1次 发图:0张 | 添加到话题 |

    展开全文
  • 计算机程序编译原理学习心得《编译原理》是计算机专业的一门重要课程,正如教材:第一章的引论所述,“编译程序是现代计算机系统的基本组成部分之一”。“一个编译程序就是一个语言翻译程序,语言翻译程序把一种语言...

    计算机程序编译原理学习心得

    《编译原理》是计算机专业的一门重要课程,正如教材:第一章的引论所述,“编译程序是现代计算机系统的基本组成部分之一”。“一个编译程序就是一个语言翻译程序,语言翻译程序把一种语言(源语言)书写的程序翻译成另一种语言(目标语言)的等价程序”。下面就是职场范文网小编带来的编译原理学习心得,希望能帮助大家!

    3904044b74006fd8f6edc6c9a17d1ff4.png

    编译原理学习心得

    从联系最紧密的操作系统来说吧,你写多线程/多进程的程序就得和操作系统的知识打交道。写多线程得加锁吧,临界区、死锁的四个条件之类的标准的操作系统的内容吧(不得不吐槽一下,某国内一线电商干了三年的程序猿,写多线程居然不知道加锁,也是醉了)。进程间通信的几种方式什么管道、socket、共享内存等,这也是操作系统的内容吧。文件系统,这也是经常要打交道的东西。还有内存什么的,你做 Android 开发,这些里边有很多东西都在系统层面被封装好了,但是你要是不知道原理,一旦出了错根本无从调试,况且你该不会打算写一辈子写 Android 就是填逻辑吧。

    然后,是编译原理,普通的程序猿是接触不到编译器或者虚拟机的开发的。但是这并不意味着编译原理就用不到。说个最常见的读取配置文件,只要你的配置文件有自定义的语法,你就要用编译原理的东西。还有类似于自动生成代码啦、正则表达式啦这些都算是编译原理的内容。你既然是写 Java 的不了解虚拟机怎么可以,最基本的字节码总是需要能看懂的吧,分析一些疑难杂症的时候字节码还是很有用的。

    最后,是计算机原理,如果只是做应用开发的话计算机原理其实不必要掌握的多深入,但是一些基本的概念还是要清楚的。比如寄存器、缓存、中断什么的,关键的时候可以帮助你调试。在一些对性能要求非常高的场合,也是很有作用的。此外,学了计算机组成基本上汇编差不多能够看懂了吧,这个对于优化代码、查错、反汇编还是很有用的。

    编译原理学习心得

    经过一个星期的编译原理课程设计,本人在刘贞老师的指导下,顺利完成该课程设计。通过该课程设计,收获颇多。 一、对实验原理有更深的理解通过该课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识师机械的,表面的。通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解。二、对该理论在实践中的应用有深刻的理解通过把该算法的内容,算法的执行顺序在计算机上实现,知道和理解了该理论在计算机中是怎样执行的,对该理论在实践中的应用有深刻的理解。

    三、激发了学习的积极性通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。以前对与计算机操作系统的认识是模糊的,概念上的,现在通过自己动手做实验,从实践上认识了操作系统是如何处理命令的,如何协调计算机内部各个部件运行,对计算机编译原理的认识更加深刻。课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意指针,将不必要的命令去除。在这次课程设计中,我就是按照实验指导的思想来完成。加深了理解文件系统的内部功能及内部实现,培养实践动手能力和程序开发能力的目的。四、理解了该知识点以及学科之间的融合渗透本次课程设计程序部分是用c语言编写的,把《计算机操作系统》,《编译原理》,《算法分析与设计》《c语言》四门学科联系起来,把各个学科之间的知识融合起来,把各门课程的知识联系起来,对计算机整体的认识更加深刻。使我加深了对《计算机操作系统》,《编译原理》,《算法分析与设计》《c语言》四门课程的认识。

    编译原理学习心得

    编译程序在计算机科学与技术的发展历史中发挥了巨大作用,是计算机系统的核心支撑软件。而“编译原理”这门课程一直以来是国内外大学计算机相关专业的重要课程。因为它的知识结构贯穿程序设计语言、系统环境以及体系结构,能以相对的视角体现从软件到硬件以及软硬件协同的整机概念。其理论基础又涉及形式语言与自动机、数据结构与算法等计算机学科的许多重要方面,为联系计算机科学理论和计算机系统的典范。

    虽然编译原理这门课程在大多数的人里认为枯燥无味,学起来就像看天书一样。然而学习这门课程还是有一定的好处的。比如可以更加容易的理解在一个语言种哪些写法是等价的,哪些是有差异的,可以更加客观的比较不同语言的差异,并且学习新的语言的效率也会更加高,语言转换也会更加游刃有余。

    不学“编译原理”这门课程的话,自己的编程思想会很浅显。而且编程也只仅仅停留在编程上,无法深入理解其中的原理。

    学习编译原理的话,从文法、正规式、NFA与DFA的定义,下手,要用心动脑去体会

    展开全文
  • 正式学习编译原理之前的整理 如下一个小目标 对于普通程序员,我认为编译原理这门课主要掌握几点就够用了: 词法分析方面,掌握正则表达式,了解dfa/nfa。 Parsing 方面,能读懂BNF,知道AST,会写简单的递归...

    如下有一个小目标


    对于普通程序员,我认为编译原理这门课主要掌握几点就够用了:

    1. 词法分析方面,掌握正则表达式,了解dfa/nfa。
    2. Parsing 方面,能读懂BNF,知道AST,会写简单的递归下降parser,会用antlr之类的parser generator。
    3. 优化方面,知道现代编译器的优化能力有多强,知道如何配合编译器写出高效易读的代码,避免试图outsmart编译器。
    4. 会实现简单的虚拟机(stack-based,不带GC),并把四则运算表达式翻译为虚拟机指令。
      ——引自山威油条博客:
      山威油条的感悟.

    一个整理了一些相关知识的网站链接:
    编译原理基础


    你在查资料的时候应该也会遇见大量的龙书,虎书,鲸书的说法,不用查了给你一个直通车↓↓↓
    龙书、虎书、鲸书是什么.


    刚开始学习,查了一些经验贴,总结说来,

    • 刚开始学习不建议直接看龙书、虎书和鲸书,而要先看一些可以实践的书籍(有人觉得虎书薄,且有利于实践),比如有人推荐了两本书,一本叫《编译原理与实践》,另一本叫做《计算机系统要素》(刚下单)。

    • 编译原理是一门对背景知识要求很重的课程,边实践边学理论是很多人觉得有效的方法

    • 在知乎“如何学习编译原理的”问题下,还有一些别的网站可供学习,比如这里有一个被说靠谱的 实现一个编程语言专栏

    • 还有一个被推荐为手把手的教程,英文阅读能力好戳它看看


    2021.01.26

    展开全文
  • 编译原理

    2021-06-07 06:49:04
    编译原理(计算机专业课程)编辑锁定讨论上传视频编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理...

    编译原理

    (计算机专业课程)

    编辑

    锁定

    讨论

    上传视频

    编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 编译原理是计算机专业设置的一门重要的专业课程。编译原理课程是计算机相关专业学生的必修课程和高等学校培养计算机专业人才的基础及核心课程,同时也是计算机专业课程中最难及最挑战学习能力的课程之一。编译原理课程内容主要是原理性质,高度抽象[1]

    中文名

    编译原理[1]外文名

    Compilers: Principles, Techniques, and Tools[1]

    领    域

    计算机专业的一门重要专业课[1]

    编译原理基本概念

    编辑

    编译原理即是对高级程序语言进行翻译的一门科学技术, 我们都知道计算机程序由程序语言编写而成, 在早期计算机程序语言发展较为缓慢, 因为计算机存储的数据和执行的程序都是由0、1代码组合而成的, 那么在早期程序员编写计算机程序时必须十分了解计算机的底层指令代码通过将这些微程序指令组合排列从而完成一个特定功能的程序, 这就对程序员的要求非常高了。人们一直在研究如何如何高效的开发计算机程序, 使编程的门槛降低。[2]

    编译原理编译器

    编辑

    C语言编译器是一种现代化的设备, 其需要借助计算机编译程序, C语言编译器的设计是一项专业性比较强的工作, 设计人员需要考虑计算机程序繁琐的设计流程, 还要考虑计算机用户的需求。计算机的种类在不断增加, 所以, 在对C语言编译器进行设计时, 一定要增加其适用性。C语言具有较强的处理能力, 其属于结构化语言, 而且在计算机系统维护中应用比较多, C语言具有高效率的优点, 在其不同类型的计算机中应用比较多。[3]

    编译原理C语言编译器前端设计

    编译过程一般是在计算机系统中实现的, 是将源代码转化为计算机通用语言的过程。编译器中包含入口点的地址、名称以及机器代码。编译器是计算机程序中应用比较多的工具, 在对编译器进行前端设计时, 一定要充分考虑影响因素, 还要对词法、语法、语义进行分析。[3]

    1 词法分析[3]

    词法分析是编译器前端设计的基础阶段, 在这一阶段, 编译器会根据设定的语法规则, 对源程序进行标记, 在标记的过程中, 每一处记号都代表着一类单词, 在做记号的过程中, 主要有标识符、关键字、特殊符号等类型, 编译器中包含词法分析器、输入源程序、输出识别记号符, 利用这些功能可以将字号转化为熟悉的单词。[3]

    2 语法分析[3]

    语法分析是指利用设定的语法规则, 对记号中的结构进行标识, 这包括句子、短语等方式, 在标识的过程中, 可以形成特殊的结构语法树。语法分析对编译器功能的发挥有着重要影响, 在设计的过程中, 一定要保证标识的准确性。[3]

    3 语义分析[3]

    语义分析也需要借助语法规则, 在对语法单元的静态语义进行检查时, 要保证语法规则设定的准确性。在对词法或者语法进行转化时, 一定要保证语法结构设置的合法性。在对语法、词法进行检查时, 语法结构设定不合理, 则会出现编译错误的问题。前端设计对精确性要求比较好, 设计人员能够要做好校对工作, 这会影响到编译的准确性, 如果前端设计存在失误, 则会影响C语言编译的效果。[3]

    编译原理C语言编译器总体设计

    C语言编译器是一种先进的设备, 其可以将繁琐复杂的程序转换为机器语言, 具有化繁为简的功能, 在对C语言编译器进行划分的过程中, 需要了解语法构成原理, 设计人员需要灵活掌握语言语法知识, 还要应用C语言代码转化方式, 在对C语言编译器进行总体设计时, 需要从以下几个方面入手。[3]

    1 词法分析[3]

    C语言程序具有一定的复杂性, 语法分析是编译的初级阶段, 这一过程主要是对词法进行扫描, 所以词法分析阶段, 编译器也被用作是扫描器, 其主要的任务是将源程序中的字符进行连接, 并且对其中的词语进行识别, 并且对词汇进行转化, 将其转换为内部编码, 并且对其语法进行分析与标记。单词符号在编译的过程中, 一般会被转化为二元式, 单词类别主要有二进制、分隔符、单词等, 计算机在正常工作时, 会通过扫描器自动完成词法扫描工作, 这一过程也会自动将注释进行删除, 会将源程序中的单词进行自动识别, 还会将其转换为内部编码。从工作方式角度来分析, 编译流程与语法属于两种接口方式, 若是从功能上讲, 编译器词法分分析的过程主要就是将相应的字符源程序进行转换处理, 从而变成单词串的形式。[3]

    2 语义分析[3]

    将编译程序转换为一种内部表现形式后, 我们将该种内部表现形式称之为中间语言或者是中间代码, 它含义明确、结构简单, 属于一种记号系统。比如一些编译程序, 基本上没有中间代码, 但是为了在实际应用中, 确保机器的独立运行, 易于实现目标代码的优化, 在许多的编译程序中均设置了中间语言。这种中间语言介于机器语言和源程序语言中, 程序相对复杂, 而C语言编译器却在很大程度上改变以上现状, 其语义分析和语法分析相对成熟, 理论和算法比较完善, 可仍旧存在的问题是没有公认的形式系统, 中间代码仍旧接近于形式化的方法。[3]

    3 语法分析[3]

    语法分析主要是以单词串形式的源程序作为分析与输入对象, 其最为根本的目标和任务就是为了以设计语言的语法规则为标准, 对源程序的语法结构进行具体的分析, 根据设计语言的语法规则, 对组成这些源程序的语法成分进行分析, 如函数、下标变量、各种程序语句、各种表达式等等, 并且要通过正确性的语法检查, 将中间代码进行阶段处理。但是要注意的一点是根据需要进行了归约处理, 必然存在着相应语法错误, 那么可以将其中全部输入的符号删除, 改变上述格局, 进行移进和归约分析, 并且在此基础上, 不断地寻找一个相应的策略, 从而形成有效的语法分析方法。[3]

    编译原理编译原理课程

    编辑

    《编译原理》作为计算机专业的一门重要专业课程, 是日后深入研究专业领域知识的基础。这门课作为计算机科学与技术的专业课, 融合了离散数学、数据结构、操作系统、计算机组成原理等多个学科的知识, 属于综合性与理论性较强的一门课, 由于编译原理课程内容的以上特点, 目前在实验教学中仍存在一些问题。编译原理实验部分若要设计制作完整的编译器, 实验周期长, 涉及的模块较多, 各模块间衔接较复杂, 不易立即看到整体效果。[4]

    编译原理传统编译原理课程教学中存在的问题

    计算机类专业本科生学习本专业的第一门语言课程是C语言。C语言由于其类型不安全性, 容易出现一些难以捉摸的错误, 使得学生难以定位和解决问题。如果能让学生根据编译器提供的提示信息, 精确定位程序中的错误类型和位置, 把编译原理中所学用于实际C语言编程需求, 这既完成了课程的教学内容, 也提升了学生的软件编程和系统分析的能力。[5]

    从普通高等院校的编译原理教学实际出发, 其课程覆盖范围一般仅限于编译器的前端, 即词法分析、语法分析和语法制导翻译等内容。这其中包括大量抽象且逻辑复杂的理论知识点, 如形式语言理论、正规式、有限自动机、上下文无关文法、属性文法和语法制导翻译等。传统的教学方式强调知识点的灌输, 让学生解决孤立的单一问题, 缺乏各知识点之间的关联。这种“只见树木, 不见森林”的教学方式会极大地削弱学生的学习积极性, 导致整体效果不佳。[5]

    编译原理以实践为导向的互助式编译原理教学

    (一) 理论与实践相衔接[6]

    理论知识的来源一般都有其确定的问题背景。脱离实际问题来进行理论教学, 对学生实际能力的提升没有益处。编译原理课程中的大量理论知识, 存在一种衔接递进的关系, 每个知识点的引入和拓展, 都是对于现实遇到问题的解决路径再现。因此, 整个授课过程就在重现这种解决方案演变的变化历程。而实现这一目标的关键之处, 是教师从之前的“站到讲台前”变到现在的“坐在学生中”。这一变化绝不仅仅是简单地将所有问题留给学生, 从“讲授”变成“答疑”, 而是从问题设计、思考启迪、讨论引导到过程管理等各方面都对教师提高了要求。特别是现代高级语言发展日新月异, 各种新问题层出不穷, 如何在面对开放性的未知问题时, 从系统和整体的角度给出学生解决问题的方式方法, 而不是给出具体每个问题的回答, 这是对教师能力的一种新考验。[6]

    (二) 编译器设计实现方案[6]

    编译原理课程教学理想情况, 学生应该能够独立自主完成小型编译系统的构造。实际教学中, 学生只需吃透关键的几条原理知识, 如NFA的确定化, LL (1) 文法中FIRST和FOLLOW集合的构造,LR (1) 文法中识别活前缀DFA构造等, 基本上已经满足了课程考试要求。然而, 仅靠理论学习对实现一个基础编译器来说是远远不足的。相比较于学生对理论知识的接受程度, 学生自主动手完成编译系统的能力缺乏就更为明显。如何面对全体学生, 制定出一套适用的实践方案, 是课程实际效用的关键。[7]

    编译原理编译技术的发展

    编辑

    在早期冯诺依曼计算机时期 (20世纪40年代) 程序都是以机器语言编写, 机器语言就是实际存储的01代码, 编写程序是十分枯燥乏味的。后来汇编语言代替机器语言一符号形式该处操作指令和地址编码。但汇编语言仍有许多缺点, 阅读理解起来很难, 而且必须依赖于特定的机器, 如果想使编写好的程序在另一台计算机上运行必须重写。在20世纪50年代IBM的John Backus带领一个研究小组对FORTRAN高级语言及其编译器进行开发。编译程序的自动生成工具初现端倪, 现在很多自动生成工具已经广泛使用例如语法分析工具LEX, 语言分析程序YACC等。在20世纪60年代人们不断的用自编译技术构造编译程序, 即用被编译的语言本身来实现该语言的编译程序, 但其基本原理和结构大体相同。经过不断发展现代编译技术已经较为成熟, 多种高级语言发展迅速都离不开编译技术的进步。[2]

    编译原理编译的基本流程

    编辑

    编译可以分为五个基本步骤:词法分析、语法分析、语义分析及中间代码的生成、优化、目标代码的生成。这是每个编译器都必须的基本步骤和流程, 从源头输入高级语言源程序输出目标语言代码。[2]

    1 词法分析[2]

    词法分析器是通过词法分析程序对构成源程序的字符串从左到右的扫描, 逐个字符地读, 识别出每个单词符号, 识别出的符号一般以二元式形式输出, 即包含符号种类的编码和该符号的值。词法分析器一般以函数的形式存在, 供语法分析器调用。当然也可以一个独立的词法分析器程序存在。完成词法分析任务的程序称为词法分析程序或词法分析器或扫描器。[2]

    2 语法分析[2]

    语法分析是编译过程的第二个阶段。这阶段的任务是在词法分析的基础上将识别出的单词符号序列组合成各类语法短语, 如“语句”, “表达式”等.语法分析程序的主要步骤是判断源程序语句是否符合定义的语法规则, 在语法结构上是否正确。而一个语法规则又称为文法, 乔姆斯基将文法根据施加不同的限制分为0型、1型、2型、3型文法, 0型文法又称短语文法, 1型称为上下文有关文法, 2型称为上下文无关文法, 3型文法称为正规文法, 限制条件依次递增。[2]

    3 语义分析[2]

    词法分析注重的是每个单词是否合法, 以及这个单词属于语言中的哪些部分。语法分析的上下文无关文法注重的是输入语句是否可以依据文法匹配产生式。那么, 语义分析就是要了解各个语法单位之间的关系是否合法。实际应用中就是对结构上正确的源程序进行上下文有关性质的审查, 进行类型审查等。[2]

    4 中间代码生成与优化[2]

    在进行了语法分析和语义分析阶段的工作之后, 有的编译程序将源程序变成一种内部表示形式, 这种内部表示形式叫做中间语言或中间表示或中间代码。所谓“中间代码”是一种结构简单、含义明确的记号系统, 这种记号系统复杂性介于源程序语言和机器语言之间, 容易将它翻译成目标代码。另外, 还可以在中间代码一级进行与机器无关的优化。[2]

    5 目标代码的生成[2]

    根据优化后的中间代码, 可生成有效的目标代码。而通常编译器将其翻译为汇编代码, 此时还需要将汇编代码经汇编器汇编为目标机器的机器语言。[2]

    6 出错处理[2]

    编译的各个阶段都有可能发现源码中的错误, 尤其是语法分析阶段可能会发现大量的错误, 因此编译器需要做出错处理, 报告错误类型及错误位置等信息。[2]

    编译原理编译过程概述

    编辑

    C语言的源程序和对应的可执行程序执行时在内存中的运行结构,实现这一转换的最主要的过程就是编译。[8]

    源程序是给人看的,本质上就是文本文件,可以用Linux中的vi或Windows中的记事本之类的文本编辑程序打开、编写,但计算机无法直接执行源程序,需要通过一个专门的程序将源程序编译为计算机可执行程序,这个专门的程序就是编译器。编译过程主要分为词法分析、语法分析、中间代码生成、目标代码生成(忽略预处理、语义分析、优化等)。下面我们依次简要讲解编译的主要过程。[8]

    编译原理词法分析

    人眼中看到的源代码是这样的:[8]
int fun(int a,int b);

    int m=10;

    int main()

    
{

    
   int i=4;

    int j=5;

    m = fun(i,j);

    return 0;

    
}

    
int fun(int a,int b)

    {

    int c=0;

    c=a+b;

    return c;

    
}

    而它在计算机中存储的形式如图1-36所示。[8]

    bb4117a18cf998a2ad567069616163a5.png

    图1-36 案例程序的十六进制形式[8]

    这里看不出关键字、运算符、标识符,甚至看不出哪几个字符属于同一个符号。编译的第一阶段是词法分析,目的就是在连续的字符中识别出一个一个的符号,并尽可能地识别出符号的属性。[8]

    人们在看C语言源程序时,借助空格、括号等一眼就可以看出标识符、关键字。与人相比,现在计算机的智能还是相当低的,无法像人那样同时看多个字符,只能依据一个非常机械的“电子版”词法,一个字符一个字符地识别。“电子版”词法是将状态转换图的思路融汇在词法分析器的代码中得以体现的。词法分析器从源程序的字符串中识别出一个个符号(token),并按序保存。[8]

    词法分析的结果如图1-37所示。[8]

    072b0e49a743ff4cc8af9ad8b46fdc36.png

    图1-37 词法分析的结果[8]

    在词法分析阶段能够识别出一些符号的含义,它们包括关键字、数字、字符串、分隔符,这些符号的含义不需要其他符号的辅助就能确定本身的含义。比如,“int”一定代表整数类型,它不可能是一个变量名称,也不可能是一个运算符。[8]

    而另外一些符号需要通过前后的其他符号才能确定出准确含义。比如“m”,在词法阶段仅能判断这是一个标识符,但是如果不对所在的句做分析,就无法得知这个标识符代表一个变量还是一个函数。更多详细的信息需要对符号所在的句型做分析才能获得。这部分工作由语法分析来完成。[8]

    编译原理语法分析

    如果说词法分析的作用是从连续的字符中识别出标识符、关键字、数字、运算符并存储为符号(token)流,语法分析的作用就是从词法分析识别出的符号流中识别出符合C语言语法的语句。[8]

    因为计算机无法像人那样同时看多个标识符、关键字、数字、运算符,无法像人那样一眼看出这是一个函数声明,那是一个if语句,只能非常笨拙地一个符号一个符号去识别。与词法分析器有些类似,语法分析器也是依据用计算机表示的语法,一个符号一个符号地识别出符合C语言语法的语句。语法的计算机表示就是产生式。在语法分析器中把通过产生式产生的C语言语法映射成一套模板,并把这套模板融汇在语法分析器的程序中。语法分析器的作用就是将词法分析器识别出的符号(token)一个一个地与这套模板进行匹配,匹配上这套模板中的某个语法,就可以识别出一句完整的语句,并确定这条语句的语法。[8]

    我们以案例中“int fun(int a,int b);”这条函数声明语句为例描述这个过程,它与语句模板的匹配情景如图1-38所示。[8]

    64061db12dfea0f9b3e97e81d60c0c9c.png

    图1-38 fun函数声明语句与模板匹配的结果[8]

    这段token流最终与函数声明模板相匹配,在匹配成功后,计算机就认为此语句为函数声明语句,并以语法树的形式在内存中记录下来,情景如图1-39所示。[8]

    60fe9bc961ad30030e1f42c2cb4a9586.png

    图1-39 fun函数声明语句生成的语法树[8]

    以树型结构来记录分析出的语句是一个非常巧妙、深谋远虑、通盘考虑的选择。一方面,树型结构能够“记住”源程序全部的“意思”,另一方面,树型结构更容易对应到运行时结构。[8]

    编译原理从语法树到中间代码再到目标代码

    至此,语法树已经承载了源程序的全部信息,后续的转换工作就和源程序没关系了。[8]

    如果希望一步到位,从语法树转换为目标代码,理论上和实际上都是可行的。但计算机存在多种CPU硬件平台,考虑到程序在不同CPU之间的可移植性,先转换成一个通用的、抽象的“CPU指令”,这就是中间代码最初的设计思想。然后根据具体选定的CPU,将中间代码落实到具体CPU的目标代码。[8]

    语法树是个二维结构,中间代码是准一维结构,语法树到中间代码的转换过程,本质上是将二维结构转换为准一维结构的过程。中间代码特别是RTL已经可以和运行时结构一一对应了。如图1-40所示。[8]

    aeef6f7aa41bba011efceab6c6997093.png

    图1-40 中间代码与目标代码对应的情景示意[8]

    运行时结构也是一维的,图1-40左侧部分的转换结果将更贴近运行时结构。[8]

    选定具体的CPU、操作系统后,中间代码就可以转换为目标代码——汇编代码(我们配置的是AT&T汇编),这时操作系统的影响还比较小。然后由汇编器依照选定操作系统的目标文件格式,将.s文件转换为具体的目标文件,对于Linux而言是.o文件,对于Windows而言是.obj文件。目标文件中已经是选定的CPU的机器指令了。[8]

    最后链接器把一个或多个目标文件(库文件本质上也是目标文件)链接成符合选定操作系统指定格式的可执行文件。[8]

    通过操作系统,可执行程序就可以被载入内存执行,形成前两节我们所看到的运行时结构。[8]

    本书后续内容将详细讲解编译的主要过程:词法分析、语法分析、中间代码到目标代码,然后是汇编与链接,最后讲解预处理。[8]

    词条图册

    更多图册

    参考资料

    2.

    刘雪飞.浅谈编译原理[J].中外企业家

    .中国知网.2018-01-25[引用日期2020-04-23]

    4.

    万新燕,时招军.编译原理实验教学设计[J].教育教学论坛

    .中国知网.2019-02-20[引用日期2020-04-23]

    6.

    蒋宗礼.编译课程教材建设[J].计算机教育

    .中国知网.2007-06-10[引用日期2020-04-12]

    8.

    新设计团队.编译系统透视:图解编译原理:机械工业出版社,2016-01

    展开全文
  • 具体可以参见《编译原理与实践》的109页和前边的自顶向下分析思路。差不多就是一个直接翻译的过程,实际上计算机是可以用LEX自动 完成这一步骤的,这也是为什么DFA取名有限自动机的原因,是可以自动完成匹配的,人工...
  • 编译原理概述——基本知识要点汇总,主要翻译程序、编译程序、解释程序、汇编程序几个概念进行区分和总结,并编译过程及编译程序的基本结构、编译程序的生成方法做出归纳
  • 编译原理】理解BNF

    千次阅读 2021-01-20 14:23:28
    这个可以自己着源码理解,代码中的缩进就是一种树层次的体现。 BNF范式 BNF范式本质上就是树形分解,很简单嘛。 前端代码解析的难点就在于BNF,对于数学不敏感的人来说,看到公式就很烦(像我一样)。那么我们...
  • 通过这次的程序实验我对编译原理这门课程了进一步的深层次了解,而且在自已动手体验的情况下,更加透彻地理解了词法分析的过程。在设计过程中,要发扬团体合作的精神,互帮互助,共同进步。善于发问,善于思考。
  • 本系列为个人编译原理学习笔记,谬误之处恳请高人指点,感激不尽!内容整理自西安电子科技大学 王小兵、张南、鱼滨老师的编译原理课程。编译器的工作步骤在开始说任何东西之前,我们先来大致看一下编译器是怎么工作...
  • 编译原理初学者入门指南

    千次阅读 2021-01-20 18:00:00
    其实自打 C 语言从贝尔实验室走出来之后,“研” 究这一步就已经完成大半了,于是被下放到 “” 校,了《编译原理》这门课程,最后流入 “产” 业中大规模应用。 所以这篇文章主要从两方面给初学者(尤其是跟我...
  • 那么Java编译到底是什么原理?下面可以通过javac命令将Java程序的源代码编译成Java字节码,即我们常说的class文件。这是我们通常意义上理解的编译。但是,字节码并不是机器语言,要想让机器能够执行,...
  • 编译原理词法分析器实验报告2009~2010学年 第二学期 2007级 软件工程专业班级 学号 姓名:应慧杰实验目的:结合课堂上学习的理论知识,通过C++实现词法分析器,更加深入的掌握词法分析;同时也可以更加了解词法分析...
  • 《消除左递归-编译原理实验》由会员分享,可在线阅读,更多相关《消除左递归-编译原理实验(28页珍藏版)》请在人人文库网上搜索。1、编译原理实验报告实验名称:消除左递归______________实验时间:2015-05-27_______...
  • 郭晓刚译,人民邮电出版社 文章目录 【编译原理学习笔记 第5章 自上而下语法分析 【编译原理学习笔记 第3章 穷自动机与正规文法(构造词法配置器与正则表达式引擎) 【编译原理学习笔记 第2章 形式语言概论 ...
  • 那我们这学期要开始学习编译原理计算机组成原理还有.netC#开发,还有Android开发,我天,都是大课,而且都是老重要的专业课,那为了能够加深课程学习知识的印象,所以我决定试一试,看自己能坚持多久,那这次开坑...
  • 编译原理教学日历

    2021-06-30 10:22:15
    课程名称:编译原理 专业班级:1 开课教研室: 软件工程教研室 主讲教师: 辅导教师: 2017—— 2018 学年 第 二 学期 教 计 划 时 数 及 其 它 讲课学时 58 习题课、课堂讨论 6 课程设计 0周 周 时 5 实验、...
  • 编译原理实验课程设计 -词法语法分析综合设计 1 概述 通过C++实现词法语法综合分析,可以通过用户输入判断用户所需要实现的功能,做出相对应的操作。 2 实验目标 理解并掌握词法,语法分析的原理与方法。 能够使用...
  • 整个过程中,最为困难的就是整个编译过程的设计。在这里整理一下我的整个从设计到实现过程以及中间出现的问题。问题描述假定一种高级程序设计语言中的单词主要包括关键字begin、end、for、if、then、else;标识符...
  • 编译原理及实践教程》第一章学习笔记课后习题 课后习题 解释下列术语。 答: 翻译程序:是一种系统程序,它将计算机编程语言编写的程序翻译成另外一种计算机语言的一般来说等价的程序,主要包括编译程序和解释...
  • 手工编码实现 相对复杂,且容易出错,是目前非常流行的实现方法(GCC,LLVM…) 词法分析器的生成器(自动) 可快速原型、代码量较少,但难以控制细节 2.2 词法分析—正则表达式 正则表达式的NFA和DFA可以供学习 正则...
  • 编译原理的概念总结

    2021-01-27 17:10:05
    Extended Backus-Naur Form)是表达作为描述计算机编程语言和形式语言的正规方式的上下文无关文法的元语法符号表示法。它是基本巴克斯范式(BNF)元语法符号表示法的一种扩展(精确描述语言的一种语言,所以称为元...
  • 什么是编译器? 计算设备包括个人计算机、大型机、嵌入式系统、智能设备等。 核心的问题都是软件的构造 而目前绝大部分软件都由高级语言书写 成百种高级语言 这些语言是如何运行在计算机系统上的? 编译器 ...
  • 编译原理课件.ppt

    2021-07-28 03:46:41
    TRANSLATER为什么****编译原理程序设计语言是计算机软件专业的重要核心****编程的历程:C语言--汇编语言--数据结构Monday, July 03, 2017编译原理什么****编译原理必修主干课程,操作系统和编译系统构成...
  • 1-1 学前方向标1.mp4* j8 f- ... U% Z* Q1-2 课程中的工具以及学习方法.mp4' W6 _7 s2 n- Eh; ?2 l* ]( tu6 q. d+ r2-1 什么是计算机.mp4% o/ l! k* z/ s! d4 q: b7 c; ], T! D, _. `6 ~2-2 CPU的工作原理――内存、...
  • 一直想找本书,能在机器学习复杂的算法原理和高效的编程实战之间达到合适的平衡:让感兴趣的同学拿到就能用的代码,还有基本原理的介绍,因为了解原理才知道什么时候用什么算法最合适,以及如何调整参数。...
  • 编译原理课程设计-简单计算器实现课程设计报告课程:编译原理学号:姓名:班级:11级嵌入式应用技术班教师:时间:2014年6月计算机科学与技术系设计名称:简单计算器的实现设计内容、目的与要求:设计内容:计算器的...
  • 『易坊知识库摘要_编译|编译原理词法分析器实验报告』二、实验内容及要求1根据状态转换图直接编程编写一个词法分析程序,它从左到右逐个字符的源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件...
  • 作者:神说要有光原文地址:https://zhuanlan.zhihu.com/p/356806174本文是 @神说要有光 对编译小白 ssh 的一次答疑解惑,很适合零基础的新手第一次了解...
  • 编译原理 之 解释器

    2021-05-24 21:15:07
    1. 人的语言最终转换成机器语言 2. 解释器 解释器是一种计算机程序,把源代码翻译成相对更加高效率的中间码...然后在后面交由解释器(这里通常指编程语言的虚拟机)解释执行,省去前面预编译的开销。 机器码 Machin
  • 编译原理学习笔记

    2021-12-09 18:22:13
    第一课 ​ 编译(compilation , compile) 1、利用编译程序从源语言编写的源程序产生目标程序的过程。...主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现语法错误,给出提示信息。 ​ 编

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 127,517
精华内容 51,006
关键字:

学编译原理对编程有什么好处