零碎知识点

文章详细阐述了编译过程的各个阶段,包括扫描程序、语法分析生成parsetree、语义分析、代码优化等。同时介绍了makefile在构建过程中的作用,系统调用的特性和执行模式,以及内联函数和死代码删除等编译优化技术。此外,还涉及了冯诺依曼体系结构、守护进程和Linux环境变量管理。
摘要由CSDN通过智能技术生成

编译链接

编译过程的哪个阶段完成后会产生parse tree“编译过程为扫描程序-->语法分析-->语义分析-->源代码优化-->代码生成器-->目标代码优化; 语法分析的结果为分析树parse tree或者语法树syntax tree”

  • 编译过程为 扫描程序-->语法分析-->语义分析-->源代码优化-->代码生成器-->目标代码优化;
  • 扫描程序进行词法分析,从左向右,从上往下扫描源程序字符,识别出各个单词,确定单词类型
  • 语法分析是根据语法规则,将输入的语句构建出分析树,或者语法树,也就是我们答案中提到的分析树parse tree或者语法树syntax tree
  • 语义分析是根据上下文分析函数返回值类型是否对应这种语义检测,可以理解语法分析就是描述一个句子主宾谓是否符合规则,而语义用于检测句子的意思是否是正确的
  • 目标代码生成指的是,把中间代码变换成为特定机器上的低级语言代码。

make / Makefile

makefile文件中,保存了编译器和链接器的参数选项,并且描述了所有源文件之间的关系。make程序会读取makefile文件中的数据,然后根据规则调用编译器,汇编器,链接器产生最后的输出。根据makefile的功能理解,A选项是正确的

  1. Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释, B选项是正确的
  • 显式规则说明了,如何生成一个或多个目标文件。
  • make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写makefile,比如源文件与目标文件之间的时间关系判断之类
  • 在makefile中可以定义变量,当makefile被执行时,其中的变量都会被扩展到相应的引用位置上,通常使用 $(var) 表示引用变量
  • 文件指示。包含在一个makefile中引用另一个makefile,类似C语言中的include; 根据这一项可以推导D选项是错误的。
  • 注释,makefile中可以使用 # 在行首表示行注释
  1. 默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,

make的执行规则是,只生成所有目标对象中的第一个,当然make会根据语法规则,递归生成第一个目标对象的所有依赖对象后再回头生成第一个目标对象,生成后退出。

makefile中的伪对象表示对象名称并不代表真正的文件名,与实际存在的同名文件没有相互关系,因此伪对象不管同名目标文件是否存在都会执行对应的生成指令。伪对象的作用有两个,1. 使目标对象无论如何都要重新生成。2. 并不生成目标文件,而是为了执行一些指令。 


系统调用

  • 库函数是用户对系统调用接口的进一步封装接口
  • printf函数是glibc中封装的用于实现格式化输出的接口
  • scanf函数是glibc中封装的用于实现格式化输入的接口
  • fgetc函数是glibc中封装的用于实现从输入流中获取字符的接口
  • read是系统提供的用于从输入设备获取数据的接口
  • print_s以及scan_s这两个函数不存在,至少在C语言的常见典型的跨平台移植代码库中不存在。

冯诺依曼体系/操作系统

不属于冯诺依曼体系结构必要组成部分是:b

   A CPU   运算器与控制器

    B Cache 缓存(一种技术)

    C RAM 内存(存储器)

    D ROM 磁盘(输入输出设备)

下面关于系统调用的描述中,错误的是b

A.系统调用把应用程序的请求传输给系统内核执行

B.系统调用函数的执行过程应该是在用户态

C.利用系统调用能够得到操作系统提供的多种服务

D.是操作系统提供给编程人员的接口

E.系统调用给用户屏蔽了设备访问的细节

F.系统调用保护了一些只能在内核模式执行的操作指令

系统调用的运行过程是在内核态完成的,操作系统并不允许用户直接访问内核,也就是说用户运行态并不满足访问内核的权限。


死代码删除是编译最优化技术,指的是移除根本执行不到的代码,或者对程序运行结果没有影响的代码,而并不是删除被注释的代码

  • 内联函数,也叫编译时期展开函数, 指的是建议编译器将内联函数体插入并取代每一处调用函数的地方,从而节省函数调用带来的成本,使用方式类似于宏,但是与宏不同的是内联函数拥有参数类型的校验,以及调试信息,而宏只是文本替换而已。因此B选项正确
  • for循环的循环控制变量,通常被cpu访问频繁,因此如果调度到寄存器中进行访问则不用每次从内存中取出数据,可以提高访问效率,因此C选项正确
  • 强度削弱是指执行时间较短的指令等价的替代执行时间较长的指令,比如 num % 128 与 num & 127 相较,则明显&127更加轻量

守护进程

什么是守护进程,创建守护进程的步骤是什么?-太平洋IT百科 (pconline.com.cn)


精灵进程

(99条消息) 【Linux】僵尸进程、孤儿进程、精灵进程(僵尸进程的解决办法)_风铃奈的博客-CSDN博客_孤儿进程怎么处理


shell/环境变量

环境变量的读取

使用shell时,环境变量文件读取。

/etc/profile:此文件为系统的为每个用户设置环境信息,当用户第一次登录时,该文件被执行.

并从/etc/profile.d 目录的配置文件中搜集shell的设置.

删除环境变量

在linux中,可以利用unset命令删除环境变量,该命令用于删除变量或者函数,语法为“unset 变量名”;在shell子进程中使用unset命令删除环境变量时,只会影响当前子进程的可见性,不会影响父shell进程。

linux怎么删除环境变量-linux运维-PHP中文网


分页存储管理(页表)

(99条消息) 【转;补充】分页存储管理中的页表项长度是什么?_凤⭐尘的博客-CSDN博客_页表项长度


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值