什么语言功能消除了一整类错误?

时间:2014-02-26 11:13:49

标签: language-agnostic programming-languages language-features self-healing

我经常看到声称编程语言功能消除了一整类错误。

例如,我见过声称:

  • 强类型系统消除了因使用某种类型不支持的功能而导致的错误类别。

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

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

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

我不是要弄清楚上述声明是否属实,而是编制一份此类声明的清单,这些声明对我来说足以让我自己研究和评估。

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

是否有一般原则或理论来识别执行此操作的功能,或确定缺少此类功能?

(请注意,我包含明显模糊或主观的声明,无论是否真实:

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

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

  • 有意义的空白使程序更清晰。 )

3 个答案:

答案 0 :(得分:2)

不变性

并发

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

副作用

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

非空值

支持不变性作为唯一类型变量的大多数系统也没有Null的概念,要么指定引用,要么它们不是,如果它们不是编译器抱怨,你必须解决它。

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

答案 1 :(得分:1)

以下是我的一些问题:

Class                 Feature                             Example
Type Error            Single Data Type                    awk
Type Mismatch         Union Types                         XQuery
Reference Error       No Variables                        sed
Mismatched Braces     No Braces                           python
Dangling semicolon    Significant Whitespace              python
Buffer Overflow       No Pointer Arithmetic               Ada
Division by Zero      Default to infinity                 lua
Circular Reference    All values are immutable strings    tcl
Circular Import       No Cyclical Dependencies            OCaml
Ambiguous Type        Hindley-Milner type inference       OCaml
Not enough args       Partial Application                 Haxe
Import Error          Implicit Standard Library           Coldfusion
Leaky Abstraction     No Conditional Logic                CSS
Object Expected       Everything is an object             SmallTalk
No such method        Reification                         SmallTalk
Infinite Loop         No Side Effects                     DSSSL
Deadlock              Software Transaction Memory         Clojure
Namespace Conflict    Stack Save/Restore                  PostScript
Invalid arguments     Stack Machine                       PostScript
Heisenbug             Message Passing Concurrency         Erlang

答案 2 :(得分:1)

可选类型消除空指针异常。该类型强制您检查是否存在空值。

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