Два бита.
Во-первых, "неужели все так не работает?"Да.«Отдельная компиляция» часто рассматривается как логическое значение, но на самом деле это континуум.Обычно «отдельная компиляция» для статически типизированного языка означает, что мне нужно знать только тип интерфейса / сигнатуры класса / метода, чтобы затем иметь возможность компилировать эту сущность в другом модуле / сборке и либо успешно выполнить и сгенерировать хороший код, либоеще генерировать полезную диагностику о том, что ошибка.Ключевая идея заключается в том, что «подпись типа» является «краткой сводкой основных ограничений».
Вы можете сдвинуть ее в масштабе на другой конец спектра и выполнить типизацию по типу утки.что делают шаблоны F # inline или C ++, где в основном «если вы подключите эти типы данных в тело кода этого метода, будет ли он компилироваться?»Это выполнимо, но обычно его компилируют медленнее и предлагают более плохую диагностику при сбое.Эти последствия объясняются отсутствием «краткой сводки», которая является типичным артефактом «отдельного» в «отдельной компиляции».
(из совершенно другой оси оценки полезности / юзабилити, inline / C ++Модель шаблонов «чрезвычайно гибкая» и «чрезвычайно сложная», тогда как типичные элементы системы типов «менее гибкие, но часто достаточные для выражения большинства абстракций» и «очень простые».)
В любом случае, всевозможно, но если вы делаете вещи «более гибко», чем несколько стандартных хорошо понятных механизмов для типов / обобщений / классов типов, вы склонны падать с обрыва, когда дело доходит до скорости компиляции и качества диагностики ошибок.Таким образом, в F # механизм срабатывает только тогда, когда вы специально запрашиваете его через inline
.
Во-вторых, как F # удается "встроить в сборки", когда метаданные .NET не могут выразить эти ограничения?Проще говоря, сборка F # с любым материалом inline
содержит дополнительные специфичные для F # метаданные (в дополнение к обычным метаданным .NET), которые в основном представляют "тело кода F #", поэтому они могут быть встроены в сайт вызова ссылочной сборки.Специфичные для F # метаданные встраиваются как «ресурс» в сборку .NET.В F # PowerPack есть модуль чтения метаданных, который позволяет вам «размышлять» над некоторыми из этих дополнительных метаданных F #.(В случае FSharp.Core эти дополнительные метаданные разбиты на файлы FSharp.Core.sigdata и FSharp.Core.optdata, а не внедряются в сборку времени выполнения FSharp.Core.dll. Это уменьшает время выполнения F #,так как вам нужны только sigdata / optdata во время разработки.)