软件中级设计师 - 程序语言设计

程序设计语言基本概述

程序设计语言是为了书写计算机程序而人为设计的符号语言,用于对计算过程进行 描述、组织和推导。

  • 低级语言:机器语言(计算机硬件只能识别0和1的指令序列),汇编语言。

  • 高级语言:功能更强,抽象级别更高,与人们使用的自然语言比较接近。

各程序设计语言特点:

  • Fortran语言(科学计算,执行效率高)
  • Pascali语言(为教学而开发的,表达能力强,Delphi)
  • C语言(指针操作能力强,高效)
  • LisP语言(函数式程序语言,符号处理,人工智能)
  • C++语言(面向对象,高效,和C一起常用于系统级软件开发)
  • Java语言(面向对象,中间代码,跨平台)
  • C#语言(面向对象,中间代码,.Net)
  • Prolog语言(逻辑推理,简洁性,表达能力,数据库和专家系统)

常见的程序脚本语言

脚本语言是为了缩短传统的编写-编译-链接-运行过程而创建的计算机编程语言。脚本语言一般指无需编译,逐行解释执行的语言。

  • python语言 (快速脚本语言)
  • JavaScript(脚本语言)
  • PHP(嵌入HTML文档的脚本语言)
例题:
脚本语言不是通用的程序设计语言!!!
程序设计语言通过编译方法实现,需要编译器
而脚本语言通过结束方式实现,不需要编译器,但需要解释器

解释和编译:

都是将高级语言翻译成计算机硬件认可的机器语言加以执行。不同之处在于

  • 编译程序生成独立的可执行文件,直接运行,运行时无法控制源程序,效率高。

  • 而解释程序不生成可执行文件,可以逐条解释执行,用于调试模式,可以控制源程序,因为还需要控制程序,因此执行速度慢,效率低。

程序设计语言组成:

语法(一组规则)、语义(语法成分的含义)、语用(构成语言的各个记号和 使用者的关系)。

程序设计语言的基本成分

数据成分:指一种程序设计语言的数据和数据类型。数据分为常量(程序运行时不可改变)、变量(程序运行时可以改变)、全局量(存储空间在静态数据区分配)、局部量(存储空间在堆栈区分配)。数据类型有整型、字符型、双精度、单精度浮点型、布尔型等。

运算成分:指明允许使用的运算符号及运算规则。包括算术运算、逻辑运算、关系运算、位运算等。

控制成分:指明语言允许表述的控制结构。包括顺序结构、选择结构、循环结构(初始化+循环体+循环条件)。

传输成分:指明语言允许的数据传输方式。如赋值处理、数据的输入输出等

例题:
确定数据类型的优点:
1. 有利于确定存储空间
2. 有利于确定取值范围
3. 有利于数据检查

函数

传值调用:将实参的值传递给形参,形参的改变不会导致调用点所传的实参的值改 变。实参可以是合法的变量、常量和表达式。

传址调用:即引用调用,将实参的地址传递给形参,即相当于实参存储单元的地址 引用,因此其值改变的同时就改变了实参的值。实参不能为常量,只能是合法的变 量和表达式。

因此,在编程时,要改变参数值,就传址,不改变,就传值。

函数调用时基本的参数传递方式有传值与传地址两种。
传值调用是将实参的值传给被调用函数的形参,因此实参可以是常量、变量、表达式或函数调用;
传地 址调用(或引用调用)的实质是将实参的地址传给被调用函数的形参,因此实参必须具有地址。

编译程序基本原理

编译程序的功能是把某高级语言书写的源程序翻译成与之等价的目标程序(汇编语 言或机器语言)。编译程序工作过程分为6个阶段,如下图所示:

