首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏HAUE_LYS'Blog

    编译原理:2. 词法分析

    词法分析并不很复杂,但是我们却使用能力强大的形式化方法和工具来实现它,因为类似的形式化方法对语法分析研究很有帮助,并且类似的工具还可以应用于编译器以外的其他领域。 任何单字母都能通至状态 2,因此单字母字符串是可被接收的字符串。从状态 2 出发,任何字母和数字都将重新回到状态 2,因此一个后跟任意个数字母和数字的字母也将被接收。 从状态 1 可以到达状态 2,从状态 4 可到达状态 5,从 状态 9 则无处可去,而从状态 14 则可以到达状态 15,由此得到状态集合 {2, 5, 15}。 因此这个 NFA 一定属于状态集合 {2, 5, 6, 8, 15}。 对于下一个输入字符 n,从状态 6 可到达状态 7,但状态 2、5、8 和 15 都无相应的转换。 因为原则上 DFA有 2^n 个状态, 但实际上我们一般找到的只有约 n 个状态是从初态可到达的。这一点对避免 DFA 解释器的转换表出现指数级的膨胀很重要,因为这个转换表是编译器的一部分。

    1.4K21编辑于 2023-09-04
  • 来自专栏golang分享

    编译原理

    编译,其实就是把源代码变成目标代码的过程。如果源代码编译后要在操作系统上运行,那目标代码就是汇编代码,我们再通过汇编和链接的过程形成可执行文件,然后通过加载器加载到操作系统里执行。 如果编译后是在解释器里执行,那目标代码就可以不是汇编代码,而是一种解释器可以理解的中间形式的代码即可。 编译器翻译源代码,也需要经过多个处理步骤 词法分析(Lexical Analysis) 在编译之前,源代码只是一长串字符而已,这显然不利于编译器理解程序的含义。 带有标注信息的 AST 在语义分析阶段,编译器会做语义理解和语义检查这两方面的工作。词法分析、语法分析和语义分析,统称编译器的前端,它完成的是对源代码的理解工作。 ,而计算机语言的处理基本上都是在2型文法和3型文法的层面上,只有涉及意义处理才会做一些1型文法层面的事儿。

    5.4K81编辑于 2023-11-30
  • 来自专栏进步集

    编译原理

    基本方法b 对任何输入串,试图从开始符号出发, 自上而下地为输入串建立一棵语法树,或者说为输入串寻找一个最左推导。 过程本质 某文法符号对应当前输入符号时,有唯一的产生式进行替换并向下推导。

    1.9K20编辑于 2022-11-13
  • 来自专栏程序人生 阅读快乐

    编译原理

    《编译原理》作者Alfred V.Aho、Ravi Sethi和Jeffrey D.Ullman是世界著名的计算机 科学家,他们在计算机科学理论、数据库等很多领域都做出了杰出贡献。 《编译原理》 是编译领域无可替代的经典著作,被广大计算机专业人士誉为“龙书”。 《编译原理》一 直被世界各地的著名高等院校和科研机构(如贝尔实验室、哥伦比亚大学、普 林斯顿大学和斯坦福大学等)广泛用作本科生和研究生编译原理与技术课程的 教材,《编译原理》对我国计算机教育界也具有重大影响 书中深入讨论了编译器设计的重要主题,包括词法分析、语法分析、语法制 导分析、类型检查、运行环境、中间代码生成、代码生成、代码优化等,并在 最后两章中讨论了实现编译器的一些编程问题和几个编译器实例,而且每章都

    2.6K20发布于 2018-10-10
  • 来自专栏前端之旅

    编译原理学习笔记-2:文法和语言

    在 上一篇笔记中,我们谈到了为什么需要编译以及编译的大致流程。在继续细讲每一个流程之前,我们先通过本篇笔记对一些概念和术语加以了解。 1. ∑* = {ε,a,b,ab,ba,aba,aab......} = ∑^0 ∪ ∑^1 ∪ ∑^2 ∪......∪ ∑^n 要注意的是,闭包也包含了空符号串。 (2)VN: VN 指的是非终结符集合。非终结符即 nonterminal symbol,它是用来表示语法成分的符号,有时候也称为“语法变量”。 (2)推导: 推导指的是从文法的开始符号出发,反复连续地使用产生式,对非终结符施行替换和展开,最终得到一个仅由终结符构成的符号串,推导过程的每一步都是一个直接推导。 (3) 2 型文法 在 1 型文法的基础上加以限制,规定对于每一个 α→β,都必须满足 α 是一个非终结符。也就是说,产生式左部必须得是一个非终结符。 2 型文法也叫上下文无关文法。

    2.8K21发布于 2020-03-23
  • 来自专栏黯羽轻扬

    再看编译原理

    编译器 编译器也是个程序,可以阅读某一种语言(源语言)编写的程序,并把该程序翻译为一个等价的,用另一种语言(目标语言)编写的程序。 C语言编译得到可执行的二进制程序 中间字节码,例如Java编译得到面向JVM的.class文件 字符串,例如经Babel转过的JavaScript代码 其实就是翻译,比如从字符串编译到机器码,就是把人能理解的代码语言翻译成机器能 = id3 * t1 t2 = id2 + t2 id1 = t3 代码优化 分为两类: 机器无关优化:针对中间表示的优化,以生成更好的目标程序,比如Closure Compiler对JS代码做的一些优化 , R2, #60.0 LDF R1, id2 ADDF R1, R1, R2 STF id1, R1 用了2个寄存器R1和R2,读入id3放到R2里,再与60.0相乘,把乘积放到R2里……最后把R1的值被放到 实际实现中,这些环节并不一定都有清晰的边界,而是尽量一趟完成多道工序,以提高性能 参考资料 《编译原理》(龙书 第二版) http://infolab.stanford.edu/~ullman/dragon

    2.8K40发布于 2019-06-12
  • 来自专栏算法之名

    编译原理整理

    3、编译原理 所有高级语言的建立,最终都是要将其转化成机器语言,这是一个翻译的过程,我们称之为编译。 编译原理的"翻译"能力只能作用在形式语言上。所谓形式语言就是不能有特定的意义,比如"大唐李世民","机器猫",这些我们人可以理解,但是机器是不理解的,这就是一些特定的意义。 什么是编译器 ? 编译器将源程序编译成目标程序。编译成的目标程序才可以接受输出,产出输出,其代表为C语言 ? 什么是解释器 ? 解释器同时接受源程序和输入,执行并返回输出。 即时编译器(Just-in-time compiler) 一种提高效率的方法,中间代码不是直接执行,而是先被编译成机器码再执行。其代表为现在的Java。 交叉编译 ? 在一个平台上编译产生多个平台的可执行代码。 我们现在来模拟一门新的语言,让其转化为Java。

    2.5K30发布于 2020-06-02
  • 来自专栏第一专栏

    编译原理4—6章案例复习总结【编译原理】

    4—6章总结 4、自上而下文法—LL(1)文法 (1)first集 (2)follow集 ——利用到select集 (3)select集 ——利用到first、select集合 (4)构造自上而下分析表 栈内只剩下第一个非终结符S为止 6、LR文法 状态 ACTION GOTO 0 … … 额,,不太像回事,,再来一张表 (1)分析句子–使用LR文法表 初始化—步骤从0开始,状态栈存放一个0,符号栈存放一个# (2)

    2K20编辑于 2023-05-25
  • 来自专栏嵌入式视觉

    编译原理基础

    Contents 1 GCC 是什么 2 gcc 与 g++ 的区别 3 Clang 是什么 4 MinGW是什么 5 GTK 是什么 6 GNU 是什么 7 GNU工具链是什么 GCC 是什么 GNU GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。 原名为GNU C语言编译器(GNU C Compiler),因为它原本只能处理C语言。 简单来说,gcc 指的是 GCC 中的 GNU C Compiler(C 编译器);g++ 是 G++ 中的 GNU C++ Compiler(C++ 编译器),但实际上 gcc 和 g++ 都不是编译器 它的目标是提供一个GNU编译器套装(GCC)的替代品,支持了GNU编译器大多数的编译设置以及非官方语言的扩展。 自2019年2月6日起,GTK+ 改名为 GTK。 GTK 使用 C 语言开发,但是其设计者使用面向对象技术。

    3.2K10编辑于 2022-09-05
  • 来自专栏梧雨北辰的开发录

    iOS编译原理

    ,调试周期长、跨平台性差些; 代表语言:C、C++、OC等; 2.解释型语言 程序运行前,不需要进行编译,而是以文本方式存储程序代码,运行时需要解释器解释后再运行; 程序执行效率低下,但是程序具有动态性 ,运行后也可以随时增加和更新代码来改变程序逻辑; 代表语言:Javascript、Python等; 编译原理-语言的分类 三、编译器LLVM与CLang 1.编译器 概念:把一种编程语言(原始语言)转换为另一种编程语言 ,使得前后端可以独立的变化,互不影响; 这样的好处在于:新增一门语言只需要修改前端,而新增一种CPU架构只需要修改后端即可; 2.LLVM与Clang LLVM是苹果当前使用的编译器: LLVM是一套编译器基础设施项目 、编译、汇编、链接四个关键阶段,具体的流程如下图: 编译原理-编译流程 2.准备测试文件 以OC语言为例,详细分析代码的编译流程,准备一个main.m文件的内容如下: #import <Foundation :处理#if、#ifdef,#endif等类似的条件编译; 添加行号和文件名标识:以便于编译时编译器能够显示警告和错误的所在行号; 2.查看预处理结果 使用xcrun命令,在终端执行预处理操作: xcrun

    4.1K20发布于 2021-11-24
  • 来自专栏机器学习炼丹之旅

    编译原理:第一章 编译原理引论

    一、编译程序和解释程序 1.1 定义 编译程序最初的定义是把一种高级语言设计的源程序(面向人的)翻译成另一种等价的低级程序设计语言(面向硬件的)即机器语言或汇编语 1.2 程序执行方式 程序设计语言源程序的执行基本有两种方式 image-20210903105011271.png 1.4 高级语言程序的处理过程 image-20210903105656311.png 二、编译过程和编译程序的结构(重点) 2.1 编译过程概述 count; sum=first+count*10; } 翻译成如下的四元式序列(中间代码): (操作符,左操作数,右操作数,存储位置) (1) (inttofloat, 10, _, T1 ) (2) ( *, count,T1,T2 ) (3) ( +, first,T2,T3 ) (4) ( =, T3, _, sum) 其中,Ti为语义分析程序为存放中间结果而生成的临时变量 (动态) 报告出错信息和位置 处理和恢复 2.2 编译程序结构 image-20210908142606225.png 2.3 编译阶段的组合 2.3.1 前段和后端的概念 有时,

    2.6K10编辑于 2022-08-09
  • 来自专栏北洋csdn

    看懂编译原理:优化范围 & 原理

    优化目标原理分别是什么? 可以分为本地优化,全局优化,过程间优化 本地优化是_**针对基本快进行的(针对顺序的执行顺序)优化。 可以看到这三个范围越来越大:一个函数里面的一个基本快,一个函数里的多个基本快,多个函数 常见的本地优化场景有哪些,原理和做法是什么? 有些基本快分支一直不会运行,删除 公共子表达式删除:对于同一个表达式的变量,可以直接使用结果删除不必要的重复计算 删除无用变量和无用表达式(这里的无用表达式指的和上面不一样,这里特殊指代无用变量的表达式) 原理和做法是什么 删除不可达基本快和子表达式还有常熟折叠,代数优化的原理 是顺序遍历程序指令。 做法就是顺序遍历指令(如一图的子表达式删除和拷贝传播技术) 活跃性分析:删除无用变量和无用变量的计算表达式的原理是利用变量的活跃度分析进行检测。

    2.1K10编辑于 2023-12-07
  • 来自专栏佳爷的后花媛

    编译器的结构|编译原理

    正文之前,附上一点关于昨天编译器和解释器的思考: 编译器和解释器之间的区别是什么? 编译器相对于解释器的优点是什么?解释器相对于编译器的优点是什么? 在一个语言处理系统中,编译器产生汇编语言而不是机器语言的好处是什么? 把一种高级语言翻译成另一种高级语言的编译器称为源到源(source to source )的翻译器,编译器使用C语言作为目标语言有什么好处? 描述一下汇编器所要完成的一些任务。 今天的内容是冠以编译器的结构。 综合部分: 综合部分根据中间表示和符号表中的信息来构造用户期待的目标程序,分析部分经常被称为编译器的前端,而综合部分称为后端。 ? 一个编译器的各个步骤 ? 一个赋值语句的翻译 ?

    2.9K20发布于 2020-04-24
  • 来自专栏学习之路

    编译原理 期末速成

    翻译程序 vs 编译程序 翻译程序的三种方式 编译:将高级语言编写的源程序翻译成等价的机器语言或汇编语言。 编译程序的五个阶段 词法分析:对源程序的字符串进行扫描和分解,识别出每个单词符号。 语法分析:根据语言的语法规则,把单词符号分解成各类语法单位。 问题:源代码中括号不匹配的错误一般在编译的哪个阶段(采用五阶段划分模型)被检查出来,简述这一阶段的名称和主要任务 名称:语法分析 主要任务:读取词法符号,进行语法分析,判断源程序是否符合程序语法,并生成抽象语法树或语法符号 语法分析树 编译原理笔记9:语法分析树、语法树、二义性的消除 语法分析树是语言推导过程的图形化表示方法。这种表示方法反映了语言的实质以及语言的推导过程。 )) 2--->|a, b|2 3.

    2.4K10编辑于 2025-05-25
  • webpack之编译原理

    webpack 的作用是根据入口文件将源代码编译(构建、打包)成最终代码。 中间经过webpack打包,打包的过程就是编译 整个过程大致分为三个步骤:初始化、编译(最重要)、输出 「初始化」 在初始化这个阶段webpack会将CLI参数、配置文件、默认配置进行融合,形成一个最终的配置对象 第2步:如果说模块记录表中有记录,说明模块已经加载过了。如果没有记录,那么会继续走下一步,说明该模块需要加载 检查 . 以上就是webpack编译过程,做这一切最终的目的就是形成一个模块记录表。 下面有个简图,经过上述编译过程之后会在chunk中通过入口文件加载形成多个模块,每个模块记录了转换之后的代码。 如果没有配置则使用main id:通常指chunk的唯一编号,如果在开发环境下构建,和chunkname相同;如果是生产环境下构建,则使用一个从0开始的数字进行编号 最后 若本文对于 webpack编译原理

    2.5K10编辑于 2023-12-29
  • 来自专栏shysh95

    Java编译原理(javac)

    Java中的编译分为两个部分: 源码文件编译成字节码文件(前端编译) 字节码文件被虚拟机加载以后编译成机器码(后端编译) 对于开发来说接触的一般都是第一个步骤也就是源码编译成字节码文件(class文件) 上述3个过程会包含前段编译4个步骤的所有流程,下面我们看一下这个3个步骤需要做什么。 2. int a = 1 + 2; 上述代码我们在语法树上可以看到字面量1、2以及操作符+,在经过常量折叠步骤以后,会生成一个新的字面量3,在程序运行时a的值就是3,不会再消耗CPU进行计算。 ,因此需要编译期的保证。 本期的Java前端编译介绍到这,我们下期再见!!!

    3.4K10发布于 2021-03-16
  • 来自专栏编程技术分享

    如何学习编译原理

    对于没有计算机科学基础知识的程序员或初学者来说 一上来就看龙书 虎书是行不通的 全是理论知识 看得想睡觉 我还试过看网易云大学计算机专业的编译原理课程 也是看得一头雾水 看到80多讲就看不下去了 另外 SICP(计算机程序的构造和解释)这本很多人推荐的书其实并不适合初学者 前3章和后面几章难度差别有点大 可能是自己水平不行 看SICP解释器和编译器那两章也是看不懂 虽然强迫自己看完 但是最后还是不懂编译原理到底是怎么回事 不过 后来我还是通过学习一本书的知识 写出来了一个简单的编译器 注意 是真正动手写出来了一个编译器 不是停留在理论阶段 这本书简单 通俗易懂 对计算机体系知识有一个较全面的介绍 而你只需要会一门编译语言就行了 它就是 《计算机系统要素》 这本书前面5章讲的是硬件知识 虽然跟编译原理没什么关系 但是对于了解计算机硬件知识是很有用的 重点是通俗易懂 后面的章节就是和编译原理有关的知识了 书里的内容介绍了 汇编编译器 最终写出了一个编译器 算是对编译原理有了一个比较全面但不深入的了解吧 这个时候再去看龙书 虎书 就不会感觉很吃力了 附上我完成这本书所有项目的答案 https://github.com/woai3c/

    2.3K20发布于 2020-09-28
  • 来自专栏佳爷的后花媛

    编程语言|编译原理

    关于昨天的思考: 编译器的各个步骤有哪些? 能否省略其中某个步骤 编译器是怎样解析代码的? 什么是语法树? 怎样生成目标程序? 语义分析和语法分析有什么不同? 中间代码是怎么生成的? 编译器怎样记录源程序中使用的变量的名字? 编译构造工具有哪些? 今天的是讲一讲编程语言,为什么会有这么多不同的编程语言?为什么还会有新的编程语言? ? PROLOG 冯诺依曼语言 FORTRAN,C 面向对象语言 C++,C#,JAVA,Ruby 脚本语言 AWK,JavaScript ,Perl ,PHP,Python ,Ruby ,TCL 编程语言和编译器有关系么

    3.9K30发布于 2020-04-24
  • 来自专栏huofo's blog

    编译原理(1)总结

      本科是网络工程,由于没有学<<编译原理>>这门课,打算两个月把国科大的编译原理梳理完,把其中我认为的精髓概括一下,三天一篇,作为笔记。 编译程序还有以下分类: 诊断编译程序(Diagnostic Complier,帮助程序员排错) 优化编译程序(Optimizing Complier,提高目标代码执行效率) 交叉编译程序(Cross Complier 2020-11-30-00-31-52.png 二、为什么要学习编译原理 理解计算系统 设计计算系统 训练计算思维 抽象 自动化 问题分解 递归 权衡 保护、冗余、容错、纠错和恢复 利用启发式推理来寻求解答 原则:构词规则   工具:有限自动机 2. 语法分析   任务:在词法分析的基础上,根据语法规则把单词符号分解成各类语法单位(语法范畴)   原则:语法规则   工具:上下文无关文法 3. 2.使用汇编语言 优点:机器指令语义化,有一定可读性。可针对具体机器,充分发挥计算机的系统功能(使用某些特殊指令)、生成的程序效率高。

    2.4K11编辑于 2022-03-17
  • 编译原理期末题型

    1)分成四种类型,即0型、1型、2型和3型。 (2)1型文法:若P中的每一个产生式α→β均满足|β|>=|α|,仅仅S->ε除外,则文法G是1型。(3)若P中的每一个产生式α→β满足:α是非终结符,β∈(VN∪VT),则此文法称为2型的。 2)如果文法G中的某个句子存在不只一棵语法树,则称该句子是二义性的。如果文法含有二义性的句子,则称该文法是二义性的 2. (2)文法的语言:文法是用于描述语言的语法结构的形式规则。文法描述的语言是该文法一切句子的集合。一个文法所描述的语言是唯一的。 5. 什么是文法的二义性? p(x); } 调用main,main的活动记录入栈,main中调用p函数,p的活动记录P1入栈,m>1,p调用q,q的活动记录入栈,q中调用p,p活动记录P2入栈,P2执行完毕,P2出栈,q执行完毕

    54210编辑于 2025-04-07
领券