什么types是特殊的Scala编译器?

Scala对于如何将语言特性实现为库特性做了大量的工作。

是否有一个语言特别处理的types列表?

在规范中还是作为实现细节?

这将包括,例如,优化远离元组匹配。

关于模式匹配,理解,try-catch块和其他语言结构的特殊约定呢?

string对编译器来说是特殊的吗? 我看到string增强只是一个库隐式转换,而且这个string连接是由Predef支持的,但是它是以某种方式特殊的语言forms?

同样,我看到关于<:<classOfasInstanceOf ,而且不清楚什么是神奇的本质。 有没有办法通过编译器选项或通过查看字节码来区分差异?

我想了解一个特性是否被Scala.JS和Scala-native等实现统一支持,或者如果某个特性实际上可能被certificate是依赖于实现的,这取决于库的实现。

有一个令人难以置信的编译器“已知”的types,是不同程度的特殊。 你可以在scalac的Definitions.scala中find完整的列表。

我们可以根据它们所具有的特殊程度对它们进行分类。

免责声明:我可能已经忘记了更多。

特殊的types系统

以下types对Scala的types系统至关重要。 它们对如何执行types检查本身有影响。 所有这些types都在规范中提到(或者至less应该是)。

  • AnyAnyRefAnyValNullNothing :位于Scalatypes系统顶部和底部的五种types。
  • scala.FunctionN ,匿名函数(包括eta-expansion)的(规范)types。 即使在2.12版本中,对匿名函数进行SAM处理, FunctionN在某些情况下仍然是特殊的(特别是在重载分辨率方面)。
  • scala.PartialFunction (对types推断的工作有影响)
  • Unit
  • 所有types的文字符号: IntLongFloatDoubleCharBooleanStringSymboljava.lang.Class
  • 所有数字基本types和Char ,对于弱一致性(总起来说,这两个项目符号涵盖了所有原始types)
  • Option和元组(用于模式匹配和自动修改)
  • java.lang.Throwable
  • scala.Dynamic
  • scala.Singleton
  • 大部分scala.reflect.* ,特别是ClassTagTypeTag
  • scala.annotation.{,ClassFile,Static}Annotation
  • 几乎所有scala.annotation.*中的注释(例如, unchecked
  • scala.language.*
  • scala.math.ScalaNumber (出于难以理解的原因)

已知编译器作为一些语言function的解除

以下types对于types系统并不重要。 它们对types检查没有影响。 但是,斯卡拉语言确实具有许多构造,这些构造parsing了这些types的expression式。

这些types也将在说明书中提及。

  • scala.collection.SeqNilWrappedArray ,用于可变参数。
  • TupleNtypes
  • ProductSerializable (用于案例分类)
  • 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: BooleanCharByteShortIntLongFloatDoubleUnit
  • scala.Array
  • Cloneable (目前在Scala Native中不支持,请参阅#334 )
  • StringStringBuilder (主要用于string连接)
  • Object ,几乎所有的方法

这里是他们不同意的地方:

  • 原始types的盒装版本(如java.lang.Integer
  • Serializable
  • java.rmi.Remotejava.rmi.RemoteException
  • 一些在scala.annotation.*的注释(例如strictfp
  • java.lang.reflect.*一些东西,被Scala / JVM用来实现结构types

而且,虽然本身不​​是types ,但是一系列原始方法也是由后端专门处理的。

平台特定的types

除了上述types(在所有平台上均可用)之外,非JVM平台还可以添加其自己的特殊types以实现互操作性。

Scala.js特定的types

请参阅JSDefinitions.scala

  • js.Any :除了AnyValAnyRef以外,概念上Any的第三AnyVal AnyRef 。 他们有JavaScript语义而不是Scala语义。
  • 所有原始types的String和盒装版本(编译器大量重写 – 所谓的“劫持”)
  • js.ThisFunctionN :他们的apply方法与其他JavaScripttypes的行为不同(第一个实际参数成为被调用函数的thisArgument
  • js.UndefOrjs.| (尽pipe它们没有扩展js.Any但它们仍然像JStypesjs.Any
  • js.Objectnew js.Object()是特殊的,作为一个空的JS对象字面值{}
  • js.JavaScriptException (在throwcatchperformance得非常特别)
  • js.WrappedArray (用于可变参数可变参数)
  • js.ConstructorTag (类似于ClassTag
  • 注释js.nativejs.native所有注释js.annotation.*

另外还有十几个原始的方法 。

Scala本机特定的types

见NirDefinitions.scala

  • 无符号整数: UByteUShortUIntULong
  • Ptr ,指针types
  • FunctionPtrN ,函数指针types
  • native.*注释native.*
  • scala.scalanative.runtime一些额外的基本方法