Какие типы являются специальными для компилятора Scala? - программирование
Подтвердить что ты не робот

Какие типы являются специальными для компилятора Scala?

Scala дает большое представление о том, как, как представляется, языковые функции реализованы как функции библиотеки.

Есть ли список типов, которые обрабатываются специально языком?

Как в спецификации, так и в качестве детали реализации?

Это будет включать, например, оптимизацию совпадений на кортежах.

Как насчет специальных соглашений, связанных с сопоставлением шаблонов, для понятий, блоков try-catch и других языковых конструкций?

Является ли String каким-то особенным для компилятора? Я вижу, что расширение String - это просто неявное преобразование в библиотеке, и что конкатенация String поддерживается Predef, но что-то особенное с помощью языка?

Точно так же я вижу вопросы о <:< и classOf и asInstanceOf, и это не ясно, что является магическим внутренним. Есть ли способ сказать разницу либо с параметром компилятора, либо с помощью байтового кода?

Я хотел бы понять, поддерживается ли функция единообразно с помощью реализаций, таких как Scala.JS и Scala -native, или если функция может фактически оказаться зависимой от реализации, в зависимости от реализации библиотеки.

4b9b3361

Ответ 1

Существует невероятное количество типов, которые "известны" компилятору, и имеют особую разницу в разной степени. Полный список можно найти в файле Definitions.scala.

Мы можем, вероятно, классифицировать их в зависимости от степени их особой важности.

Отказ от ответственности: я, вероятно, забыл еще несколько.

Специально для системы типов

В системе типа Scala важны следующие типы. Они влияют на то, как выполняется проверка типа. Все эти типы упоминаются в спецификации (или, по крайней мере, они обязательно должны быть).

  • Any, AnyRef, AnyVal, Null, Nothing: пять типов, которые располагаются в верхней и нижней части системы типа Scala.
  • scala.FunctionN, (канонический) тип, заданный анонимными функциями (включая eta-расширение). Даже в версии 2.12, которая имеет обработку анонимных функций SAM, в некоторых случаях (особенно при перегрузке разрешения) сохраняется специальная функция FunctionN.
  • scala.PartialFunction (влияет на работу типа)
  • Unit
  • Все типы с буквальной нотацией: Int, Long, Float, Double, Char, Boolean, String, Symbol, java.lang.Class
  • Все числовые примитивные типы и Char s, для слабой совместимости (вместе эти две пули охватывают все примитивные типы)
  • 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 имеется ряд конструктов, которые desugar в выражениях этих типов.

Эти типы также будут упомянуты в спецификации.

  • scala.collection.Seq, Nil и WrappedArray, которые используются для параметров varargs.
  • TupleN типы
  • Product и Serializable (для классов case)
  • MatchError, сгенерированный конструкциями соответствия шаблонов
  • scala.xml.*
  • scala.DelayedInit
  • List (компилятор выполняет некоторые тривиальные оптимизации для таких, как переписывание List() как Nil)

Известный для реализации языка

Это, вероятно, список, о котором вы больше всего заботитесь, учитывая, что вы сказали, что вам интересно узнать, что может пойти по-другому на разных концах. Предыдущие категории обрабатываются ранними (front-end) фазами компилятора и поэтому разделяются между Scala/JVM, Scala.js и Scala Native. Эта категория, как правило, известна как составная часть компилятора, и, следовательно, потенциально имеет разные методы лечения. Обратите внимание, что как Scala.js, так и Scala Native попытаются подражать семантике Scala/JVM в разумной степени.

Эти типы могут не упоминаться в спецификации языка как таковой, по крайней мере, не для всех.

Вот те, в которых согласны концы (re Scala Родные, насколько мне известно):

  • Все примитивные типы: Boolean, Char, Byte, Short, Int, Long, Float, Double, Unit.
  • scala.Array.
  • Cloneable (в настоящее время не поддерживается в Scala Native, см. # 334)
  • String и StringBuilder (в основном для конкатенации строк)
  • Object, для практически всех его методов

И вот те, где они не согласны:

  • Вставные версии примитивных типов (например, java.lang.Integer)
  • Serializable
  • java.rmi.Remote и java.rmi.RemoteException
  • Некоторые аннотации в scala.annotation.* (например, strictfp)
  • Некоторые вещи в java.lang.reflect.*, используемые Scala/JVM для реализации структурных типов

Кроме того, хотя сами типы не являются типами, но длинный список примитивных методов также обрабатываются в обратном порядке.

Типы, специфичные для платформы

В дополнение к перечисленным выше типам, которые доступны на всех платформах, платформы, не поддерживающие JVM, добавляют свои собственные специальные типы для обеспечения совместимости.

Scala.js-специфичные типы

См. JSDefinitions.scala

  • js.Any: концептуально третий подтип Any, кроме AnyVal и AnyRef. У них есть семантика JavaScript вместо семантики Scala.
  • String и в коробчатых версиях всех примитивных типов (сильно переписанных - так называемых "захваченных" - компилятором)
  • js.ThisFunctionN: их методы apply ведут себя иначе, чем методы других типов JavaScript (первый фактический аргумент становится thisArgument вызываемой функции)
  • js.UndefOr и js.| (они ведут себя как типы JS, даже если они не расширяют js.Any)
  • js.Object (new js.Object() имеет специальную форму как пустой литерал объекта JS {})
  • js.JavaScriptException (ведет себя очень специально в throw и catch)
  • js.WrappedArray (используется десурагированием varargs)
  • js.ConstructorTag (аналогично ClassTag)
  • Аннотация js.native и все аннотации в js.annotation.*

Кроме того, еще дюжина примитивных методов.

Scala Родные типы

См. NirDefinitions.scala

  • Целые числа без знака: UByte, UShort, UInt и ULong
  • Ptr, тип указателя
  • FunctionPtrN, типы указателей функций
  • Аннотации в native.*
  • Несколько дополнительных примитивных методов в scala.scalanative.runtime