Обозначенные дженерики в Scala в .NET/CLR

Scala (по крайней мере, на JVM) использует тип стирания для совместимости с Java. Эта функция широко до сосать. Фиксация этого будет затруднительной для JVM.

В отличие от ситуации с JVM,.NET поддерживает редифицированные генерики. Scala.NET-реализация использовать их? Если нет, возможно, или какие проблемы будут связаны с использованием reification?

Ответ 1

Он работает в процессе, тщательно не разбивая семантику Scala между JVM и .NET.

Я задал этот вопрос еще в 2011 году в списке рассылки scala -tools, и ответ дал Мигель Гарсия, в котором он излагает общую картину:

Некоторые цитаты:

(1) В настоящее время выполняется предварительный просмотр Scala.Net. Как вы заметили, фаза стирания также проходит как часть трубопровода. Это "функция" версии предварительного просмотра, "функция", которая должна была быть включена потому что поддержки для CLR Generics еще не было (подробнее об этом ниже). Однако есть одно большое преимущество для запуска JVM-стиля стирание в Scala.Net: все программы Scala, которые полагаются на библиотека Scala уже может быть скомпилирована на .Net вместо ожидания для создания CLR Generics. Те программы, которые полагаются на Java JDK также могут быть скомпилированы с учетом поддержки IKVM API-интерфейсов JDK в Вопрос 1].

(2) Поддержка общих свойств CLR в Scala.Net. Основная мотивация поддерживает его взаимодействие с существующими сборками. В получив эту интероперабельность, позаботьтесь о том, чтобы не отделиться из семантики Scala. Другими словами, любая действительная программа Scalaдля запуска и получения тех же результатов на JVM и .NET. Что приносит нам к незавершенной работе [2]. Первоначальный прототип обрабатывает только С# подмножество Scala. Так что теперь я обращаюсь к остальным. Это больше, чем первоначально ожидалось, но важно охватить весь язык.

Несколько комментариев относительно взаимодействия с сборками .NET, в в частности, родные проблемы. Да, сборки CLR могут выражать использование "native int" (разные размеры для разных процессоров), P/Invoke of C-функции, экспортируемые DLL и т.д. Scala.Net не стремится делать что низкоуровневый обман. Интересующая способность сборки на уровне "Common Language Specification", т.е. какой обычно получается из любого компилятора С#, VB.NET и т.д. ( "обычно", т.е. за исключением использования атрибутов "[DllImport]" и связанных с ним С++ -изомов).

Цитата из спецификации CLI:

--- начало цитаты --- Общая спецификация языка (CLS) - CLS - это соглашение между разработчиками языка и каркасом (то есть, класс библиотеки). Он определяет подмножество CTS (Common Type System) и набор правил использования. Языки предоставляют своим пользователям наибольшую возможность доступа посредством реализации по крайней мере тех частей CTS, которые частью CLS. Аналогичным образом, рамки будут наиболее широко использоваться, если их публично экспортируемые аспекты (например, классы, интерфейсы, методы, и поля) используют только типы, которые являются частью CLS и которые придерживаются конвенции CLS. --- конец цитаты ---

посмотреть весь поток:

https://groups.google.com/forum/?fromgroups#!topic/scala-tools/JDjstK1_uvM

Ответ 2

Из ответа этого вопроса вы можете считать, что не может быть преимуществом сохранить сохранившиеся дженерики в виртуальной машине, потому что это все равно диктует, что могут быть представлены и каковы отношения между типами. (Для получения дополнительной информации перейдите в оригинальный блог от Ola Bini).

Другие примеры:

Erasure кажется полезным не только для обратной совместимости, но и потому, что полная информация о времени выполнения, поддерживаемая динамически типизированными языками, стоит дорого. Конструкция .NET CLR Generics устраняет эту стоимость по специализации кода. Вышеупомянутые случаи должны были быть понятны, когда они стираются, и когда это язык, который должен быть обвинен в конкретном недостатке.

Нетто-сеть заключается в том, что если JVM обновил дженерики (без стирания типа), было бы невозможно реализовать систему типов Scala... Scala система более сложна, чем Java, и если JVM были генерики на основе Java-дженериков, у нас все еще были проблемы в Scala. С другой стороны, стирание типа позволяет компилятору реализовать сложную систему типов, даже если вся информация о типе недоступна во время выполнения.


Насколько я знаю, Scala бэкэнд .NET намного отстает от текущей реализации JVM, а также не поддерживает генерируемые обобщенные .NET файлы.


Scala 2.10 даже идет дальше в направлении абстрагирования информации типа от фактической модели виртуальной машины. Мартин Одерски представил новое отражение/овеществление взаимодействия в презентации, которая, например, встроенная в эту запись (начиная с 42'18").

Я считаю, что тогда вы сможете использовать теги типа (которые заменяют манифесты), чтобы преодолеть проблемы с совпадением шаблонов и стиранием. Есть немного на этот поток списка рассылки, но я не знаю, в какой степени он работает или нет.

(Чистая спекуляция:) Идет более абстракция может помочь с бэкэдами для платформ, которые имеют еще меньшую информацию типа, чем JVM, например. гипотетическая компиляция JavaScript.