Dart怎么样;声音零安全“;与Kotlin零安全不同?

Dart怎么样;声音零安全“;与Kotlin零安全不同?,kotlin,dart,language-design,kotlin-null-safety,dart-null-safety,Kotlin,Dart,Language Design,Kotlin Null Safety,Dart Null Safety,声明Dart的所谓“声音零安全性”优于Kotlin的零安全性设计,因为它可以根据变量是否可声明为零来优化代码,其他语言(我假设这是指包括Kotlin在内的语言)必须进行运行时检查以确保零安全性 那么,Dart做了哪些额外的优化呢 在确保空安全的同时,它如何与不支持空安全的遗留代码库进行互操作 那么,Dart做了什么额外的优化呢 最基本的优化类型是,当对数值类型执行计算时,编译器可以(在内部)将它们视为非引用类型(未绑定值)的基本类型 为什么呢 因为它们不能为null,因此,不必将它们用作引用类型

声明Dart的所谓“声音零安全性”优于Kotlin的零安全性设计,因为它可以根据变量是否可声明为零来优化代码,其他语言(我假设这是指包括Kotlin在内的语言)必须进行运行时检查以确保零安全性

那么,Dart做了哪些额外的优化呢

在确保空安全的同时,它如何与不支持空安全的遗留代码库进行互操作

那么,Dart做了什么额外的优化呢

最基本的优化类型是,当对数值类型执行计算时,编译器可以(在内部)将它们视为非引用类型(未绑定值)的基本类型

为什么呢

因为它们不能为null,因此,不必将它们用作引用类型(装箱值)的数据

为什么呢

因为null在Dart中表示为null常量引用。
如果不需要引用这个常量,那么为什么不使用值类型而不是引用类型呢?至少在生成的代码中,可以在编译时对其进行优化

所有这些都要归功于所谓的“强模式”。
强模式与不可为null的类型相结合,允许您在编译阶段优化已经存在的代码,这对于AOT等模式非常重要,因为AOT处于RE(读取和执行)模式,因此不允许在运行时优化代码

在确保空安全的同时,它如何与不支持空安全的遗留代码库进行互操作


在我看来,你应该单独问这个问题。

我可以替科特林回答。它几乎100%支持Java库。Kotlin不能断言此类库的可空性,因为java字节码不区分可空类型和不可空类型。所以Kotlin创建了一个平台类型。平台的可空性这些类型只能在运行时进行检查。我建议阅读有关空安全功能的更详细描述:@MangatRaiModi,但是,它仅适用于来自Java或其他JVM语言的代码(并且不针对可空性进行注释);在Kotlin代码中,编译器不需要任何运行时检查。@gidds但无论如何都需要,即使在纯Kotlin应用程序中也是如此。@Tenfour04仅适用于可直接从非Kotlin代码传递的值;编译器不会在不需要检查的地方添加检查。例如,反编译此类:
类测试(val s:String){fun printLength(){println(s.length)}
在构造函数中显示空检查,但在函数中没有。kotlin编译器实际上执行相同的优化。所以声音无效性只是一种营销手段。@deviant不,这不仅仅是一种营销手段,声音无效性和不健全的无效安全性之间有着根本的区别。Kotlins的设计选择意味着它没有,Dart有。请不要做出错误的评论。如果我没有弄错,如果变量不可为null,或者被推断为不可为null,Kotlin(JVM)也不会将原语值作为对象装箱。在所谓的智能转换的帮助下,根据编译时的代码上下文确定变量是否可为null。@YihaoGao Java VM默认不支持非null。这意味着Kotlin中的所有内容都只是语法糖。也就是说,它们似乎在那里,但不是在执行时间级别。