二 . 程序设计语言

程序设计语言

一. 编译程序和解释程序

1. 解释器

  • 翻译源程序时不生成独立的目标程序
  • 解释程序和源程序要参与到程序的运行过程中

2. 编译器

  • 翻译时将源程序翻译成独立保存的目标程序
  • 机器上运行的是与源程序等价的目标程序,
  • 源程序和编译程序都不再参与目标程序的运行过程

二. 传值调用与传引用调用

1. 传值调用

  • 将实参的值传递给形参,实参可以是变量、常量和表达式。
  • 不可以实现形参和实参间双向传递数据的效果

2. 传引用地址调用

  • 将实参的地址传递给形参,形参必须有地址,实参不能是常量(值),表达式。
  • 可以实现形参和实参间双向传递数据的效果,即改变形参的值同时也改变了实参的值。
void f(形参){
}
main{
int n=1;
f(实参);
}

三. 程序翻译

编译方式:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成
解释方式:词法分析、语法分析、语义分析

1 编译器和解释器都不可省略词法分析、语法分析、语义分析且顺序不可交换
2 编译器方式中中间代码生成和代码优化不是必要,可省略。即编译器方式可以在词法分析、语法分析、语义分析阶段后直接生成目标代码

解释器

  • 翻译源程序时不生成独立的目标程序
  • 解释程序和源程序要参与到程序的运行过程中

编译器

  • 翻译时将源程序翻译成独立保存的目标程序
  • 机器上运行的是与源程序等价的目标程序,
  • 源程序和编译程序都不再参与目标程序的运行过程

四. 符号表

  • 编译程序对高级语言源程序进行编译的过程中,要不断收集、记录和使用源程序中一些相关符号的类型和特征等信息,并将其存入符号表中。
  • 记录源程序中各个字符的必要信息,以辅助语义的正确性检查和代码生成。

五. 词法、语法、语义分析与目标代码生成

词法分析

输入/输出 输入:源程序;输出:记号流
作用 分析构成程序的字符;及由字符按照构造规则构成的符号是否符合程序语言的规定

语法分析

输入/输出 输入:记号流;输出:语法树(分析树)
作用 对各条语句的结构进行合法性分析;分析程序中的句子结构是否正确
说明 语法分析阶段可以发现程序中所有的语法错误

语义分析

输入/输出 输入:语法树(分析树)
作用 进行类型分析和检查
说明 语法分析阶段可以发现程序中的所有语法错误 语义分析阶段不能发现程序中所有的语义错误 语义分析阶段可以发现静态语义错误 不能发现动态语义错误,动态语义错误运行时才能发现

目标代码生成

目标代码生成阶段的工作与具体的机器密切相关
寄存器的分配工作处于目标代码生成阶段

六. 中间代码

常见的中间代码有:后缀式、三地址码、三元式、四元式和树(图)等形式。
 
中间代码与具体的机器无关(不依赖具体的机器),可以将不同的高级程序语言翻译成同一种中间代码。中间代码可以跨平台
因为与具体的机器无关,使用中间代码有利于进行与机器无关的优化处理和提高编译程序的可移植性

七. 正规式

八. 有限自动机

有限自动机是词法分析的一个工具,它能正确地识别正规集

初态: 箭头指向的那个状态
终态:两个圆圈

识别时,状态到终态才算识别成功

确定的有限自动机(DFA):对每一个状态来说识别字符后只有一个转移状态
不确定的有限自动机(NFA): 对每一个状态来说识别字符后有一个以上的转移状态

九. 上下文无关文法

大多数程序设计语言地语法规则用上下文无关文法描述

十. 中缀后缀表达式

1. 中缀表达式

常见的运算表达式, 例如: (3x4)x5-6
中缀式:a + b
后缀式(逆波兰式):ab+

2. 后缀表达式

转后缀表达式

(1) 直接生成:

优先级相同优先左

求 (3+4)x5-6 对应的后缀表达式:
使用栈

后缀转中缀表达式
后缀式(逆波兰式):ab+ ----> 中缀式:a + b

3. 树的遍历

中序遍历 中缀式 左根右
后序遍历 后缀式 左右根
前序: 先输出父节点 , 再遍历左子树和右子树。
中序: 先遍历左子树,再输出父节点,再遍历右子树
后序: 先遍历左子树,再遍历右子树,再输出父节点

(1) 前序遍历

(2) 中序遍历


(3) 后续遍历

posted @   渔樵江渚  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
点击右上角即可分享
微信分享提示