一、编译器是什么
源程序→预处理器→经过预处理的源程序→编译器→汇编语言程序→汇编器→可重定位的机器代码→链接器/加载器→目标机器代码。
编译器的结构:
与源语言相关:字符流→词法分析器→词法单元流→语法分析器→语法树→语义分析器→语法树→中间代码生成器→
中间表示形式→机器无关代码优化器→中间表示形式→
与目标语言相关:目标代码生成器→目标机器语言→机器相关代码优化器→目标机器语言
 
二、编译时,内存如何分配?
运行时存储分配——堆栈内存分配策略
静态存储分配:对于编译时刻就可以确定大小的数据对象,可以在编译时刻就为它们分配存储空间。
动态存储分配:编译时仅产生各种必要的信息,在运行时刻再动态地分配数据对象的存储空间。
 
堆和栈是相对于动态而言的。
所以运行时内存分为以下三大部分,动态区又有自己的三部分。
静态代码区
静态数据区
动态数据区域 栈区
空闲内存
堆区
 
栈和堆分别在空闲内存地址两端,他俩大小随程序运行而变化。
栈存储了活动记录,过程调用时生成并进栈,过程返回时出栈,
 
堆存放长生命周期的数据对象
 
静态存储分配的限制条件:数组上下界必须是常数;不允许过程的递归调用;不允许动态建立数据实体;
 
栈式存储分配:对于函数(或者叫过程、方法),几乎所有编译器都把他们的运行时刻存储以栈的形式进行管理,称为栈式存储分配。
  当一个过程被调用时,该过程的活动记录被压入栈;当过程结束时,该活动记录被弹出栈。
  这种安排不仅允许活跃时段不交叠的过程调用之间共享空间,而且允许以如下方式为一个过程编译代码:它的非局部变量的相对地址总是固定的,和过程调用序列无关。
  (扩展概念——活动树:用来描述程序运行期间控制进入和离开各个活动的情况的数称为活动树。
  树中每个结点对应于一个活动。根结点是启动程序执行的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. Centos7 和 Centos8 升级内核

    从yum安装kernel-ml 对于Centos7 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org yum install htt ...

  2. C# EnumWindows示例代码

    代码开箱即用,唯一需要处理的就是要提供一个进程的pid. using System; using System.Collections.Generic; using System.Linq; usin ...

  3. Python笔记五之正则表达式

    本文首发于公众号:Hunter后端 原文链接:Python笔记五之正则表达式 这一篇笔记介绍在 Python 里使用正则表达式. 正则表达式,Regular Expression,可用于在一个目标字符 ...

  4. isort包

    记录 为什么会使用到这个包,原因是之前在本地开发的时候,导包的时候可能由于不规范,其实你自己看着挺规范的,但是呢后续组长进行打包的时候,代码出现了不规范的情况,导致打包失败.原因就是导包不规范造成的. ...

  5. 【Azure 事件中心】Azure Event Hub中的数据能不能存储大于7天呢?如果7天之后是不是会自动删除呢?

    问题描述 Event Hub中有个retention的设置为7天,有没有办法增大这个Retention的时间? 如果没办法,是不是超过7天的数据就会被删除? 问题解答 因为Azure Event Hu ...

  6. 【Azure 应用服务】使用App Service for Linux/Container时,如果代码或Container启动耗时大于了230秒,默认会启动失败。

    问题描述 使用App Service for Linux/Container时,从Docker的日志中,我们可以看见有 warmup 行为,而此行为默认时间为230秒,如果超出了这个时间,就会导致Co ...

  7. 【Azure 环境】在Azure活动目录中的应用注册,给应用添加API权限时发现API权限配置缺失

    问题描述 在Azure活动目录中的应用注册,给应用添加API权限时,SecurityEvents.Read.All和IdentityRiskEvent两个权限,在Microsoft graph中找不到 ...

  8. STM32FATFS文件系统移植

    STM32FATFS文件系统移植 1. FATFS简介 FATFS文件系统是一个用于在微控制器上运行的开源文件系统,支持FAT/FATFS.NTFS.exFAT等主流文件系统,且一直保持更新.在此以F ...

  9. Jmeter参数化-用户自定义变量

    一  首先我们先来了解下jmeter 做参数化的目的: 1通过参数化来集中管理配置和测试数据 2通过参数化实现数据驱动测试 二 线程组添加配置元件中的用户自定义变量 添加变量名称,变量值 三 使用变量 ...

  10. 1、dubbo的简介

    Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候 ...