我正在参加编译器课程,我们的任务是从零开始创建自己的语言。目前我们的困惑是是否包括“null”类型。null有什么作用?我们团队中的一些人认为它并不是绝对必要的,而另一些人则赞成使用null来提供额外的灵活性。
你有什么想法,特别是支持或反对null吗? 您是否曾经创建需要使用null的功能?
我正在参加编译器课程,我们的任务是从零开始创建自己的语言。目前我们的困惑是是否包括“null”类型。null有什么作用?我们团队中的一些人认为它并不是绝对必要的,而另一些人则赞成使用null来提供额外的灵活性。
你有什么想法,特别是支持或反对null吗? 您是否曾经创建需要使用null的功能?
Null: The Billion Dollar Mistake. 托尼·霍尔:
我称之为我的十亿美元的错误。它是在1965年发明了null引用。当时我正在设计第一个综合引用类型系统的面向对象语言(ALGOL W)。我的目标是确保所有引用的使用都绝对安全,由编译器自动执行检查。但我忍不住诱惑,加入了一个null引用,因为它非常容易实现。这导致了无数的错误、漏洞和系统崩溃,在过去四十年里可能已经造成了十亿美元的痛苦和损失。近年来,像Microsoft的PREfix和PREfast这样的程序分析器已被用于检查引用,并在存在风险的情况下发出警告。更近期的编程语言,如Spec#,已经引入了非null引用的声明。这正是我在1965年放弃的解决方案。
null
是一个特殊的值,它既不是整数、字符串、也不是布尔型 - 实际上除了作为“不存在”的值之外,没有其他的用处。请不要将其视为0、空字符串或空列表。这些都是有效的值,在许多情况下可以是真正的有效值 - 相反,null 的概念意味着没有值存在。
或许这有点像函数抛出异常而不是返回值。但与其返回一个具有特殊含义的普通值不同,它返回一个已经具有特殊含义的特殊值。如果一种语言希望你使用 null
,那么你就不能忽略它。
哦不,我感觉到了哲学专业的气息...
NULL的概念来自于集合论中空集的概念。几乎所有人都认为空集不等于零。数学家和哲学家们已经争论集合论的价值数十年了。
在编程语言中,我认为了解不指向内存中任何东西的对象引用非常有帮助。搜索关于集合论的文章,你会发现集合论使用的形式符号系统(符号表示法)与许多计算机语言中使用的符号之间存在相似之处。
问候, Sam
你问什么是null?
嗯,
什么都不是。
我通常将 C/C++ 中的“null”看作是“内存地址0”的概念。虽然它不是必需的,但如果它不存在,那么人们就会使用其他东西(例如:if myNumber == -1,或者 if myString ==“”)。
我所知道的是,在编写代码时,我几乎没有一天没有输入过“null”这个单词,因此我认为它非常重要。
在 .NET 世界中,微软最近为 int、long 等类型添加了可空类型,这些类型以前都是不可空的,所以我认为他们也认为它很重要。
如果我设计一种语言,我会保留它。但是,如果一门语言没有 null,我也不会避免使用它。只是需要适应一下。
在严格意义上,空值的概念并不像零值那样是必须的。
null
不像零一样基本,但是许多语言都有一个运算符,其中null
是恒等元素:http://en.wikipedia.org/wiki/Null_coalescing_operator - Kannan Goundanvoid
来标记仅用于副作用执行的过程,但许多其他语言使用单例类型(通常为空元组)来实现这一目的。NULL
指针。这些是指针和对象实现中固有的产物,在设计良好的语言中不应该允许它们存在。一定要给你的用户一种使用null值扩展现有类型的方式,但是让他们明确地、有意识地这样做---不要强迫每种类型都有一个。 (作为明确使用的示例,我最近在Haskell中实现了Bentley和Sedgewick的Ternary search tree,并且我需要将字符类型扩展一个额外的值,表示“不是字符”。出于这个目的,Haskell提供了Maybe
类型。)Src
和一个置换映射Permute
,希望创建一个新数组Dest
,使得Dest[Permute[i]]=src[i]
。如果Dest
预先填充为null
,那么Permute[]
中的错误就不太可能被忽略了。 - supercatnull
的引用类型变量具有有效的值,即使该值不标识任何对象]本身就非常有价值。 - supercat似乎有一种方法可以指示一个当前没有指向任何东西的引用或指针,无论你称其为null、nil、None等。即使出于其他原因,也要让人们知道他们即将从链接列表的末尾掉下来。
null
值的语言中,这就是列表构建的方式。 - Tom LokhorstNull的一个实际例子是当你提出了一个是或否的问题,但没有得到回答时。你不想默认为否,因为在非常重要的情况下,知道问题未被回答可能很重要。