什么类型的Scala编译器特别?

som*_*ytt 50 scala

Scala对如何将语言功能实现为库功能做了大量工作.

是否有语言专门处理的类型列表?

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

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

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

字符串在某种程度上是特殊的编译器吗?我看到字符串增强只是一个库隐式转换,并且支持字符串连接Predef,但是这种语言特别容易吗?

同样,我看到有关<:<classOf和的问题asInstanceOf,并且不清楚什么是神奇的内在.有没有办法通过编译器选项或查看字节代码来区分?

我想了解一下,如果某个功能是由Scala.JS和Scala-native等实现统一支持的,或者某个功能实际上可能证明是依赖于实现的,这取决于库的实现.

sjr*_*jrd 74

有许多类型是编译器"已知"的类型,并且在不同程度上是特殊的.您可以在scalac的Definitions.scala中找到完整的列表.

我们可以根据他们所承受的特殊程度对他们进行分类.

免责声明:我可能已经忘记了一些.

特殊的类型系统

以下类型对Scala的类型系统至关重要.它们会影响类型检查本身的执行方式.所有这些类型都在规范中提到(或者至少,它们肯定应该是).

  • Any,AnyRef,AnyVal,Null,Nothing:五种类型的坐在Scala的类型系统的顶部和底部.
  • scala.FunctionN,匿名函数(包括eta-expansion)给出的(规范)类型.即使在具有SAM处理匿名函数的2.12中,FunctionN在某些情况下仍然是特殊的(特别是在重载分辨率方面).
  • scala.PartialFunction (对类型推断的工作方式有影响)
  • Unit
  • 所有类型的文字符号:Int,Long,Float,Double,Char,Boolean,String,Symbol,java.lang.Class
  • 所有数字基元类型和Chars,弱一致性(这两个子弹一起覆盖所有基本类型)
  • 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 (出于不明原因)

编译器称为某些语言功能的贬低

以下类型对类型系统并不重要.它们对类型检查没有影响.但是,Scala语言确实具有许多构造,这些构造都是这些类型的表达式.

这些类型也将在说明书中提及.

  • scala.collection.Seq,NilWrappedArray,用于varargs参数.
  • TupleN 类型
  • ProductSerializable(对于案例类)
  • MatchError,由模式匹配结构生成
  • scala.xml.*
  • scala.DelayedInit
  • List(编译器会对这些执行一些简单的优化,例如重写List()Nil)

已知该语言的实现

这可能是你最关心的列表,因为你说你有兴趣知道在不同的后端有什么不同.以前的类别由编译器的早期(前端)阶段处理,因此由Scala/JVM,Scala.js和Scala Native共享.此类别通常以编译器后端而闻名,因此可能具有不同的处理方式.请注意,Scala.js和Scala Native都尝试在合理的程度上模仿Scala/JVM的语义.

语言规范本身可能没有提到这些类型,至少不是所有类型.

以下是后端同意的内容(据我所知,Scala Native):

  • 所有基本类型:Boolean,Char,Byte,Short,Int,Long,Float,Double,Unit.
  • scala.Array.
  • Cloneable(目前Scala Native不支持,请参阅#334)
  • StringStringBuilder(主要用于字符串连接)
  • Object,几乎所有的方法

以下是他们不同意的地方:

  • 原始类型的盒装版本(例如java.lang.Integer)
  • Serializable
  • java.rmi.Remotejava.rmi.RemoteException
  • scala.annotation.*(例如strictfp)中的一些注释
  • 一些内容java.lang.reflect.*,由Scala/JVM用于实现结构类型

此外,虽然本身不是类型,但是一长串原始方法也由后端专门处理.

特定于平台的类型

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

Scala.js特定类型

请参阅JSDefinitions.scala

  • js.Any:概念上是第三个子类型Any,除了AnyValAnyRef.它们具有JavaScript语义而不是Scala语义.
  • String 和所有原始类型的盒装版本(重写 - 所谓的"被劫持" - 由编译器)
  • js.ThisFunctionN:他们的apply方法与其他JavaScript类型的行为不同(第一个实际参数成为thisArgument被调用函数的方法)
  • js.UndefOrjs.|(它们表现为JS类型,即使它们没有扩展js.Any)
  • js.Object(new js.Object()特别为空JS对象文字{})
  • js.JavaScriptException(中表现非常特殊throwcatch)
  • js.WrappedArray (用于贬低varargs)
  • js.ConstructorTag(相似ClassTag)
  • 注释js.native和所有注释js.annotation.*

另外,还有十几种原始方法.

Scala Native特定类型

请参阅NirDefinitions.scala

  • 无符号整数:UByte,UShort,UIntULong
  • Ptr,指针类型
  • FunctionPtrN,函数指针类型
  • 中的注释 native.*
  • 一些额外的原始方法 scala.scalanative.runtime

  • 感谢您的慷慨回答。稍后,我可能会附加有关 Predef 特权的部分。 (2认同)
  • `Option`和`TupleN`对模式匹配不再特殊.模式匹配现在是结构化的,接受任何`{def isEmpty:Boolean; def get:T}`,其中`T`,如果它有名为`_1`的成员等,则被视为元组,否则被视为一个值. (2认同)