Документация Engee

Образы пакетов

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

MacOS

Компоновка динамических библиотек в macOS должна выполняться с -lSystem. В последних версиях macOS компоновка с -lSystem возможна только в том случае, если доступна среда Xcode. По этой причине мы выполняем компоновку с -undefined dynamic_lookup.

Образы пакетов, оптимизированные для нескольких микроархитектур

Как и в случае с образами системы, образы пакетов поддерживают множественное управление версиями. В неоднородной среде с унифицированным кэшем можно задать переменную среды JULIA_CPU_TARGET=generic для множественного управления версиями кэшей объектов.

Флаги, влияющие на создание и выбор образов пакетов

Ниже перечислены флаги командной строки Julia, влияющие на выбор кэша. Образы пакетов, созданные с разными флагами, отклоняются.

  • -g, --debug-info: требуется точное совпадение, так как это влияет на генерирование кода.

  • --check-bounds: требуется точное совпадение, так как это влияет на генерирование кода.

  • --inline: требуется точное совпадение, так как это влияет на генерирование кода.

  • --pkgimages: разрешает выполнение при отключенном кэшировании объектов.

  • -O, --optimize: образы пакетов, созданные для более низкого уровня оптимизации, отклоняются, но разрешается загрузка более высоких уровней оптимизации.