编译原理复习笔记--简答题

news2024/11/15 16:31:06

1、编译过程概述

  • 词法分析:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个单词(也称单词符号,或简称符号)
  • 语法分析:在语法分析的基础上将单词序列分解成各类语法短语
  • 语义分析:审查源程序有无语义错误,为代码生成阶段收集类型信息。
  • 中间代码生成:在语法和语义分析后,将源程序变成一种内部表现形式
  • 代码优化:对前一阶段产生的中间代码进行变换或改造
  • 目标代码生成:将中间代码变换成特定机器上的绝对指令代码或汇编指令代码。 

2、什么是解释程序、编译程序

        解释程序是一个语言处理程序,它把一个高级语言程序翻译成某个机器的汇编语言程序或二进制代码程序,这个二进制代码程序在机器上运行以生成结果。

        编译程序是一种翻译程序,它能够把某种语言的程序转换成另一种语言的程序,而后
者与前者在逻辑上是等价的。

3、编译器(编译程序)的组成部分及其任务:

  • 词法分析器(扫描器):输入源程序,进行词法分析,输出单词符号;
  • 语法分析器(分析器):对单词符号串进行语法分析(根据语法规则进行推导或归约),识别出各类语法单位,最终判断输入串是否构成语法上正确的“程序”;
  • 语义分析与中间代码产生器:按照语义规则对语法分析器归约(或推导)出的语法单位进行语义分析并将其翻译成一定形式的中间代码;
  • 优化器:对中间代码进行优化处理;
  • 目标代码生成器:把中间代码翻译成目标程序;

4、什么是文法, Chomsky 文法分类。 

         文法 是一个四元组(V N,VT,P,S ,其中 VN为非终结符号集,VT为终结符号集,P 为产生式集,S 为开始符号。
按乔姆斯基分类,把文法分成四种类型:
         0 型(短语文法)
       1型 (上下文有关文法)
       2型(上下文无关文法)
       3型(正规文法)

5、上下文无关文法的组成部分: 

  • 终结符号:组成语言的不可再分的基本符号;
  • 非终结符:代表语法范畴,表示一定符号串的集合(由终结符与非终结符组成的串);
  • 开始符号:特殊的非终结符,代表所定义语言的语法范畴(句子);
  • 产生式:定义语法范畴的书写规则;

6、语法树 

句子的树结构表示法称为 语法树 ( 语法分析树或语法推导树 )
给定文法 G=(V N V T P S) ,对于 G 的任何句型都能构造与之关联的 语法树。这棵树具有下列特征:
  • 根节点的标记是开始符号 S
  • 每个节点的标记都是 V 中的一个符号。
  • 若一棵子树的根节点为 A,且其所有直接子孙的标记从左向右的排列次序为 A1A2…AR,那么 AA1A2…AR 一定是 P 中的一条产生式。
  • 若一标记为 A 的节点至少有一个除它以外的子孙,则 AVN
  • 若树的所有叶节点上的标记从左到右排列为字符串 w,则 w 是文法 G 的句型;若 w 中仅含终结符号,则 w 为文法 G 所产生的句子。

7、自底向上语法分析方法的基本思想

        对输入符号串 自左向右 进行扫描,并将输入符逐个移入一个后进先出栈中, 边移入边分析 ,一旦栈顶符号串形成某个句型的 句柄 时,就用该产生式的左部非终结符代替相应右部的文法符号串,重复这一过程直到归约到栈中只剩文法的开始符号时则为分析成功,也就确认输入串是文法的句子。

8、DFA与NFA的区别是什么?

  • NFA允许弧上出现ε
  • NFA 在某个状态面临输入符号时他会到达多个状态
  • DFA的起始状态是唯一的初始状态,NFA允许有多个初始状态

9、什么是句柄?什么是素短语?

一个句型的 最左直接短语 称为该句型的 句柄
素短语是这样的一个短语, 它至少 包含一个终结符并且不包含更小的素短语

10、LL(1)文法

若文法的任何两个产生式 A \rightarrow   \alpha | \beta 都满足下面两个条件:
1)FIRST(\alpha\bigcap FIRST(\beta ) = \Phi
2)若\beta\Rightarrow* \varepsilon  ,那么 FIRST(\alpha) \bigcap FOLLOW( A ) = \Phi
我们把满足这两个条件的文法叫做 LL(1)文法 ,其中的第一个 L 代表 从左向右扫描输入 ,第二个 L 表示 产生最左推导 1 代表在决定分析器的每步动作时向前看一个输入符号 。除了没有公共左因子外,LL(1) 文法还有一 些明显的性质,它不是二义的,也不含左递归

