一、编译器是什么
源程序→预处理器→经过预处理的源程序→编译器→汇编语言程序→汇编器→可重定位的机器代码→链接器/加载器→目标机器代码。
编译器的结构:
与源语言相关:字符流→词法分析器→词法单元流→语法分析器→语法树→语义分析器→语法树→中间代码生成器→
中间表示形式→机器无关代码优化器→中间表示形式→
与目标语言相关:目标代码生成器→目标机器语言→机器相关代码优化器→目标机器语言
 
二、编译时,内存如何分配?
运行时存储分配——堆栈内存分配策略
静态存储分配:对于编译时刻就可以确定大小的数据对象,可以在编译时刻就为它们分配存储空间。
动态存储分配:编译时仅产生各种必要的信息,在运行时刻再动态地分配数据对象的存储空间。
 
堆和栈是相对于动态而言的。
所以运行时内存分为以下三大部分,动态区又有自己的三部分。
静态代码区
静态数据区
动态数据区域 栈区
空闲内存
堆区
 
栈和堆分别在空闲内存地址两端,他俩大小随程序运行而变化。
栈存储了活动记录,过程调用时生成并进栈,过程返回时出栈,
 
堆存放长生命周期的数据对象
 
静态存储分配的限制条件:数组上下界必须是常数;不允许过程的递归调用;不允许动态建立数据实体;
 
栈式存储分配:对于函数(或者叫过程、方法),几乎所有编译器都把他们的运行时刻存储以栈的形式进行管理,称为栈式存储分配。
  当一个过程被调用时,该过程的活动记录被压入栈;当过程结束时,该活动记录被弹出栈。
  这种安排不仅允许活跃时段不交叠的过程调用之间共享空间,而且允许以如下方式为一个过程编译代码:它的非局部变量的相对地址总是固定的,和过程调用序列无关。
  (扩展概念——活动树:用来描述程序运行期间控制进入和离开各个活动的情况的数称为活动树。
  树中每个结点对应于一个活动。根结点是启动程序执行的main函数的活动。
  在表示函数p的某个活动的结点上,其子结点对应于被p的这次活动调用的各个过程的活动。按照这些活动被调用的顺序,自左向右地显示它们。一个子结点必须在其右兄弟结点的活动开始之前结束。)
 
变长数据的存储分配:在编译时刻不能确定大小的对象,将被分配在堆区。但是,如果它们是过程的局部对象,也可以将它们分配在运行时刻栈中。
  尽量将对象放置在栈区的原因:可以避免对它们的空间进行垃圾回收,也就减少了相应的开销。
  只有一个数据对象局部于某个函数,且当此函数结束时它变得不可访问,才可以使用栈为这个对象分配空间。
访问链:静态作用域规则——只要函数b的声明,嵌套在函数a的声明里,那么函数b就可以访问函数a中声明的对象。
  可以在相互嵌套的函数的活动记录之间,建立一种称为访问链的指针,使得内嵌的函数访问外层函数中声明的对象。
  如果函数b在源码中,直接嵌套在函数a中,那么b的人和活动中的访问链都指向最近的a的活动。
 
三、既然这样编译,那代码就这样优化
要优化先要梳理代码,就是将代码看作流图,流图由若干块儿组成。
优化分类:
  机器无关优化——针对中间代码;机器相关优化——针对目标代码;
  或局部代码优化——单个基本块范围的优化;全局代码优化——面向多个基本块的优化
常用的优化方法:删除公共子表达式、常量合并、代码移动、强度削弱、删除归纳变量。
  什么是代码移动:指那些不管循环多少次都得到相同结果的表达式,即循环不变计算,在进入循环前就对他们求值。
  什么是强度削弱:用快的操作代替慢的操作,如用加代替乘。
  什么是归纳变量:对于一个变量x,如果存在一个正或负的常数c使得每次x被赋值时,他的总值总是增加c,那么x就称为归纳变量。在沿着循环运行时,如果有一组归纳变量的值得变化保持步调一致,常常可以将这组变量删除为只剩一个
  删除公共子表达式:意思就是公共部分的运算,可以用赋值的形式代替。另外,赋值操作,也尽量能省则省。
综上,代码优化的宗旨就是减少计算>赋值代替>减少赋值

