Образы пакетов
Образы пакетов в 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
: образы пакетов, созданные для более низкого уровня оптимизации, отклоняются, но разрешается загрузка более высоких уровней оптимизации.