11、LR(0)分析器  

        所谓 LR(0) 分析,是指从左至右扫描和自底向上的语法分析,且在分析的每一步,只须根据分析栈当前已移进和归约出的全部文法符号,并至多再向前查看 0 个输入符号,就能确定相对于某一产生式左部符号的句柄是否已在分析栈的顶部形成,从而也就可以确定当前所应采取的分析动作 ( 是移进还是按某一产生式进行归约等)

12、符号表的功能,操作

符号表的功能:

  • 收集符号属性
  • 上下文语义的合法性检查的依据
  • 作为目标代码生成 阶段地址分配的依据

符号表上的操作:
(增删查改)查找、插入、删除、修改

13、代码优化、代码优化的主要技术。 

        优化就是对代码进行等价变换,使得变换后的代码运行把那间与变换前代码运行结果相同,而运行速度加大或占用存储空间少,或两者都有。
优化技术有:
        删除多余运算、代码外提、强度削弱、变换循环控制条件、合并已知量与复写传播、删除无用赋值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1369371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

海外代理IP在游戏中有什么作用?

随着科技的飞速发展,手机和电脑等电子产品已成为互联网连接万物的重要工具,深度融入我们的日常生活,我们借助互联网完成工作、休闲和购物等任务,以求提升生活质量。 不仅如此,网络游戏也是人们心中最爱,它…

Tensorflow2.0笔记 - 创建tensor

tensor创建可以基于numpy,list或者tensorflow本身的API。 笔记直接上代码: import tensorflow as tf import numpy as np import matplotlib.pyplot as plttf.__version__#通过numpy创建tensor tensor0 tf.convert_to_tensor(np.ones([2,3])) print(te…

贯穿设计模式-中介模式+模版模式

样例代码 涉及到的项目样例代码均可以从https://github.com/WeiXiao-Hyy/Design-Patterns.git获取 需求 购买商品时会存在着朋友代付的场景,可以抽象为购买者,支付者和中介者之间的关系 -> 中介者模式下单,支付,发货&#xff0…

Golang中for和for range语句的使用技巧、对比及常见的避坑

前言 基础语法不再赘述,写这个原因是之前的某次面试被问道了,我知道会导致问题但具体答下来不是很通顺。再回想自己开发过程中,很多地方都是使用到了for/for range,但是却从没注意过一些细节,因此专门学习一下进行记录…

手把手教你使用cubemx配置串口

重写fput函数 #include <stdio.h>#ifdef __GNUC__#define PUTCHAR_PROTOTYPE int _io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endif /* __GNUC__*//*******************************************************************brief R…

Kubernetes (八) 金丝雀发布

一. 金丝雀发布作用&#xff1a; 金丝雀发布是指在生产环境中逐步推出新版本应用程序&#xff0c;只在一小部分用户或流量中使用该版本&#xff0c;并根据反馈逐步扩…

扩展欧几里得算法总结

知识概览 裴蜀定理&#xff1a;对于任意正整数a&#xff0c;b&#xff0c;一定存在非零整数x&#xff0c;y&#xff0c;使得 而且(a, b)是a和b能凑出来的最小的正整数。 通过扩展欧几里得算法可以求得裴蜀定理中x和y的值&#xff0c;x和y的通解为 &#xff0c; 例题展示 扩展欧…

系列十三、集合

