程序设计方法和程序分析
1.概述
程序设计方法和程序分析是两个不同范围应用的技术。
程序设计方法是提高程序效率和确保程序正确性而产生的软件理论。经过战胜软件危机,丰富深刻的设计方法的出现,越来越多的应用编程,程序员和编程爱好者建立了程序设计方法学。
而程序分析是发现程序设计方法不能阻止的程序错误和程序缺陷而发展的。程序分析对已有程序的执行次数、程序路径、变量值进行分析。
程序效率表示程序的性能,人们用算法复杂度表示--理论上的运行时间和运行所需存储空间,包括程序地址空间和系统栈空间。程序正确性引导程序开发过程,则形成程序的形式推导方法。正确性的程序经过正确的程序变换规则生成的程序也是正确的。程序正确性能引导程序开发过程。Floyd-Hoare规范公理用短小精悍的不等式、数学表达式和逻辑运算符表示前断言P和计算语句结果的后断言Q,控制条件B划分为{B,-B}成为条件语句P或循环语句Q的一部分。验证的形式是规则前提和结论的分式形式。
程序效率在结构程序设计上,表现的特征是单入口和单出口的相对独立的控制语句,因此循环语句可视为单路径而if-else条件语句则是双路径;程序正确性则表现为程序具体结构和内部逻辑的良型控制结构。过程则对时间一定有要求。Unix/Linux系统的并发程序或多核多线程必须处理程序实体在执行时间上的严格性要求,所以应建立进程(线程)调度的合乎运行机制的时间序列,以防止死锁、进程实际饥饿和资源消耗。程序效率则表现在进程控制语句fork()、waitpid()、signal()、exit()、ftok()和msgget()等对进程创建和执行时间与进程间关系的精确控制和进程存储空间的管理,程序正确性则是并发程序能遵循进程(线程)调度和执行的全部正确性原则。
程序效率在面向对象技术上,表现的特征是类、模板封装的内聚性和实现的独立性,而且实例化和类对象的存储管理也是特征。而效率的另一个特征是软件复用,类库与过程式函数库调用复用相似,STL的容器和模板的实参具有数据类型的通用方式的实例复用,类层次的继承是软件复用的进化。此外,多态是函数参数数据类型的多种形式的要求,可认为是currying技术的应用[4]。程序正确性在面向对象技术中的应用表现在四个方面:(1)设置访问控制,类、继承和友元的访问权限,(2)独立设计方法:类的接口与实现分离、虚拟函数与继承实现、模板定义与实例化、容器与元素实参数据类型(并不熟练)(3)管理存储单元:静态成员、对象、容器、多继承,防止资源重复删除和悬挂指针。(4)最后是系统自动调用的机制。系统自动调用创建、复制构造、赋值、移动、析构操作和实现默认类操作,防止对类和对象的活动期管理出现漏洞。
Backus在1977年的图灵奖颁奖典礼上发表的演讲提出函数式FR程序设计。用无变量的原始函数的递推公式定义、函数组合和泛函型的方法编程,主要使用递推公式映射的递归方式,程序代数可实现FR推导。现代函数式程序的效率表现在用运行时系统的图规约表示高阶函数和惰性计算。程序正确性表现在可计算函数和数学泛函型的正确性上。FR函数程序设计反应了输入数据和输出数据间的关系(Relation),也可用传递函数实现,因此前后断言和谓词转换器能证明程序正确性。但是Relation不是流程,而是组成程序执行过程的操作有序组。
Lisp和prolog是人工智能推出的逻辑式程序设计,是在解空间事实和规则的子句列表推理执行(寻找与合一)“新”事实的方法。实际上,逻辑式程序设计中的关系,并不是高阶函数或者传递函数,而是多个项间的关系或约束。
编译原理使用程序分析方法,包括控制流、数据流、符号分析,目的是发现控制流走向,优化程序,产生目标代码,以及分析并行成分。
程序设计方法和程序分析的关键技术有:(1)实例化,原因是程序分析中数据与变量的相对独立性,程序设计方法中类型与类型名的独立性,操作对象与具体数据结构实现的相对独立性。(2)映射,包括数据类型的数据实例化,C++的map类,类模板实参,多态函数在运行时绑定,甚至包括递归程序的取样规则和展开规则,而程序变换的等价模式有序对也可看作映射,尽管需要程序变换规则。(3)软件复用,库函数、封装、模板和容器、数据结构的通用算法。
程序设计方法和程序分析关键技术见表1,分类表目包括1和2类,分别是程序设计方法和程序分析两种类型。
表1 程序设计方法和程序分析的关键技术
功能需求 |
程序执行过程 |
构造基础 |
理论基础 |
分类 |
|
程序形式推导 |
不变式,界函数,一阶谓词 |
语句,面向目标。 |
最弱前置条件 |
1 |
|
函数式程序 |
无变量函数定义与组合型 |
图规约 |
语句,函数与泛函型 |
程序变换和程序代数 |
1 |
程序变换 |
程序形式规范 |
一阶谓词与函数定义 |
程序变换规则 |
1 |
|
ADT |
代数规范(操作) |
公理用作程序 |
类(class) |
抽象代数 |
1 |
符号执行 |
符号执行树 |
路径约束 |
程序形式推导 |
2 |
|
部分值求解 |
静态精确公式,动态转换系统* |
程序例化器 |
程序、输入数据,例化程序 |
程序转换与程序例化。s-m-n理论 |
2 |
控制流图 |
CFG* |
基本块 |
编译原理 |
2 |
|
数据流图 |
DFG* |
变量依赖 |
编译原理 |
2 |
|
程序切片 |
FG,PDG,SDG* |
语句,可达 |
信息流和路径例化 |
2 |
|
Floy-Hoare |
{P}S{R} |
前后断言 |
语句,上下文 |
规则与证明 |
1 |
最弱前置条件 |
wp(“S”,R) |
语句,谓词转换器 |
谓词语义 |
1 |
|
程序测试 |
路径,循环* |
测试用例 |
1,2 |
在表1可知,程序的功能需求表示在程序设计中,用程序形式规范,实质是一阶谓词(若不包括程序分析中的程序结构方式*),Floyd-Hore规则逻辑和wp(“S”,R)谓词转换器的实质也是一阶谓词或者功能相似的数学表达式。另一种表示形式是代数规范或者泛函数型。因此对程序功能的表示是不足的,谓词和不等式并不能刻画程序功能的实质。程序功能是表示程序对数据的操作,例如复制移动、计算、排序、路径节点的集合扩展,以及数据间的逻辑关系,例如follow集、first集、R[com]算法的计算关系、数量大小关系和路径关系,实现程序的外在功能。
程序设计方法和程序分析相关推荐
- 2008年上半年程序员考试试题分析
文章试读 不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国.一.二.三.四 职场规划:一些杂七杂八的职场感悟吧.不值钱的软件人才 精力充沛与事业成功 让系分来得更猛烈 ...
- 从程序员的角度分析微信小程序
从程序员的角度分析微信小程序 我赶快在书架上拿出三年前买的书,把上面的土擦干净,压压惊. 作为一个并不是资深的程序员. 从程序员的角度分析一下微信小程序,欢迎指点. 首先 ...
- 应用程序文件Android安全分析挑战:运行时篡改Dalvik字节码
发一下牢骚和主题无关: 本文章由Jack_Jia编写,转载请注明出处. 文章接链:http://blog.csdn.net/jiazhijun/article/details/8833710 作者:J ...
- 微信小程序一定要用https的理由,小程序使用HTTPS链接分析
微信小程序一定要用https的理由,小程序使用HTTPS链接分析 一.HTTPS HTTPS是HTTP的安全版,在HTTP的基础上加入SSL证书 (服务器证书)后形成的安全协议,不但可以建立信息加密通 ...
- 介绍一个对陌生程序快速进行性能瓶颈分析的技巧
前言 工作多年,一直做的是curd系统.前几年做的系统应用场景,大多对数据库依赖比较重.例如报表统计,数据迁移,批量对账等.所以这些系统出现性能瓶颈一般出在数据库操作上面. 如果程序因为数据库操作出现 ...
- NS2相关学习——可靠的MANET应用程序的Gossip协议分析
好久不写,应该努力啦!老师把这篇论文给了我,现在还不知道它在讲什么,来边翻译边学习吧! 文章链接:https://www.researchgate.net/publication/316844643_ ...
- 菜鸟学习笔记:Java基础篇3(面向对象思想、程序执行过程内存分析、面向对象重要概念)
菜鸟学习笔记:Java面向对象篇上 Java面向对象的思想 Java程序执行过程内存分析 Java垃圾回收机制 构造方法 方法重载(overload) static关键字 this关键字 Java面向 ...
- Python 开发工具集:关于文档、测试、调试、程序的优化和分析
Python 开发工具集:关于文档.测试.调试.程序的优化和分析 原文 http://segmentfault.com/a/1190000000410521 Python已经演化出了一个广泛的生 ...
- 微信小程序和PWA对比分析
微信小程序和PWA对比分析 微信小程序和PWA(Progressive Web App)是目前移动端以及前端受关注度较高的两项技术.小程序自去年公测以来,国内很多公司均投入到小程序的开发中,今日头条. ...
- 微信小程序——微信小程序后台自定义分析,数据准确性分析
序 由于公司小程序产品大多为信息流产品,所以对小程序图文的数据准确性,精细度有较高的需求,以便编辑人员通过对数据的分析,可以针对性的编写图文,提高爆文数量. 问题描述 公司自己是有一个统计平台,对小程 ...
最新文章
- 12本接收率高的医学SCI期刊
- XgCalendar 代码导读和Demo详解(1)参数说明和数据结构
- ipv6链路本地地址ping不通
- Nginx的安装(笔记)
- 943. Find the Shortest Superstring
- linux的程序员计算器,linux中的计算器
- 读取gdb中的图层类型_ArcGIS读取gdb内要素
- linux配置NFS系统
- 在java中通过过键盘输入_java中从键盘输入
- 内联函数inline的使用
- 超标量处理器设计 姚永斌 第1章 超标量处理器概览 摘录
- long8.cc app.html,Potoshop 长投影扩展插件 Long Shadow Generator 支持CS6-CC2015
- Pivotal 任命Lionel Lim为Pivotal公司副总裁兼亚太区常务董事
- Java 6.22练习-----模拟物流快递系统程序设计
- 山东济南计算机比赛,第十二届齐鲁软件大赛及首届济南市计算机科技奖颁奖盛典举行...
- 小米手机MIUI关闭广告
- HTML CSS个人网页设计与实现——人物介绍丁真(学生个人网站作业设计)
- WinSock控件及WinSockAPI
- 多项式轨迹--五次多项式轨迹
- 利用VS安装项目打包软件的做法