在这里插入图片描述

  • 词法分析:是编译过程的第一个阶 段。这个阶段的任务是从左到右 个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然 后根据构词规则识别单词(也称单 词符号或符号)。
    • 有限自动机是实现的适当工具
  • 语法分析:是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类 语法短语,如“程序”,“语句”, “表达式”等等.语法分析程序判断源 程序在结构上是否正确
    • 自上而下 – 递归向下分析法
    • 自下而上 – 移进归约分析法
  • 语义分析:是编译过程的一个逻辑阶段.语义分析的任务是对结构上正确的源程序 进行上下文有关性质的审查,进行类型审查。如类型匹配、除法除数不为0等。又分为静态语义错误(在编译阶段能够查找出来)和动态语义错误(只能在运行时不一定被发现,比如死循环)
  • 中间代码生成:中间代码是根据语义分析产生的,需要经过优化链接, **最终生成可执行的目标代码。引入中间代码的目的是进行与机器无关的代码优化处理。常用的中间代码有后缀式(逆波兰式)、三元式(三地址码)、四元式和树等形式。**需要考虑三个问题(一是如何生成较短的目标代码;二是如何充分利用计算 机中的寄存器,减少目标代码访问存储单元的次数;三是如何充分利用计算机指令 系统的特点,以提高目标代码的质量)。
  • 目标代码生成:这个阶段的任务是把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码,这个阶段的工作与具体的机器密切相关。(分配寄存器)
例题:
1. 
中间代码生成 和 代码优化 不是编译器必需的!

2. 
词法分析输入是 记号流
字符流是java中的知识
语法分析后就能构造出分析树

3.
符号表 --  记录变量等
始于词法分析
中间代码 – 后缀式(逆波兰式)

【图】

要掌握上述三种表达式即可,其实就是树的三种遍历,一般正常的表达式是中序遍历 即中缀表达式,根据其构造出树,再按题目要求求出前缀或后缀式。

例:a+(b-c)*d的后缀式是(?)。

abc-d*+
简单求法:后缀表达式是从左到右开始,先把表达式加上括号,再依次把运算符加到本层次的括号后面。

文法

文法定义

一个形式文法是一个有序四元组G=(V,T,S,P),其中:

  • V:非终结符。不是语言组成部分,不是最终结果,可理解为占位符。
  • T:终结符。是语言的组成部分,是最终结果。V⌒T=θ
  • S:起始符。是语言的开始符号。
  • P:产生式。非终结符推导出终结符的公式。形如α->β
例:已知文法G:S->A0|B1 , A->S1|1 , B->S0|0,其中S是开始符。从S出发可以推导出(?)。

带入:S->(S1|1)0 | (S0|0)1
     S->S10 | 10 | S01 | 01
     S-> 1
     某些0和1个数相等的字符串
    ????还不会!

闭包,概念如下图,一般考察闭包可以为0个的情况代入运算:

  • 正则闭包:A+=A^1 U A^2 U A^3 U…U A^n U…(也就是所有幂的组合)。

  • 闭包:A*=A^0 U A^+(在正则闭包的基础上,加上A0={ε})。

例:
a*={a,aa,aaa,…,ε}
而(ab)*={ab,abab,ababab,.,ε}
文法类型

在这里插入图片描述

正规式

即 正则表达式

  • https://www.runoob.com/regexp/regexp-syntax.html
有限自动机

确定的有限自动机和不确定的有限自动机

输入一个字符,看是 否能得出唯一的后继(相同条件能有多种选择),若能,则是确定的,否则若得出多个后继则是不确定的。

例: 知道 初态 和 终态 推到即可!
语法分析方法【了解】

自上而下语法分析:最左推导,从左至右。给定文法G和源程序串r。从G的开始符号S出发,通过反 复使用产生式对句型中的非终结符进行替换(推导),逐步推导出r。

递归下降思想:原理是利用函数之间的递归调用模拟语法树自上而下的构造过程,是一种自上而下 的语法分析方法。

自下而上语法分析:最右推导,从右至左。从给定的输入串开始,不断寻找子串与文法G中某个产 生式P的候选式进行匹配,并用P的左部代替(归约)之,逐步归约到开始符号S。

移进规约思想:设置一个栈,将输入符号逐个移进栈中,栈顶形成某产生式的右部时,就用左部去 代替,称为归约。很明显,这个思想是通过右部来推导出左部,因此是自下而上语法分析的核心思.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值