目录
计算机的层次结构划分
- 由于是基础性知识,所以没有相关的面试题
学习目标
- 掌握高级语言、汇编语言、指令集等概念
- 掌握计算机层次结构
回顾为什么分层?
- 在网络那说了
- 分层的目的是为了不同层实现不同的功能,并且层与层之间的关联是解耦合的
- 类比函数的实现与设计,函数体不能太长
- 太长就应该分成多个函数去实现、设计
- 计算机层次结构也是由于如此原因也进行了划分
- 一个良好的设计规范:
- 复杂系统的实现要有清晰明确的分层设计
计算机的层次结构
- 也可以划分为7个层次:
- 应用层
- 高级语言层
- 汇编语言层
- 操作系统层
- 传统机器层
- 微程序机器层
- 硬件逻辑层
- 操作系统层及其以上的层次可以理解为软件
- 以下的层次可以理解为硬件
- 应用层
- 主要解决的是
- 满足用户在各种场景下便捷使用计算机的需求
- 呈现为不同的多种多样的软件,满足办公场景、娱乐场景、学习场景等等
- 呈现为满足各种需求的应用
- 高级语言层
- 程序员面向的计算机层次
- 主要目的是
- 编程实现易用的应用层软件提供用户使用
- 汇编语言层
- 偏底层软件工程师面向的计算机层次
- 汇编语言可以翻译成可直接执行的机器语言
- 操作系统层
- 传统硬件与传统软件的分界线
- 向上提供了简易的操作接口
- 向下对接了指令系统,管理硬件资源
- 传统机器层->微程序
- 微程序机器层->微指令
- 硬件逻辑层->门电路
- 一条微程序由多条微指令所组成
- 门电路就是实现微指令具体的工作硬件
- 具体例子理解
- QQ这个软件在用户的层面是一个应用
- 在应用层呈现为一个app
- 底层有很多语言来实现,如有c/c++、Qt、MFC、HTML,这些属于高级语言层
- 这些高级语言通过编译器编译成汇编语言,然后交给操作系统去执行
- 操作系统它作为中介把汇编语言翻译成机器语言,然后实际地在门电路上来执行
程序编译与程序解释
典型问题:
- 请简述对Java字节码的理解
- 编译和解释有什么区别?请举例说明
语言表达
- 进行编程时要把人类语言转换为计算机语言实现
- 人类语言->程序语言(编程:软件工程师)
- 程序语言->机器语言(编译/解释:编译器/解释器)
编译与解释
- 为方便理解引入2概念
- 抽象的高级计算机语言L1
- 抽象的低级计算机语言L0
- 编译
- 使用L1进行程序逻辑描述
- L1实现一个程序,通过编译器来生成对应底层语言L0的程序,然后在操作系统上运行
- 2者实现的程序是逻辑一致的
- 解释
- 同样的,使用L1进行程序逻辑描述
- 不同的是,会有另外一个角色的加入
- 它是另外一种使用L1/L0实现的程序
- 这个程序称为解释器
- 解释器会把L1的每一行程序代码作为输入
- 输入进解释器
- 输入不是完整的输入,是一条一条的输入
- 然后输出一条又一条的偏底层的计算机语言L0
- 编译时是完整的生成另外一种程序
- 解释时只是作为一种输入,进行一条又一条的解释
- 来个例子理解
- 解释
- 用中英文翻译来理解
- 解释是一行一行逐字地把中文翻译成英文
- 因为是逐字逐行地去翻译的
- 所以在这个过程里没有全局的优化
- 编译
- 是整体的,有全局的优化和考虑
高级语言的虚拟机
- 以Java为例
- 从上往下为:
- Java程序
- Java字节码
- Java虚拟机
- 操作系统
- 为什么要有虚拟机
- 不同平台有不同的编译器
- 不同平台部署需要重新编译
- 如果程序从一个平台到另外一个平台,代码通常是需要重新编译的
- 编译结果不复用,导致无法运行
- 通过虚拟机,能一次编译,随处运行
- Java虚拟机向下兼容了不同的操作系统,再往下有不同架构CPU的兼容
- 所以Java虚拟机在某种程度上给编程用户是屏蔽了底层不同平台细节的
- Java是编译+解释型语言
- 它的编译和解释发生在2个部分
- 首先由Java程序编译为JVM字节码
- 再由虚拟机把字节码解释为对应的机器码进行运行
- 字节码(英语:Bytecode):通常指的是已经经过编译,但与特定机器代码无关,需要解释器转译后才能成为机器代码的中间代码
- 字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列
编译器原理剖析
- 编译器的运行过程
- 开始->词法分析->语法分析->语义分析->中间代码生成->优化分析->代码生成->结果
- 词法分析
- 保留关键字:int、float....
- 保留运输符:+、-、*、/
- 变量的转换
- 把代码作为字符流,来进入词法分析器,输出符合流,方便后面的工作
- 语法分析
- 构建语法树,判断语法树是否合法
- 将前面的符号流改造成语法树
- 语义分析
- 构建语义树
- 进行类型检查与类型转换
- 中间代码生成
- 生成计算机容易理解的代码
- 大多是三地址代码
- 优化分析
- 顾名思义
- 代码生成
- 得到前面优化的三地址代码
- 对其进行映射成相应的汇编语言指令