Новая версия набора компиляторов LLVM 3.3
18 июня 2013 года
После 7 месяцев разработки представлен релиз проекта LLVM 3.3 (Low Level Virtual Machine) - GCC совместимого инструментария (компиляторы, оптимизаторы и генераторы кода), компилирующего программы в промежуточный биткод RISC подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизации). Сгенерированный платформонезависимый псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы.
Новая версия примечательна интеграцией поддержки целевых платформ AArch64 и AMD R600 GPU, поддержкой систем IBM S390 на базе архитектуры z, значительным улучшением поддержки платформ PowerPC и MIPS. За счёт увеличение качества реализации автоматической векторизации циклов и реализации серии общих оптимизаций заметно увеличена производительность кода, генерируемого LLVM 3.3. В Clang доведена до готовности поддержка стандарта C++11, расширены возможности статического анализатора кода, добавлен инструментарий для автоматического преобразования кода C++ в вид, соответствующий спецификации C++11, подготовлено приложение для автоформатирования кода в vim и emacs.
Основные новшества LLVM 3.3:
- Поддержка 64-разрядной архитектуры AArch64 (ARM64) в качестве целевой платформы. Архитектура AArch64 включает в себя новый набор команд A64, примечательный расширением числа регистров, новыми командами для вычислений с плавающей запятой (FP) и новыми векторными SIMD-инструкциями NEON. В настоящее время работа по реализации порта AArch64 ещё полностью не завершена, но уже поддерживается сборка приложений, написанных в соответствии со стандартами C99 и C++03, для платформы Linux.
- Интеграция бэкэнда для использования в качестве целевой платформы GPU семейства R600 (HD2XXX - HD7XXX). Изначально бэкенд развивался в репозитории проекта Mesa, но был перенесён в кодовую базу LLVM. Бэкэнд необходим для компилятора шейдеров LLVM, который в свою очередь требуется для открытой реализации стандарта OpenCL;
- Улучшено качество кода, генерируемого при использовании автоматической векторизации циклов (Loop Vectorizer), которая теперь включена по умолчанию при выборе режима оптимизации "-O3". В новой версии добавлена поддержка векторизации вызова функций, векторизации смешанных типов, частичного развёртывания кода в процессе векторизации, проверки указателей во время выполнения и т.д. Распараллеливание циклов позволяет заметно поднять производительность кода, генерируемого LLVM 3.3. В итоге независимые тесты производительности фиксируют более высокую производительность кода, собранного c использованием LLVM 3.3, по сравнению с LLVM 3.2;
- Представлен новый SLP векторизатор, который пока не используется по умолчанию и требует для своего включения указания опции "-fslp-vectorize". Поддержка ранее доступного векторизатора BB сохранена и может быть активирована при указании опции "-fslp-vectorize-aggressive";
- Значительно улучшена реализация бэкенда для процессоров PowerPC, в том числе поддержка наборов инструкций PowerPC 2.04/2.05/2.06 и обеспечение поддержки интегрированного ассемблера;
- Улучшен бэкенд для архитектуры MIPS, добавлена поддержка инструментария Sourcery CodeBench, добавлены новые опции командной строки (-mxgot/-mno-xgot, -EL/-EB, -mmicromips/-mno-micromips, -msingle-float/-mdouble-float, -mabi=32 (o32 abi) и -mabi=64 (n64 abi)), улучшено качество генерации кода DSP-ASE;
- Добавлен бэкенд SystemZ/s390x с поддержкой IBM z/Architecture;
- Из состава удалён порт CellSPU и прекращена поддержка API для расширенной линковки на уровне промежуточного представления кода. В бэкенде для целевой платформы Hexagonv прекращена поддержка устаревших архитектур hexagonv2 и hexagonv3 (поддержка hexagonv4 и hexagonv5 сохранена).
Основные новшества субпроектов LLVM 3.3:
- В компиляторе Clang полностью завершена реализация поддержки всех компонентов стандарта C++11, в том числе новых библиотек, таких как std::regex. В анонсе отмечается, что Clang является первым компилятором, поддерживающим в полной мере стандарт C++'11 (разработчики GCC выступали с похожим заявлением). Для упрощения миграции на C++11 в состав включен новый инструмент "C++'11 Migrator", позволяющий автоматически конвертировать код C++ в представление, использующее элементы C++11. Кроме того, в Clang 3.3 добавлена возможность использования символов Unicode в идентификаторах.
В Clang Static Analyzer добавлены дополнительные проверки, позволяющие выполнять межпроцедурный статический анализ кода, выходящий за границы отдельных C++ конструкторов/деструкторов. Для разработчиков, использующих vim и emacs, представлено приложение clang-format, выполняющее функции интеллектуальной системы автоматического форматирования кода.
В состав Clang включены патчи, необходимые для обеспечения сборки ядра Linux, что позволило приблизиться к состоянию, когда немодифицированное ядро Linux можно будет пересобрать штатным компилятором Clang. До сих пор для подобной сборки требовалось применение серии патчей, как к ядру, так и к Clang;
- В DragonEgg, плагине к набору компиляторов GCC, заменяющем оригинальные оптимизаторы и генераторы кода GCC на аналоги, созданные в рамках проекта LLVM, добавлена поддержка GCC 4.8 (требуется gcc-4.8.1) и возможность записи объектных файлов с использованием встроенного ассемблера LLVM;
- В отладчике LLDB добавлена поддержка точек наблюдения (watchpoints), представлен плагин для интеграции с Vim, улучшена поддержка регистров (в том числе векторных), реализована возможность отладки многопоточных программ, обеспечена сборка с использованием cmake/ninja/auto-tools/clang 3.3/gcc 4.6, добавлены новые команды для вывода процессов, присоединения к процессу и форка, реализована поддержка вычисления выражений;
- Отмечен прогресс в реализации проекта Portable Computing Language OpenCL ( PoCL), в рамках которого ведётся разработка полностью открытой реализации стандарта OpenCL, независимой от производителей графических ускорителей. PoCL позволит разработчикам не задумываться об особенностях той или иной реализации стандарта и использовать предоставляемые компилятором оптимизации вместо применения специфических для каждой платформы техник ручной оптимизации. PoCL реализован по модульному принципу, позволяющему использовать различные бэкенды для выполнения OpenCL-ядер на разных типах графических и центральных процессоров;
- Представлен проект Jade (Just-in-time Adaptive Decoder Engine), в рамках которого развивается универсальный движок для декодирования видео, использующих LLVM для JIT-компиляции адаптивных конфигураций декодера видео, определённых комитетом MPEG Reconfigurable Video Coding (RVC);
- Обновлена реализация LDC - компилятора для языка программирования D, комбинирующего фронтэнд из состава эталонного компилятора D с бэкендом на базе LLVM, позволяющим генерировать эффективный нативный код. LDC поддерживает генерацию кода для систем x86/x86_64 Linux, Mac OS X и Windows, и PPC64 для Linux. В разработке находится создание генератора кода для архитектуры ARM.
Из параллельно развивающихся проектов, основанных на LLVM, можно отметить:
- KLEE - символьный анализатор и генератор тестовых наборов;
- Runtime-библиотека compiler-rt;
- llvm-mc - автогенератор ассемблера, дизассемблера и других, связанных с машинным кодом компонентов, на основе описаний параметров LLVM-совместимых платформ.
- VMKit - виртуальная машина для Java и .NET;
- Реализация функционального языка программирования Pure;
- LDC - компилятор для языка D;
- Roadsend PHP - оптимизатор, статический и JIT компилятор для языка PHP;
- Виртуальные машины для Ruby: Rubinius и MacRuby;
- LLVM-Lua
- FlashCCompiler - средство для компиляции кода на языке Си в вид пригодный для выполнения в виртуальной машине Adobe Flash;
- LLDB - новая модульная инфраструктура отладки, использующая такие подсистемы LLVM как API для дизассемблирования, Clang AST (Abstract Syntax Tree), парсер выражений, генератор кода и JIT-компилятор. LLDB поддерживает отладку многопоточных программ на языках C, Objective-C и C++; отличается возможностью подключения плагинов и скриптов на языке Python; демонстрирует экстремально высокое быстродействие при отладке программ большого размера;
- emscripten - компилятор биткода LLVM в JavaScript, позволяющий преобразовать для запуска в браузере приложения, изначально написанные на языке Си. Например, удалось запустить Python, Lua, Quake, Freetype;
- sparse-llvm - бэкенд, нацеленный на создание Си-компилятора, способного собирать ядро Linux.
- Portable OpenCL - открытая и независимая реализация стандарта OpenCL;
- CUDA Compiler - позволяет сгенерировать GPU-инструкции из кода, написанного на языках Си, Си++ и Fortran;
- Julia - открытый динамический язык программирования, использующий наработки проекта LLVM.
Источники[править]
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии[править]
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.