2

我经常看到有人声称编程语言的特性可以消除一整类错误。

例如,我看到声称:

  • 强类型系统消除了由于使用类型不支持的特性而导致的错误类别。

  • 自动内存管理消除了与为对象/结构分配正确内存量相关的错误类别。

  • 强制变量初始化消除了空指针或空引用错误。

  • 不可变数据结构消除了由于不了解更改可变状态的影响而导致的错误类别。

我并不是要找出上述主张是否正确,而是编制一份足够具体的此类主张清单,以供我研究和评估自己。

据称还有哪些其他特定功能可以消除一整类错误?

是否有一个通用的原则或理论来识别这样做的特征,或者识别这些特征的缺失?

(请注意,我包括这些明显含糊或主观的主张,无论是否真实:

  • 面向对象的编程提高了可重用性。

  • 动态语言的编程速度更快。

  • 有意义的空白使程序更干净。)

4

3 回答 3

2

不变性

并发

不变性减少了并发系统中的所有共享数据问题。并发和缓存是最难改正的两件事,大多数人在尝试编写任何一种类型的代码的前几十次都会出错。

副作用

不变性还使代码具有确定性,函数的输入在函数范围内永远不会改变,无论是在函数内部还是外部,这意味着没有副作用。

非空值

大多数支持不变性作为唯一变量类型的系统也没有 的概念Null,或者引用被分配或者不被分配,如果它们不是编译器抱怨并且你必须修复它。

final在 Java 中,对参数和返回值的引用和注释的自由使用@Nonnull消除了几乎所有基于非逻辑的错误,或者在编译时或运行时的早期显示它们

于 2014-03-05T00:42:12.193 回答
1

可选类型消除了空指针异常。该类型强制您检查空值的可能性。

大多数通用编程语言都有某种形式的可选类型。Maybe在 Haskell 中,Option在 OCamlOptional中,Java 中的泛型类型。

于 2014-03-04T22:43:25.090 回答
1

以下是我的一些想法:

类特征示例
类型错误单一数据类型 awk
类型不匹配联合类型 XQuery
参考错误无变量 sed
不匹配的大括号没有大括号 python
悬空分号重要空白python
缓冲区溢出无指针算术 Ada
除以零默认为无穷大lua
循环引用所有值都是不可变字符串 tcl
循环导入无循环依赖 OCaml
模糊类型 Hindley-Milner 类型推断 OCaml
没有足够的 args 部分应用 Haxe
导入错误隐式标准库 Coldfusion
泄漏抽象无条件逻辑 CSS
期望的对象 一切都是对象 SmallTalk
没有这种方法具体化 SmallTalk
无限循环无副作用 DSSSL
死锁软件事务内存 Clojure
命名空间冲突堆栈保存/恢复 PostScript
无效的参数堆栈机器 PostScript
Heisenbug 消息传递并发 Erlang
于 2014-03-01T08:29:58.247 回答