Новая версия набора компиляторов LLVM 3.2
21 декабря 2012 года
После 6 месяцев разработки доступен релиз проекта LLVM 3.2 (Low Level Virtual Machine) - GCC совместимого инструментария (компиляторы, оптимизаторы и генераторы кода), компилирующего программы в промежуточный биткод RISC подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизации). Сгенерированный платформонезависимый псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы.
Основные новшества субпроектов LLVM 3.2:
- В LLVM-фронтэнде Clang обеспечена полноценная поддержка стандарта C++'11. Добавлены средства для документирования кода внутри комментариев с использованием синтаксиса, напоминающего Doxygen. Улучшены средства диагностики для выявления возможных проблем в коде. Добавлена поддержка атрибута tls_model для явного определения модели Thread-Local Storage. Добавлена поддержка атрибутов для контроля сохранности типов на этапе компиляции для функций с переменными аргументами и аргументами функции 'void *';
- В DragonEgg, плагине к набору компиляторов GCC, заменяющем оригинальные оптимизаторы и генераторы кода GCC на аналоги, созданные в рамках проекта LLVM, добавлена поддержка загрузки плагинов LLVM, таких как Polly. Налажена передача информации о жизненном цикле переменных в оптимизаторы LLVM. Для сборки с поддержкой LTO более не требуется GCC;
- В инструментарии для анализа кода Clang Static Analyzer существенно расширена поддержка языка Objective-C, в том числе обеспечена поддержка новых литералов для работы с массивами и словарными типами данных. В статический анализатор кода Clang добавлена поддержка внутрипроцедурного анализа для функций и методов Objective-C и C++. Улучшен код для моделирования вызова функций;
- Улучшена работа библиотек libc++ и compiler_rt, которые распространяются под двойной лицензией MIT и UIUC. Библиотека libc++ представляет собой реализацию стандартной библиотеки классов C++, распространяемую под BSD-подобной лицензией и нацеленную на высокоэффективную генерацию кода и на максимальное обеспечение совместимости с существующими и будущими стандартами. Библиотека обеспечивает минимальное потребление памяти, высокую скорость выполнения функций, быструю компиляцию и совместимость на уровне ABI с libstdc++ из состава GCC для некоторых низкоуровневых возможностей, таких как объекты-исключения (exception objects), rtti и распределение памяти. В новой версии значительно улучшена поддержка стандарта C++11 и проведена оптимизация производительности;
- Проведена работа над ошибками в VMKit, виртуальной машине Java VM, использующей LLVM для статической и JIT-компиляции;
- Расширены возможности экспериментального оптимизатора Polly. Улучшены алгоритмы оптимизации циклов и механизмы автоматического распараллеливания кода с задействованием OpenMP. Добавлена распространяемая под лицензией MIT замена для CLooG (LGPLv2).
Проведено перелицензирование библиотеки isl (integer set library), которая теперь доступна под лицензией MIT;
Основные новшества LLVM 3.2:
- В оптимизаторе представлена начальная реализация кода автоматической векторизации циклов (Loop Vectorizer), пока пригодная лишь для распараллеливания выполнения небольших циклов. По умолчанию векторизация циклов отключена, для включения необходимо указать "-mllvm -vectorize-loops". Вторым важным улучшением оптимизатора, является переработанная реализация фазы оптимизации SROA (Scalar Replacement of Aggregates), в результате которой теперь генерируется код, более пригодный для последующих фаз оптимизаций;
- Добавлены оптимизации для некоторых новых моделей процессоров на базе архитектуры ARM. Добавлена поддержка CPU A6 'Swift'. Для целевой платформы ARM добавлен полноценный макроассемблер, в том числе поддерживающий модуль direct-to-object для clang. Полная поддержка ассемблера включена для режимов Thumb1, Thumb2 и ARM modes, а также для специфичных расширений VFP2, VFP3 и NEON;
- Добавлен новый бэкенд NVPTX, созданный при участии компании NVIDIA, для генерации кода с использованием виртуальной системы команд (Instruction Set Architecture) псевдоязыка NVIDIA PTX (Parallel Thread Execution), используемого в окружении CUDA;
- В LLVM IR (Intermediate Representation) добавлена поддержка явного выбора TLS (Thread-Local Storage) модели для хранения локальных переменных;
- Улучшена работа платформонезависимого генератора кода. Добавлена новая фаза оптимизации, названная "раскраска стека" (Stack Coloring), осуществляющая слияние объектов в стеке, используемых в разрозненных частях кода, что позволяет существенно сократить размер стека. Задействованы новые, более агрессивные алгоритмы генерации кода. Добавлена новая инфраструктура TableGen, учитывающая зависимости между инструкциями, и новый упаковщик для группировки машинных команд в "связки инструкций" для целевых архитектур VLIW, в которых одна инструкция содержит несколько параллельно выполняющихся операций;
- Расширена поддержка инструкций AVX2 (Advanced Vector Extensions) для процессоров x86;
- Значительно улучшена работа бэкенда MIPS, включая обеспечение поддержки интегрированного ассемблера и дизассемблера для MIPS32 и MIPS64. Добавлена экспериментальная поддержка MIPS16;
- Для целевой платформы PowerPC добавлены многочисленные улучшения и исправления, направленные на поддержку 64-разрядных процессоров PowerPC, улучшене совместимости с GCC и расширение поддержки ABI-интерфейса ELF для архитектуры PowerPC 64. Добавлена поддержка MCJIT.
Из параллельно развивающихся проектов, основанных на LLVM, можно отметить:
- KLEE - символьный анализатор и генератор тестовых наборов;
- Runtime-библиотека compiler-rt;
- llvm-mc - автогенератор ассемблера, дизассемблера и других, связанных с машинным кодом компонентов, на основе описаний параметров LLVM-совместимых платформ.
- VMKit - виртуальная машина для Java и .NET;
- Реализация функционального языка программирования Pure;
- LDC - компилятор для языка D;
- Roadsend PHP - оптимизатор, статический и JIT компилятор для языка PHP;
- Виртуальные машины для Ruby: Rubinius и MacRuby;
- Unladen Swallow - реализация языка Python;
- 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.
Источники
править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.