什么types是特殊的Scala编译器?
Scala对于如何将语言特性实现为库特性做了大量的工作。
是否有一个语言特别处理的types列表?
在规范中还是作为实现细节?
这将包括,例如,优化远离元组匹配。
关于模式匹配,理解,try-catch块和其他语言结构的特殊约定呢?
string对编译器来说是特殊的吗? 我看到string增强只是一个库隐式转换,而且这个string连接是由Predef支持的,但是它是以某种方式特殊的语言forms?
同样,我看到关于<:<和classOf和asInstanceOf ,而且不清楚什么是神奇的本质。 有没有办法通过编译器选项或通过查看字节码来区分差异?
我想了解一个特性是否被Scala.JS和Scala-native等实现统一支持,或者如果某个特性实际上可能被certificate是依赖于实现的,这取决于库的实现。
有一个令人难以置信的编译器“已知”的types,是不同程度的特殊。 你可以在scalac的Definitions.scala中find完整的列表。
我们可以根据它们所具有的特殊程度对它们进行分类。
免责声明:我可能已经忘记了更多。
特殊的types系统
以下types对Scala的types系统至关重要。 它们对如何执行types检查本身有影响。 所有这些types都在规范中提到(或者至less应该是)。
-
Any,AnyRef,AnyVal,Null,Nothing:位于Scalatypes系统顶部和底部的五种types。 -
scala.FunctionN,匿名函数(包括eta-expansion)的(规范)types。 即使在2.12版本中,对匿名函数进行SAM处理,FunctionN在某些情况下仍然是特殊的(特别是在重载分辨率方面)。 -
scala.PartialFunction(对types推断的工作有影响) -
Unit - 所有types的文字符号:
Int,Long,Float,Double,Char,Boolean,String,Symbol,java.lang.Class - 所有数字基本types和
Char,对于弱一致性(总起来说,这两个项目符号涵盖了所有原始types) -
Option和元组(用于模式匹配和自动修改) -
java.lang.Throwable -
scala.Dynamic -
scala.Singleton - 大部分
scala.reflect.*,特别是ClassTag,TypeTag等 -
scala.annotation.{,ClassFile,Static}Annotation - 几乎所有
scala.annotation.*中的注释(例如,unchecked) -
scala.language.* -
scala.math.ScalaNumber(出于难以理解的原因)
已知编译器作为一些语言function的解除
以下types对于types系统并不重要。 它们对types检查没有影响。 但是,斯卡拉语言确实具有许多构造,这些构造parsing了这些types的expression式。
这些types也将在说明书中提及。
-
scala.collection.Seq,Nil和WrappedArray,用于可变参数。 -
TupleNtypes -
Product和Serializable(用于案例分类) -
MatchError,由模式匹配结构生成 -
scala.xml.* -
scala.DelayedInit -
List(编译器对这些进行一些简单的优化,例如将List()重写为Nil)
已知的执行语言
这可能是你最关心的名单,因为你说你有兴趣知道在不同的后端会有什么不同。 以前的类别由编译器的早期(前端)阶段处理,因此由Scala / JVM,Scala.js和Scala Native共享。 这个类别通常被称为编译器后端,因此可能有不同的处理方式。 请注意,Scala.js和Scala Native都尝试在合理的程度上模仿Scala / JVM的语义。
这些types在语言规范本身中可能没有提及,至less不是全部。
这里是后端达成一致的地方(据我所知,Scala Native是这样的):
- 所有原始types:
Boolean,Char,Byte,Short,Int,Long,Float,Double,Unit。 -
scala.Array。 -
Cloneable(目前在Scala Native中不支持,请参阅#334 ) -
String和StringBuilder(主要用于string连接) -
Object,几乎所有的方法
这里是他们不同意的地方:
- 原始types的盒装版本(如
java.lang.Integer) -
Serializable -
java.rmi.Remote和java.rmi.RemoteException - 一些在
scala.annotation.*的注释(例如strictfp) -
java.lang.reflect.*一些东西,被Scala / JVM用来实现结构types
而且,虽然本身不是types ,但是一系列原始方法也是由后端专门处理的。
平台特定的types
除了上述types(在所有平台上均可用)之外,非JVM平台还可以添加其自己的特殊types以实现互操作性。
Scala.js特定的types
请参阅JSDefinitions.scala
-
js.Any:除了AnyVal和AnyRef以外,概念上Any的第三AnyValAnyRef。 他们有JavaScript语义而不是Scala语义。 - 所有原始types的
String和盒装版本(编译器大量重写 – 所谓的“劫持”) -
js.ThisFunctionN:他们的apply方法与其他JavaScripttypes的行为不同(第一个实际参数成为被调用函数的thisArgument) -
js.UndefOr和js.|(尽pipe它们没有扩展js.Any但它们仍然像JStypesjs.Any) -
js.Object(new js.Object()是特殊的,作为一个空的JS对象字面值{}) -
js.JavaScriptException(在throw和catchperformance得非常特别) -
js.WrappedArray(用于可变参数可变参数) -
js.ConstructorTag(类似于ClassTag) - 注释
js.native和js.native所有注释js.annotation.*
另外还有十几个原始的方法 。
Scala本机特定的types
见NirDefinitions.scala
- 无符号整数:
UByte,UShort,UInt和ULong -
Ptr,指针types -
FunctionPtrN,函数指针types -
native.*注释native.* -
scala.scalanative.runtime一些额外的基本方法