✨博客主页: https://blog.csdn.net/m0_63815035?type=blog
💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识
📢博客专栏: https://blog.csdn.net/m0_63815035/category_11954877.html
📢欢迎点赞 👍 收藏 ⭐留言 📝
📢本文为学习笔记资料,如有侵权,请联系我删除,疏漏之处还请指正🙉
📢大厦之成,非一木之材也;大海之阔,非一流之归也✨
该笔记是我跟着b站up主 zst 学习软考记录的,视频链接:软件设计师学习路线
第二章 程序设计语言基础知识(3~6分)
2.1 程序设计语言概述
2.1.1 程序设计语言的基本概念
解释器:翻译源程序时不生产独立的目标程序。
解释程序和源程序要参与到程序的运行过程中。
编译器:翻译时将源程序翻译成独立保存的目标程序。
机器上运行的是与源程序等价的目标程序,源程序和编译程序都不再参与目标程序的运行过程。
许多程序设计语言规定,程序中的数据必须具有类型,其作用是:
- 便于为数据合理分配存储单元
- 便于对参与表达式计算的数据对象进行检查
- 便于规定数据对象的取值范围及能够进行的运算
2.1.2 程序设计语言的基本成分
函数定义
函数的定义包括两部分:函数首部和函数体。函数的定义描述了函数做什么和怎么做。
函数定义的一般形式为:
返回值的类型 函数名(形式参数表) //函数首部 函数名(实参表);
{
函数体;
}
(1)值调用(Call by Value)。若实现函数调用时将实参的值传递给相应的形参, 则称为是传值调用。在这种方式下形参不能向实参传递信息。
(2)引用调用(Call by Reference)。引用是 C++ 中引入的概念,当形式参数为引用类型时,形参名实际上是实参的别名,函数中对形参的访问和修改实际上就是针对相应实参所做的访问和改变。
传值调用:
将实参的值传递给形参,实参可以是变量、常量和表达式。
不可以实现形参和实参间双向传递数据的效果。
传引用(地址)调用:
将实参的地址传递给形参,形参必须有地址,实参不能是常量(值),表达式。可以实现形参和实参间双向传递数据的效果,即改变形参的值同时也改变了实参的值。
2.2.2 编译程序基本原理
编译方式:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成
解释方式:词法分析、语法分析、语义分析
编译器和解释器都不可省略词法分析、语法分析、语义分析且顺序不可交换
即词法分析、语法分析、语义分析是必须的。
编译器方式中中间代码生成和代码优化不是必要,可省略。
即编译器方式可以在词法分析、语法分析、语义分析阶段后直接生成目标代码
符号表:不断收集、记录和使用源程序中一些相关符号的类型和特征等信息,并将其存入符号表中。记录源程序中各个字符的必要信息,以辅助语义的正确性检查和代码生成。
1)词法分析
输入:源程序
输出:记号流
词法分析阶段的主要作用是 分析构成程序的字符及由字符按照构造规则构成的符号,是否符合程序语言的规定。
2)语法分析
输入:记号流
输出:语法树(分析树)
语义分析阶段可以发现程序中所有的语法错误
语法分析阶段的主要作用是 对各条语句的结构进行合法性分析,分析程序中的句子结构是否正确。
3)语义分析
输入:语法树(分析树)
语义分析阶段的主要作用是进行类型分析和检查
语义分析阶段不能发现程序中所有的语义错误
语义分析阶段可以发现静态语义错误,不能发现动态语义错误,动态语义错误运行时才能发现
4)中间代码生成
常见的中间代码有:后缀式、三地址码、三元式、四元式和树(图)等形式。
中间代码与具体的机器无关(不依赖具体的机器),可以将不同的高级程序语言翻译成同一种中间代码。
中间代码可以跨平台。
因为与具体的机器无关,使用中间代码有利于进行与机器无关的优化处理和提高编译程序的可移植性。
6)目标代码生成
目标代码生成阶段的工作与具体的机器密切相关
寄存器的分配工作处于目标代码生成阶段
有限自动机是词法分析的一个工具,它能正确地识别正规集
确定的有限自动机( DFA ):对每一个状态来说识别字符后转移的状态是唯一的
不确定的有限自动机( NFA ):对每一个状态来说识别字符后转移的状态是不唯一的
今天这篇文章就到这里了,大厦之成,非一木之材也;大海之阔,非一流之归也。感谢大家观看本文