[面试直通版]操作系统之编程语言与运行原理(上)

发布于:2022-12-19 ⋅ 阅读:(531) ⋅ 点赞:(0)

点击->操作系统复习的文章集<-点击

目录

计算机的层次结构划分

学习目标

回顾为什么分层?

计算机的层次结构

程序编译与程序解释

典型问题:

语言表达

编译与解释

高级语言的虚拟机

编译器原理剖析


  • 计算机的层次结构划分

  • 由于是基础性知识,所以没有相关的面试题
  • 学习目标

  • 掌握高级语言、汇编语言、指令集等概念
  • 掌握计算机层次结构
  • 回顾为什么分层?

  • 在网络那说了
  • 分层的目的是为了不同层实现不同的功能,并且层与层之间的关联是解耦合的
  • 类比函数的实现与设计,函数体不能太长
  • 太长就应该分成多个函数去实现、设计
  • 计算机层次结构也是由于如此原因也进行了划分
  • 一个良好的设计规范:
  • 复杂系统的实现要有清晰明确的分层设计
  • 计算机的层次结构

  • 也可以划分为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....
  • 保留运输符:+、-、*、/
  • 变量的转换
  • 把代码作为字符流,来进入词法分析器,输出符合流,方便后面的工作
  • 语法分析
  • 构建语法树,判断语法树是否合法
  • 将前面的符号流改造成语法树
  • 语义分析
  • 构建语义树
  • 进行类型检查与类型转换
  • 中间代码生成
  • 生成计算机容易理解的代码
  • 大多是三地址代码
  • 优化分析
  • 顾名思义
  • 代码生成
  • 得到前面优化的三地址代码
  • 对其进行映射成相应的汇编语言指令

网站公告

今日签到

点亮在社区的每一天
去签到