程序设计方法学的发展历史

程序设计方法学的发展历史,第1张

1950年代—1960年代初,手工艺式的程序设计方法,高德纳把程序称为艺术品。

1960年代末—1970年代初,出现软件危机:一方面需要大量的软件系统,如 *** 作系统、数据库管理系统; 另一方面,软件研制周期长,可靠性差,维护困难。编程的重点:希望编写出的程序结构清晰、易阅读、易修改、易验证,即得到好结构的程序。

1968年,北大西洋公约组织(NATO)在西德召开了第一次软件工程会议,分析了危机的局面,研究了问题的根源,第一次提出了用工程学的办法解决软件研制和生产的问题,本次会议可以算做是软件发展史上的一个重要的里程碑。

1969年,国际信息处理协会(IFIP)成立了“程序设计方法学工作组”,专门研究程序设计方法学,程序设计返蚂销从手工艺式向工程化的物毕方法迈进。 1968 年,结构化程序设计方法的研究。Dijkstra 提出了“GOTO是有害的”,希望通过程序的静态结构的良好性保证程序的动态运行的正确性。

1969 年,Wirth 提出采用“ 自顶向下逐步求精、分而治之” 的原则进行大型程序的设计。其基本思想是:从欲求解的原问题出发,运用科学抽象的方法,把它分解成若干相对独立的小问题,依次细化,直至各个小问题获得解决为止。 1967年,Floyd 提出用“ 断言法” 证明框图程序的正确性。

1969年,Hoare 在Floyd 的基础上,定义了一个小语言和一个逻辑系统。此逻辑系统含有程序公理和推导规则,目的在于证明程序的部分正确性,这就是著名的Hoare逻辑。他的工作为公理学语义的研究奠定了基础。

1973年,Hoare和Wirth把PASCAL语言的大部分公理化。

1975年,一个基于公理和推导规则的自动验证系统首次出现。

1979年,出现了用公理化思想定义的程序设计语言Euclid。

1976年,Dijkstra提出了最弱前置谓词和谓词转换器的概念,用于进行程序的正确性证明和程序的形式化推导。

1980年,D.Gries综合了以谓词演算为基础的证明系统,称之为“程序设计科学”。首次把程序设计从经验、技术升华为科学。

1974年,人们利用模态逻辑验证并行程序的正确性。

关于程序正确性证明的争论:

怀疑和反对派,理由:首先,形式证明太复杂,谁能够保证证明本身没有错误呢!其次,程序写好后再证明其正确性,相当于“ 马后炮” ,即错误已经铸成,证明何能补救?

折中的方案:编写程序,边考虑证明。即程序设计与正确性证明同时并行考虑。 利用Dijkstra 的谓词转换器及其演算规则集合,可以推导出正确的程序。

利用程序变化构造正确的程序。它对程序应用一连串的保护正确性的变换规则,最终得到可执行的程序。程序变换是1970年代以来,“程序设计方法学” 研究的重要方面,是程序设计自动化很有希望的途径之一。递归程序变换是这一时期的最有意义的成果。 如Burstall 和Darlington 的递归程序变换系统等。

逻辑漏游程序设计和函数程序设计代表一种新的研究方向。Prolog是以谓词逻辑的子集(Hoare 子句)为基础的一种形式系统。Prolog 的执行过程就是执行逻辑上消解算法的过程。 抽象数据类型是程序设计方法学中一种极为重要的方法。人们把它誉为程序设计方法学发展史上的一个重要的里程碑。

编程的话,我的语言描述就是,

要编一个程序,那么这个程序有它的基本语言。就像我们学习说散裤宴话,先学会发音,然后组织语言;

学会了基本的语言后,我们就根据需要来编程,在编程过程当中,我们要考虑各种情况,使程序实现我们需要,如果考虑不周到,就会有漏洞,需要补上。所以在编程当中,用到最多的语言就是(如果,或者)这样的词汇。

把各种漏洞都堵上了,电脑执行你的指令,不管你有没有提到其它方面,所有的程序它都要复核一边。所以程序不要太庞大,需要简洁,减少电脑的运行。这个就与你堵漏洞有相反的要求。如果冲银你编写了一个子程序,程序经常要用到这个,那么你要考虑怎么把这个程序精简到最低程度。

因为电脑只能识别这个语言,所以不纯圆能够在语法上有错误,它会理解不了。

说到漏洞,比如说,记事本里面查找功能,你要找文字(J3),那么它把(J33),(J32)里面的也找了,如果你在里面替换什么内容的话,就会出现问题。这个问题就是你要考虑的,怎么把漏洞堵上,不发生这样的问题。

所以我认为编程就是你对这个程序的理解程度考验。至于基本语言你学会就好,你要做的就是把你想说的话,翻译成电脑能够听懂的话。要说明,什么不能够做,什么应当做,一一交代清楚,只要说漏了一句,电脑就不按你的思路走了。(电脑不会思考,你要做的就是让电脑按你的思路走。)

列表就是数据排列的形式,集合,字典也是一样的。

为了构建列表、集合或字典,Python 提供蠢笑了名为“显示”的特殊句法,每个类型各有两种形式:

1.第一种是显式地列出容器内容

2.第二种是通过一组循环和筛选指令计算出来,称为 推导式。

推导式的结构是一个单独表达式后面加至少一个 for 子句以及零个或更多个 for 或 if 子句。 在这种情况下,新容器的元素产生方式是将每个 for 或 if 子句视为一个代码块,按从左至右的顺序嵌套,然后每次到达最内层代码块时就对表达式进行求值以产生一个元素。

不棚档配过,除了最左边 for 子句中的可迭代表达式,推导式是在另一个隐式嵌套的作用域内执行的。 这能确保赋给目标列表的名称不会“泄露”到外层的作用域。

3.最左边的 for 子句中的可迭代对象表达式会直接在外层作用域中被求值,然后作为一个参数被传给隐式嵌套的作用域。 后续的 for 子句以及最左侧 for 子句中的任何筛选条件不能在外层作用域中被求值,因为它们可能依赖于从最左侧可迭代对象中获得的值。 例如: [x*y for x in range(10) for y in range(x, x+10)]。

4.为了确保推导式得出的结果总是一个类型正确的容器,在隐式嵌套作用域内禁止使用 yield 和 yield from 表达式。

5.从 Python 3.6 开始,在 async def 函数中可以使用 async for 子句来迭代 asynchronous iterator。 在 async def 函数中构建推导式可以通过在打头的表达式后加上 for 或 async for 子句,也可能包含额外的 for 或 async for 子句,还可能使用 await 表达式。 如果一个推导式包含 async for 子句或者 await 表达式,则被称为 异步推导式。 异步推导式可以暂停执行它所在的协程函数。

6.种情况下,新容器的元素产生方式是将每个 for 或 if 子句视为一个代码块,按从左至右的顺序嵌套,然后每次到达最内链指层代码块时就对表达式进行求值以产生一个元素。

不过,除了最左边 for 子句中的可迭代表达式,推导式是在另一个隐式嵌套的作用域内执行的。 这能确保赋给目标列表的名称不会“泄露”到外层的作用域。

 7.在 async def 函数中构建推导式可以通过在打头的表达式后加上 for 或 async for 子句,也可能包含额外的 for 或 async for 子句,还可能使用 await 表达式。 如果一个推导式包含 async for 子句或者 await 表达式,则被称为 异步推导式。 异步推导式可以暂停执行它所在的协程函数。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8255503.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存