我在编译器类中,我们的任务是从头开始创建自己的语言.目前我们的困境是是否包含'null'类型.null提供了什么目的?我们的一些团队认为这不是绝对必要的,而其他人则只是因为它可以提供额外的灵活性.
你有什么想法,尤其是支持或反对null吗?您是否曾创建过需要null的功能?
Null:十亿美元的错误.Tony Hoare:
我称之为十亿美元的错误.它是1965年空引用的发明.那时,我正在设计第一个用于面向对象语言(ALGOL W)的引用的综合类型系统.我的目标是确保所有引用的使用绝对安全,并由编译器自动执行检查.但是我无法抗拒引入空引用的诱惑,仅仅因为它很容易实现.这导致了无数的错误,漏洞和系统崩溃,这可能在过去四十年中造成了数十亿美元的痛苦和损害.近年来,许多程序分析器(如Microsoft中的PREfix和PREfast)已用于检查引用,如果存在风险,则可能会出现非空的警告. 最近的编程语言如Spec#引入了非空引用的声明.这是我在1965年拒绝的解决方案.
null
是一个不是整数的标记值,不是字符串,不是布尔值 - 实际上没有任何东西,除了要保留的东西并且是"不存在"值.不要将其视为或期望它为0,或空字符串或空列表.这些都是有效的值,并且在许多情况下可以是绝对有效的值 - 而null的概念意味着那里没有值.
也许它有点像抛出异常而不是返回值的函数.除了制造和返回具有特殊含义的普通值之外,它返回一个已经具有特殊含义的特殊值.如果某种语言需要您使用null
,那么您就无法忽略它.
哦不,我觉得哲学专业来自我......
NULL的概念来自集合论中空集的概念.几乎每个人都同意空集不等于零.几十年来,数学家和哲学家一直在争论集合论的价值.
在编程语言中,我认为理解不引用内存中任何内容的对象引用非常有用.谷歌关于集理论,你会看到,设置理论家使用我们在许多计算机语言都使用正规的符号系统(符号)与符号之间的相似之处.
问候,山姆
什么是空的你问?
好,
没有.
我通常认为'内存地址0'的C/C++方面的'null'.它不是严格需要的,但如果它不存在,那么人们只会使用别的东西(如果myNumber == -1,或者myString =="").
我所知道的是,我想不出有一天我花了编码而没有输入"null"这个词,所以我认为这非常重要.
在.NET世界中,MS最近为int,long等添加了可以为空的可空类型,因此我猜他们认为它也非常重要.
如果我正在设计一个语言,我会保留它.但是,我不会避免使用没有null的语言.它也只需要一点点使用.
零的概念在完全相同的意义上并不是绝对必要的,即零概念不是绝对必要的.
我不认为在整个语言设计的上下文之外讨论null是有帮助的.混淆的第一点:null类型是空的,还是包含一个唯一的值(通常称为"nil")?完全空的类型不是很有用 - 虽然C使用空返回类型void
来标记仅为副作用执行的过程,但许多其他语言为此目的使用单例类型(通常是空元组).
我发现在动态类型语言中最有效地使用了nil值.在Smalltalk中,它是您需要值但您没有任何信息时使用的值.在Lua中,它的使用效率更高:nil值是唯一不能成为Lua表中的键或值的值.在Lua中,nil也用作缺失参数或结果的值.
总的来说,我会说nil 值在动态类型设置中很有用,但在静态类型设置中,null 类型仅用于讨论为副作用执行的函数(或过程或方法).
不惜一切代价,避免使用C和Java中使用的NULL
指针.这些是指针和对象实现中固有的工件,并且在设计良好的语言中,它们不应被允许.通过任何方式为您的用户提供一种方法来扩展具有空值的现有类型,但是让他们明确地明确地这样做 - 不要强迫每个类型偶然拥有一个类型.(作为显式使用的一个例子,我最近在Haskell中实现了Bentley和Sedgewick的三元搜索树,我需要使用一个额外的值来扩展字符类型,这意味着"不是一个字符".为此,Haskell提供了Maybe
类型.)
最后,如果您正在编写编译器,最好记住要编译的语言最简单的部分,以及导致最少错误的部分,是不存在的部分:-)
有一种方法来指示一个当前没有指向任何东西的引用或指针似乎很有用,无论你把它称为null,nil,None等等.如果没有其他理由让人们知道它们什么时候即将坠落在链表的末尾.
在C NULL中是(void*(0)),所以它是一个带值(?)的类型.但这不适用于C++模板,因此C++使NULL 0,它删除了类型并成为纯值.
然而,发现具有特定的NULL类型会更好,因此他们(C++委员会)决定NULL将再次成为一种类型(在C++ 0x中).
除了C++之外,几乎每种语言都有NULL作为类型,或者等价的唯一值与0不同(它可能等于或不等,但它的值不同).
所以现在即使C++也会使用NULL作为一种类型,基本上关闭了关于这个问题的讨论,因为现在每个人(几乎)都会有一个NULL类型
编辑:思考它Haskell可能是NULL类型的另一种解决方案,但它不容易掌握或实现.