Образы пакетов
Образы пакетов в Julia обеспечивают кэши объектов (машинного кода) для пакетов Julia. Они похожи на образ системы Julia и поддерживают многие его возможности. В частности, базовый формат сериализации аналогичен, и образ системы является базовым образом, на основе которого создаются образы пакетов.
Общий обзор
Образы пакетов — это общие библиотеки, содержащие как код, так и данные. Как и файлы кэша .ji, они создаются для отдельных пакетов. В разделе данных содержатся как глобальные данные (глобальные переменные пакета), так и необходимые метаданные о методах и типах, определенных в пакете. В разделе кода содержатся машинные объекты, кэширующие итоговые выходные данные компилятора Julia на базе LLVM.
С помощью параметра командной строки --pkgimages=no можно отключить кэширование объектов в текущем сеансе. Обратите внимание, что из-за этого файлы кэша, скорее всего, потребуется создать повторно. Сведения о максимальном количестве вариантов, кэшируемых Julia по умолчанию, см. в описании переменной среды JULIA_MAX_NUM_PRECOMPILE_FILES.
|
Хотя образы пакетов, на первый взгляд, представляют собой общие библиотеки машинного кода, на самом деле это лишь внешнее сходство. Вы не сможете выполнять их компоновку из собственной программы, и их необходимо загружать из Julia. |
Компоновка
Так как образы пакетов содержат машинный код, перед их использованием их необходимо пропустить через компоновщик. Для компоновки образа пакета с выводом подробной информации можно присвоить переменной среды JULIA_VERBOSE_LINKING значение true.
Кроме того, мы не можем исходить из предположения, что в рабочей системе пользователя установлен компоновщик. Поэтому, чтобы не требовалось устанавливать дополнительные компоненты, в состав Julia уже входит компоновщик LLVM под названием LLD. В base/linking.jl реализован ограниченный интерфейс, позволяющий компоновать образы пакетов на всех поддерживаемых платформах.
Некоторые тонкости
Хотя LLD — это мультиплатформенный компоновщик, у него нет унифицированного интерфейса для всех платформ. Кроме того, он предполагает использование из clang или другого драйвера компилятора, поэтому реализация некоторой логики из llvm-project/clang/lib/Driver/ToolChains переработана. К счастью, с помощью lld -flavor можно выбрать LLD для правильной платформы.
Windows
Чтобы не приходилось иметь дело с link.exe, мы используем -flavor gnu, что по сути превращает lld в кросскомпоновщик из среды mingw32. Библиотеки DLL Windows должны содержать функцию _DllMainCRTStartup, и чтобы свести к минимуму зависимость от библиотек mingw32, мы вводим определение-заглушку.
Образы пакетов, оптимизированные для нескольких микроархитектур
Как и в случае с образами системы, образы пакетов поддерживают множественное управление версиями. В неоднородной среде с унифицированным кэшем можно задать переменную среды JULIA_CPU_TARGET=generic для множественного управления версиями кэшей объектов.
Флаги, влияющие на создание и выбор образов пакетов
Ниже перечислены флаги командной строки Julia, влияющие на выбор кэша. Образы пакетов, созданные с разными флагами, отклоняются.
-
-g,--debug-info: требуется точное совпадение, так как это влияет на генерацию кода. -
--check-bounds: требуется точное совпадение, так как это влияет на генерацию кода. -
--inline: требуется точное совпадение, так как это влияет на генерацию кода. -
--pkgimages: разрешает выполнение при отключенном кэшировании объектов. -
-O,--optimize: образы пакетов, созданные для более низкого уровня оптимизации, отклоняются, но разрешается загрузка более высоких уровней оптимизации.