基础教材系列:编译原理——B站笔记的更多相关文章

  1. Stanford公开课《编译原理》学习笔记(2)递归下降法

    目录 一. Parse阶段 CFG Recursive Descent(递归下降遍历) 二. 递归下降遍历 2.1 预备知识 2.2 多行语句的处理思路 2.3 简易的文法定义 2.4 文法产生式的代 ...

  2. Stanford公开课《编译原理》学习笔记(1~4课)

    目录 一. 编译的基本流程 二. Lexical Analysis(词法分析阶段) 2.1 Lexical Specification(分词原则) 2.2 Finite Automata (典型分词算 ...

  3. 《编译原理》-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法

    <编译原理>-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法 此编译原理确定某高级程序设计语言编译原理,理论基础,学习笔记 本笔记是对教材< ...

  4. 《编译原理》-用例题理解-自底向上的语法分析,FIRSTVT,LASTVT集

    <编译原理>-用例题理解-自底向上的语法分析,FIRSTVT,LASTVT集 上一篇:编译原理-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法 本 ...

  5. 43 编译原理及cmake使用手册学习

    0 引言 大量开源库需要通过cmake编译后使用,了解cmake的基本指令以及CMakeLists.txt的写法非常重要,其基础是了解编译原理.另外,为了对cmake编译的代码进行调试,需要了解CMa ...

  6. java基础解析系列(六)---深入注解原理及使用

    java基础解析系列(六)---注解原理及使用 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer ja ...

  7. java基础解析系列(六)---注解原理及使用

    java基础解析系列(六)---注解原理及使用 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer缓存及 ...

  8. java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现

    java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析 ...

  9. java基础解析系列(七)---ThreadLocal原理分析

    java基础解析系列(七)---ThreadLocal原理分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)-- ...

  10. java基础解析系列(八)---fail-fast机制及CopyOnWriteArrayList的原理

    fail-fast机制及CopyOnWriteArrayList的原理 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列( ...

随机推荐

  1. CF739A Alyona and mex 题解

    题目传送门 前置知识 贪心 | 构造 解法 从贪心的角度分析,最小的 \(\operatorname{mex}\) 仅会与长度最小的区间有关:另外为使得 \(\operatorname{mex}\) ...

  2. Mobx与Redux的异同

    Mobx与Redux的异同 Mobx与Redux都是用来管理JavaScript应用的状态的解决方案,用以提供在某个地方保存状态.修改状态和更新状态,使我们的应用在状态与组件上解耦,我们可以从一个地方 ...

  3. Laravel入坑指南(1)——Hello World

    接触PHP已经挺长一段时间了,一直对这个世界上最好的语言情有独钟.用熟练了之后,发现PHP不仅是天下第一,而且是宇宙第一.但是自从Laravel诞生之后,博主一直对Laravel有莫名的抵触,觉得这个 ...

  4. 高效发现和解决insert字段长度不够的报错

    早上发现执行的PostgreSQL 存储过程报错,错误如下: 300-value too long for type character varying(100),一看就是表字段的长度太小,从提示看是 ...

  5. win32 - 将原始音频样本转换为wav文件

    需要先从麦克风中采样,代码样本可以参考官方示例: WASAPI Capture Shared Event Driven 官方示例采样10s, 我们需要在WriteWaveFile函数下添加生成原始音频 ...

  6. 【Android逆向】反调试绕过(nop 绕过)

    1. 这是看雪上的一个题目,要求显示出 it is success https://www.kanxue.com/work-task_read-800648.htm 第三题 2. apk 安装到手机, ...

  7. Redis搭建Sentinel实验环境

    环境准备 在物理机上启动3台虚拟机,IP地址分别为:192.168.56.4,192.168.56.5,192.168.56.6. 1.确保3台虚拟机的网络是相互联通的. 2.确保已经在3台虚拟机上安 ...

  8. flutter——android报错Manifest merger failed : Attribute application@allowBackup value=(false)

    与这个https://www.cnblogs.com/MaiJiangDou/p/13848658.html 报错类似. 报错: Manifest merger failed : Attribute ...

  9. flutter打包android的一些配置修改(解决白屏,视频闪退)

    1.打包后视频播放闪退 视频播放器选择了flutter_tencentplayer(https://github.com/qq326646683/flutter_tencentplayer) 解决:不 ...

  10. 【webserver 前置知识 01】Linux系统编程入门

    题外话,PA里面也有很不错的Linux基础基础 传送门:https://nju-projectn.github.io/ics-pa-gitbook/ics2019/linux.html 静态库与动态库 ...