Package Images
Пакет Julia images предоставляет кэши объектов (нативный код) для пакетов Julia. Они похожи на system image Julia и поддерживают многие из тех же функций. На самом деле, базовый формат сериализации одинаков, и системное изображение является базовым изображением, на основе которого строятся изображения пакетов.
High-level overview
Пакетные изображения — это общие библиотеки, которые содержат как код, так и данные. Как и файлы кэша .ji
, они создаются для каждого пакета. Раздел данных содержит как глобальные данные (глобальные переменные в пакете), так и необходимую метаинформацию о том, какие методы и типы определены в пакете. Раздел кода содержит нативные объекты, которые кэшируют окончательный вывод компилятора на основе LLVM от Julia.
Командный параметр --pkgimages=no
можно использовать для отключения кэширования объектов для этой сессии. Обратите внимание, что это означает, что файлы кэша, вероятно, придется регенерировать. См. JULIA_MAX_NUM_PRECOMPILE_FILES
для верхнего предела вариантов, которые Julia кэширует по умолчанию.
Хотя пакеты изображений представляют собой нативные общие библиотеки, они являются лишь их приближением. Вы не сможете связать их с нативной программой, и их необходимо загружать из Julia.
Linking
Поскольку образы пакетов содержат нативный код, мы должны запустить компоновщик над ними, прежде чем сможем их использовать. Вы можете установить переменную окружения JULIA_VERBOSE_LINKING
в значение true
, чтобы сделать процесс компоновки образов пакетов подробным.
Кроме того, мы не можем предполагать, что у пользователя установлен рабочий системный компоновщик. Поэтому Julia поставляется с LLD, компоновщиком LLVM, чтобы обеспечить работоспособный опыт "из коробки". В base/linking.jl
мы реализуем ограниченный интерфейс, чтобы иметь возможность связывать образы пакетов на всех поддерживаемых платформах.
Quirks
Несмотря на то, что LLD является многоплатформенным компоновщиком, он не предоставляет единообразного интерфейса на разных платформах. Более того, он предназначен для использования из clang
или другого драйвера компилятора, поэтому мы повторно реализуем часть логики из llvm-project/clang/lib/Driver/ToolChains
. К счастью, можно использовать lld -flavor
, чтобы установить lld на правильную платформу.
Windows
Чтобы избежать необходимости работать с link.exe
, мы используем -flavor gnu
, фактически превращая lld
в кросс-ссылочник из среды mingw32. Windows DLL должны содержать функцию _DllMainCRTStartup
, и чтобы минимизировать нашу зависимость от библиотек mingw32, мы сами внедряем определение заглушки.
MacOS
Динамические библиотеки на macOS должны связываться с -lSystem
. В последних версиях macOS -lSystem
доступен для связывания только при наличии Xcode. В этой связи мы связываемся с -undefined dynamic_lookup
.
Package images optimized for multiple microarchitectures
Аналогично multi-versioning для системных изображений, образы пакетов поддерживают многоверсионность. Если вы находитесь в гетерогенной среде с унифицированным кэшем, вы можете установить переменную окружения JULIA_CPU_TARGET=generic
, чтобы многоверсионно кэшировать объекты.
Flags that impact package image creation and selection
Это флаги командной строки Julia, которые влияют на выбор кэша. Пакетные образы, созданные с использованием различных флагов, будут отклонены.
-g
,--debug-info
: Требуется точное совпадение, так как это изменяет генерацию кода.--check-bounds
: Требуется точное совпадение, так как это изменяет генерацию кода.--inline
: Требуется точное совпадение, так как это изменяет генерацию кода.--pkgimages
: Позволяет запускать без включенного кэширования объектов.-O
,--optimize
: Отклонить образы пакетов, сгенерированные для более низкого уровня оптимизации, но разрешить загрузку для более высоких уровней оптимизации.