# 程序设计语言

# 定义

用来编写计算机程序的语言

# 分类

  • 高级语言
    • 面向过程语言 C
    • 面向对象语言 C++
    • 面向问题语言 SQL
    • ...
  • 低级语言
    • 面向机器语言
      • 汇编语言
      • 机器语言

(最顶) 高级语言 < 汇编语言 < 机器语言 (最底)

# 简历

语言名称 简介 特性 举例 硬件识别 是否可直接执行 标签 定位
机器语言 二进制代码构成指令, 编写程序 1. 最底层的语言, 不需要翻译, 不同计算机及机器语言不同
2. 执行速度快, 但编写难度大, 维护不便, 不易移植
1 + 3表示为: 10000001 00000001 00000011 ✔️ ✔️ - 面向机器
- 执行速度快
- 占用内存少
- 使用不便
低级语言, 极少使用
汇编语言 二进制代码用符号注记为汇编指令, 编写程序 1. 机器无法直接识别, 需要翻译回二进制代码再执行
2. 直观易记, 比高级语言执行效率更高, 但维护还是不便, 不易移植
X + Y表示为: ADD X Y - 同上
- 直观
低级语言, 很少使用
高级语言 硬件无关, 面向问题的程序设计语言 1. 要先(编译器)翻译为目标语言, 或者(解释器)边解释边执行
2. 独立于硬件, 易于维护, 可移植性好
x = 1 + 3; 面向问题/对象
-
执行速度相对慢
-
占用内存大
-
标准化程度高
-
便于程序交换,使用方便
高级语言, 种类多, 常用

# 翻译程序

# 定义

将语言1写的程序转换成语言2写的程序,且两者在逻辑上等价

# 分类

  • [^编译程序]: 将高级程序设计语言程序翻译成逻辑上等价的低级语言(汇编语言, 机器语言)程序的翻译程序

# 方案

高级语言 => 机器语言的实现方式:

高级语言层 中间层 汇编语言层 中间层 机器语言层
高级语言 解释程序 机器语言
编译程序
编译程序 汇编语言 汇编程序
(平台1)高级语言 (平台1)交叉编译程序 (平台2)汇编语言 (平台2)汇编程序 (平台2)机器语言
(平台1)编译程序 (平台1)汇编语言 (平台2)交叉汇编程序

总结: 跨平台实现,

  1. 汇编语言层要参与
  2. 实现关键在两边的中间层部分, 要么使用交叉编译程序, 要么使用交叉汇编程序

# 举例

高级程序语言 => 计算机硬件, 原理同方案部分

高级语言层 中间层 汇编语言层 中间层 机器语言层
Python 语言 Python 解释程序 计算机硬件
C 语言 C 编译程序 (操作系统) 汇编语言 (操作系统) 汇编程序 计算机硬件
Basic 语言 Basic 解释程序 计算机硬件

# 流程

  1. 编译法: 源程序(高级程序层) => 编译程序(中间层)[编译时, 源程序处理] => 目标程序(汇编语言层) => 计算机硬件(机器语言层)[执行时, 数据输入] => 执行结果

    • 编译时间: 源程序 => 目标程序 的耗时
    • 源程序在编译阶段处理, 数据在执行阶段处理
  2. 解释法: 源程序(高级程序层) => 解释程序(中间层)[数据输入] => 执行结果

  3. 编译法和解释法的区别: 中间代码的处理方案不同

    功能 结果 实现原理
    编译程序 源程序的转换系统 源程序的目标代码 中间代码 => 目标代码
    解释程序 源程序的执行系统 源程序的执行结果 执行中间代码

# 编译程序

# 编译原理

讨论编译程序设计的基本理论, 概念和方法

设计: 构造编译程序要掌握以下几方面的内容

  • 源语言: 理解其结构和含义
  • 目标语言: 必须清楚硬件的系统结构和指令的格式等
  • 编译方法

# 分类

  • 诊断编译程序
  • 优化编译程序
  • 可变目标编译程序
  • 交叉编译程序

# 流程

编译涉及程序:

高级语言层 中间层 汇编语言层 中间层 机器语言层
1. 编辑器(Editor)
2. 预处理的源程序
3. 预处理器(Preprocessor)
4. 源程序
5. 编译程序 6. 汇编程序 7. 汇编程序(Assembler)
8. 可装配的机器代码
9.装配连接程序(Linker, Loader, Debugger, Optimizer)
10. 绝对机器代码
  • 编辑器
  • 预处理器
  • 编译程序
  • 汇编程序
  • 装配连接程序

概览:

源程序 编译器 目标程序
词法分析→语法分析→语义分析与中间代码生成→代码优化→目标代码生成

举例:

自然语言, English2Chinese:

I wish you success.

解:

  1. 分析阶段:

    1. 词法分析
    2. 语法分析
    3. 语义分析

    合题:

    1. 分析单词: I wish you success
    2. 分析语法: 主语 谓语 宾语 宾补
    3. 分析语义 希望 成功
  2. 综合阶段:

    根据分析结果构造目标程序

    1. 中间代码生成
    2. 代码优化
    3. 目标代码生成

    合题:

    4. 中间代码生成 直译结果生成: 我 希望 你 成功
    5. 代码优化: 结合上下文, 汉语表达习惯
    6. 目标代码生成: 完成翻译: 祝你成功
  3. 符号表管理

    • 编译程序的一项重要工作

      • 记录源程序中使用的标识符
      • 收集每个标识符的各种属性信息
    • 符号表是由若干记录组成的数据结构

      • 每个标识符在表中有一条记录

      • 记录的域是标识符的属性

    • 对符号表结构的要求:

      • 应允许快速地找到标识符的记录
      • 可在其中存取数据
      • 标识符的各种属性是在编译的各个不同阶段填入符号表的
  4. 错误诊断和处理

    编译的每阶段都可能检测到存在的错误

    • 词法分析程序: 单词拼写错误
    • 语法分析程序: 记号流不符合语法规则的错误
    • 语义分析程序: 具有正确的语法结构, 但对所涉及的操作无意义的结构
    • 代码生成程序: 目标程序区超出了允许范围的错误

# 其他概念

前端后端

前端: 与源语言有关, 与目标机器无关的部分

  • 词法分析
  • 语法分析
  • 符号表建立
  • 语义分析
  • 中间代码生成
  • 机器无关的代码优化
  • 错误处理, 符号表操作

后端: 编译器中与目标机器有关的部分

  • 及其有关的代码优化
  • 目标代码生成
  • 错误处理, 符号表操作

优点:

便于移植, 便于构造编译器

"一遍"的定义:

  1. 对源程序或其中间形式从头到尾扫描一遍

  2. 做相关的加工处理

  3. 生成新的中间形式或目标程序

编译程序与遍的关系:

  • 一遍扫描的编译程序

    编译程序→流程, 走一遍

  • 多遍编译程序

分遍优点:

  • 减少主存开销
  • 使编译器功能独立, 结构清晰简单
  • 充分优化代码
  • 实现前后端分离, 便于移植

分遍缺点:

  • 耗时, 大量重复性工作

# 编写编译器

  • 直接用机器语言编写编译程序
  • 用汇编语言编写编译程序: 核心部分常用汇编语言编写
  • 用高级语言编写编译程序(普遍)
  • 自编译
  • 用编译工具自动生成: LEX(词法分析)与YACC(语法分析)
  • 移植: 同种语言的编译程序在不同类型的机器之间移植

# 技术应用

  • 语法制导的结构化编辑器
  • 程序格式化工具
  • 软件测试工具
  • 程序理解工具
  • 高级语言的翻译工具