什么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
,用于可变参数。 -
TupleN
types -
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
的第三AnyVal
AnyRef
。 他们有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
和catch
performance得非常特别) -
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
一些额外的基本方法