- 主题:编程语言中的null,算不算是一个失败的设计?
- null的始作俑者自己早就承认了,是一个多少billion的失败了啊
 https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare/
 
 所以kotlin、dart啊啥的,都加了编译器层面的东西搞定这个问题
 
 Rust和cpp后来的搞法,是optional吧
 --
 修改:z16166 FROM 125.35.125.*
 FROM 125.35.125.*
 
- std::optional(cpp)、std::option(Rust)可以认为就是一个object,两种状态:有值、无值。
 
 kotlin的搞法是码农要告诉编译器某个变量的值是否可能为null,用语法糖 ? 区分,
 对于可能为null的变量,编译期跟踪码农是否做了null check,不做的编过不去。
 对于一定不会为null的变量,禁止可能的null赋值。
 
 【 在 chaobill 的大作中提到: 】
 : 返回 object 多好,然后由语法检测是 empty
 --
 FROM 125.35.125.*
 
- cpp的optional还不是针对指针的
 
 主要内存分配失败这个操作没法完全避免,失败时也没法返回一个有意义的值(会被拿来读写内存),如果不想null被到处传播,那就只能就地panic或者扔异常,但有些应用不能这么干。
 
 GSL里搞了个not_null,只能部分缓解
 https://visualstudiomagazine.com/articles/2016/06/01/using-the-not_null-template.aspx
 
 
 【 在 hgoldfish 的大作中提到: 】
 : 关键是默认整个编程环境都是 non-null 的,optional 也是少部分,免得心智负担太重。现有语言写多了都是 optional<> 和 ?. 到处飘,很丑很恶心。
 :
 --
 修改:z16166 FROM 125.35.125.*
 FROM 125.35.125.*
 
- 用go的码农不需要关心内存分配和释放,
 但是go runtime的实现者需要关心这个问题,不把内存分配失败作为null暴露给码农,那就只能在out of memory时直接panic了。
 
 【 在 littleSram 的大作中提到: 】
 : 我也不喜欢optional,没什么本质改变,还不如go的默认值设计,字符串永远不会为null
 : :
 --
 FROM 125.35.125.*
 
- null涉及的是关心的是失败与否,不是性能。
 
 【 在 littleSram 的大作中提到: 】
 : 写go的一些高性能库的,也要关心的。是分配到goroutine的栈上还是堆上。
 : :
 --
 FROM 125.35.125.*
 
- make和new?卧槽这个口子一开,等于是go和cpp在null问题上是一样的啊
 
 go的文档貌似没描述new在内存不足时是返回nil,还是直接panic。估计得看实现代码?
 
 如果能接受new直接抛异常,cpp其实可以不用处理null。
 pure C也可以规定用统一的allocator,做到内存不足时直接panic,而不返回null。
 可惜的是很多情况下同一个team的各人搞各人的,各种代码写法混在一个工程中。调用的第三方库也得封掉null。
 另外有些工程不允许直接panic。
 
 【 在 littleSram 的大作中提到: 】
 : go有指针,会有dereference
 : :
 --
 修改:z16166 FROM 125.35.125.*
 FROM 125.35.125.*
 
- null没问题,而且避免不了(没人能避免内存分配失败,顶多失败后不传播这个null出去)
 
 null ref/deref有问题,应该想办法避免。
 
 【 在 ackerx 的大作中提到: 】
 : NULL为什么失败?没懂。挺好的啊。
 --
 修改:z16166 FROM 123.115.163.*
 FROM 123.115.163.*
 
- 应该是取决于造的是原子弹还是茶叶蛋
 
 茶叶蛋随便崩,原子弹崩了就是大事故。
 比如有HA要求的业务,不能随便崩,即便是有watchdog、主备切换的。
 不过我也没造过原子弹,就是YY一下
 
 【 在 libgcc 的大作中提到: 】
 : 我想问下
 : 你们代码里真的会去去处理内存申请失败的逻辑么
 : 我觉得一般情况下应用程序申请不到内存,这机器也干不了什么了,程序挂不挂已经不重
 : ...................
 --
 修改:z16166 FROM 123.115.163.*
 FROM 123.115.163.*