Каковы отношения и различия между реализацией и семантикой передачи типов? - PullRequest
0 голосов
/ 30 сентября 2019

https://en.wikipedia.org/wiki/Type_erasure говорит

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

  • Являются ли итификация, и семантика передачи типов противоположными стиранию типов?
  • Каковы отношения и различия между реализацией и семантикой передачи типов? Они имеют в виду одно и то же?

Лучшее, что я могу найти о них, это две следующие книги. Но я все еще не совсем уверен в своем вопросе.

О стирании типов и прохождении типов, Типы и языки программирования Пирса говорит:

23.7 Порядок стирания и оценки

Операционная семантика, данная Системе F на рисунке 23-1, является семантикой передачи типа : когда полиморфная функция встречает аргумент типа, типна самом деле подставляется в тело функции. Реализация ML системы F в главе 25 делает именно это. В более реалистичном интерпретаторе или компиляторе для языка программирования, основанного на System F, такое манипулирование типами во время выполнения может привести к значительным затратам. Более того, легко увидеть, что аннотации типов не играют никакой существенной роли во время выполнения, в том смысле, что не принимаются решения во время выполнения на основе типов: мы можем взять хорошо типизированную программу, переписать ее аннотации типов впроизвольным образом, и получите программу, которая ведет себя точно так же.

По этим причинам многие полиморфные языки вместо этого принимают семантику стирания типа , где после фазы проверки типов все типыудаляются, а полученные нетипизированные термины интерпретируются или компилируются в машинный код.

Об удалении типа по сравнению с реализацией, Прагматика языка программирования Скоттом говорит:

C # 2.0 смог использовать реализацию, основанную на подтверждении , а не стирании . Реабилитация создает новый конкретный тип каждый раз, когда генерик генерируется с различными аргументами. Повторные типы видны в библиотеке отражений (csNames.GetType().ToString() возвращает «Арбитр 1 [System.Double]»), и вполне допустимо вызвать new T(), если T является параметром типа с конструктором с нулевым аргументом (aограничение на этот эффект не требуется). Более того, когда компилятор Java должен генерировать неявные приведения типов, чтобы удовлетворить требования виртуальной машины (которая ничего не знает об универсальных типах) и обеспечить безопасное взаимодействие с типом с унаследованным кодом (который может передавать параметр или возвращать результат неподходящего типа)компилятор C # может быть уверен, что такие проверки никогда не понадобятся, и поэтому может их не включать. Результат - более быстрый код.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...