一、集合 1.1、概述 集合与数组类似&#xff0c;只不过集合中的数据量可以动态的变化。 1.2、体系图 1.3、List集合 1.3.1、特点 存放的数据可以重复且有序。 1.3.2、常见操作 /*** List集合常见操作* */ Test public void listOperateTest() {List<String> cityList …

vue3 +TS 安装使用pinia状态管理

目录 一.安装 1.下载安装依赖 2.创建src/stores/index.ts文件 3.创建src/stores/states.ts文件 4.创建src/stores/interface/index.ts文件 5.修改main.ts 6.目录结构如下 7.测试使用 8.去到首页点击按钮&#xff0c;打开控制台查看 一.安装 1.下载安装依赖 npm insta…

逆向数据宽度与符号

正数与负数的 刚好是半 所以 0 表示正数 1表示负数 有符号与无符号是程序员定的 并不是开头是1就表示负数 0表示正数 得看有无符号 双字 32bit 4字节

批量置入视频封面:一分钟教程,简单易学

在视频制作过程中&#xff0c;为视频添加引人注目的封面是吸引观众的关键。而当我们需要批量处理多个视频时&#xff0c;如何快速、准确地置入封面就显得尤为重要。本文将为您揭示这一高效技巧&#xff0c;让您在一分钟内学会批量置入视频封面&#xff0c;提升视频的吸引力与观…

C++学习笔记(二十七):c++ 动态数组vector及优化

c的动态数组vector是STL的内容&#xff0c;关于STL&#xff0c;有兴趣可自行网上搜索资料。本节主要介绍vector的基本内容以及vector的简单优化。vector当超过数组最大范围&#xff0c;需要往里面添加新的元素时&#xff0c;会在内存中创建一个比上一个更大的数组&#xff0c;将…

RT-Thread:ADC 框架应用,通过 STM32CubeMX 配置 STM32 ADC驱动

关键词&#xff1a;ADC,RT-Thread ADC,STM32 ADC应用 说明&#xff1a;本笔记是记录如何开启 RT-Thread 框架的ADC功能&#xff0c;使用系统自带的ADC函数&#xff0c;并通过 STM32CubeMX 配置 STM32 ADC驱动 。 1. 打开board.h 文件&#xff0c;找到ADC 使用配置的流程&…

CMake入门教程【核心篇】动态库与静态库的差别

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1.概述2.动态库(Shared Libraries)主要特点使用场景3.静态库(Static Libraries)主要特点

java继承Thread实现多线程

1、AdminController文件 package com.controller;import com.myThread.AdminThread; import org.springframework.web.bind.annotation.*;RestController CrossOrigin RequestMapping("/admin") public class AdminController{GetMapping("/{id}")public …

离线安装jenkins:使用rpm安装包

目录 一、安装jdk1.8二、安装yum软件包三、下载rmp安装包四、安装jenkins的rpm安装包五、创建jenkins文件目录六、设置环境变量七、配置jdk位置八、配置Jenkins配置文件九、启动Jenkins十、访问Jenkins十一、安装Jenkins插件 一、安装jdk1.8 根据博客Linux操作系统安装jdk1.8并…

Rollup-plugin-bundle-analyzer VS Rollup-plugin-visualizer

分析和可视化Rollup打包后的文件的插件 Rollup-plugin-bundle-analyzerRollup-plugin-visualizer Rollup-plugin-bundle-analyzer和Rollup-plugin-visualizer都是用于分析和可视化Rollup打包后的文件的插件&#xff0c;但它们在功能和使用方式上存在一些差异。 Rollup-plugi…

作业--day43

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数&#xff0c;将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c…

外包做了5个月,技术退步一大半了。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;20年通过校招进入深圳某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

麒麟操作系统缓存rpm包,制作离线yum源

缓存rpm包&#xff0c;以make为例 mkdir -p /data/yum yumdownloader --resolve --destdir/data/yum make制作离线yum包 yum install createrepo -y cd /data/yum createrepo .写yum配置文件/etc/yum.repos.d/local.repo [local-repo] namelocal-repo baseurlfile:///data/…