我经常看到声称编程语言功能消除了一整类错误。
例如,我见过声称:
强类型系统消除了因使用某种类型不支持的功能而导致的错误类别。
自动内存管理消除了与为对象/结构分配正确内存量相关的错误类别。
强制变量初始化消除了空指针或空引用错误。
不可变数据结构消除了由于不了解改变可变状态的影响而导致的错误类别。
我不是要弄清楚上述声明是否属实,而是编制一份此类声明的清单,这些声明对我来说足以让我自己研究和评估。
还有哪些其他特定功能可以消除一整类错误?
是否有一般原则或理论来识别执行此操作的功能,或确定缺少此类功能?
(请注意,我不包含明显模糊或主观的声明,无论是否真实:
面向对象编程提高了可重用性。
动态语言编程速度更快。
有意义的空白使程序更清晰。 )
答案 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
泛型类型。