- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我被教导了 formal systems在大学时,但我很失望他们似乎并没有被真正使用。
我喜欢能够知道某些代码(对象、函数等)是否有效的想法,而不是通过测试,而是通过证明。
我相信我们都熟悉物理工程和软件工程之间不存在的相似之处(钢的行为可预测,软件可以做任何事情 - 谁知道呢!),我很想知道是否存在任何可以在现实世界中使用的语言(对 Web 框架的要求太多了吗?)
我听说过有关 scala 等函数式语言的可测试性的有趣事情。
作为软件工程师我们有什么选择?
最佳答案
是的,有些语言专为编写可证明正确的软件而设计。有些甚至用于工业。 Spark Ada可能是最突出的例子。我与 Praxis Critical Systems Limited 的一些人交谈过,他们将它用于在 Boings 上运行的代码(用于引擎监控),它看起来相当不错。 (这里有一个很棒的summary / description of the language。)这种语言和随附的证明系统使用下面描述的第二种技术。它甚至不支持动态内存分配!
我的印象和经验是编写正确的软件有两种技巧:
技巧 1:用您熟悉的语言(例如 C、C++ 或 Java)编写软件。采用这种语言的正式规范,并证明您的程序是正确的。
如果您的目标是 100% 正确(这通常是汽车/航空航天行业的要求),那么您将花费很少的时间进行编程,而将更多的时间用于证明。
技巧 2:用稍微笨拙的语言编写软件(例如 Ada 的某个子集或 OCaml 的调整版本),并在此过程中编写正确性证明。在这里,编程和证明齐头并进。 Coq 中的编程甚至完全等同于它们! (见Curry-Howard correspondence)
在这些情况下,您总是会得到一个正确的程序。 (一个错误将被保证 Root 于规范中。)您可能会花更多时间在编程上,但另一方面,您会在此过程中证明它是正确的。
请注意,这两种方法都取决于您手头有一个正式的规范(否则您将如何判断什么是正确/不正确的行为)和一个正式定义的语言语义(否则您将如何判断你的程序的实际行为是)。
这里还有一些正式方法的示例。如果它是“真实世界”,取决于你问谁:-)
我只知道一种“可证明是正确的”网络应用程序语言:UR .保证“通过编译器”的 Ur 程序不会:
关于java - 是否有任何可证明的现实世界语言? (斯卡拉?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4065001/
笙歌 痞性. 剩余 青怏 洒脱 现实 搁浅° 软萌 路途 娼妓 离骚 逐你 微尘 迷魂 ▼ 扎心 堇夏 残年っ ╭淡妆╮ 24K.纯疯 隐痛
我正在尝试不费吹灰之力地实现完全有效的持久性无知。不过我有很多问题: 最简单的选项 这真的很简单——可以像在 SOA 中那样使用 Spring Data 注释对实体进行注释(但让它们真正执行逻辑)?除
我想完成一项简单的任务。 我在可变宽度容器中有一个图像。 容器的宽度可以为 300、400、700 或 900 像素。这是通过媒体查询完成的图像应占据该容器的所有宽度。所以它也将是 300、400、7
我在使用 Storyboards AutoRotation 和 iPhone 时遇到问题。我已经将一个非常简单的项目与 3 个 View Controller 放在一起,并将其上传到 gitHub 以
我是一名优秀的程序员,十分优秀!