Релиз набора компиляторов LLVM 2.9
После 6 месяцев разработки доступен релиз проекта LLVM 2.9 (Low Level Virtual Machine) - GCC совместимого инструментария (компиляторы, оптимизаторы и генераторы кода), компилирующего программы в промежуточный байт-код RISC подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизации). Сгенерированный платформонезависимый псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы.В версию LLVM 2.9 включены наработки с реализацией расширенных методов оптимизиации и генерации кода (в частности, задействованы новые возможности современных ARM-систем), в Clang и libc++ улучшена поддержка стандарта C++'0x, значительно расширена функциональность отладчика LLDB. Из новшеств также можно отметить:
- В LLVM-фронтэнде Clang, улучшена поддержка языков C, C++ и Objective-C. Проведена работа по обеспечению поддержки некоторых новых возможностей C++'0x, таких как rvalue-ссылки и шаблонов с переменным числом аргументов (variadic). Проведена большая работа над ошибками, налажена поддержка "__label__", продолжена работа по обеспечению возможности сборки Linux-ядра. Реализован и включен по умолчанию анализатор TBAA (Type Based Alias Analysis), который позволяет в определенных ситуациях существенно повысить оптимизации загрузки и сохранения (для отключения TBBA необходимо использовать опцию "-fno-strict-aliasing");
- В DragonEgg, плагине к набору компиляторов GCC 4.5, заменяющем оригинальные оптимизаторы и генераторы кода GCC на аналоги, созданные в рамках проекта LLVM, повышена стабильность работы при компиляции кода на языке Fortran и Java, улучшена обработка ассемблерных inline-вставок, добавлена базовая поддержка типа __float128;
- Добавлен новый бэкенд для виртуального набора инструкций NVIDIA PTX (Parallel Thread Execution);
- Добавлена встроенная поддержка ассемблера для ELF-файлов;
- Улучшена реализация техники оптимизации во время динамического связывания (LTO - Link Time Optimization), что позволило ускорить процесс сборки и обеспечить поддержку компиляции таких больших приложений, как Firefox 4;
- Определение циклов аналогичных по действию функциям memset и memcpy и автоматическая замена цикла на вызов функции из libc (реализации memset и memcpy в libc как правило оптимизированы);
- Улучшены средства для отладки оптимизированного кода;
- Подготовлена инфраструктура для базирующейся на регионах оптимизации (region based optimizations);
- Улучшено использование кода, учитывающего состояние регистров. Переписан код, занимающийся распределением регистров (register allocator);
- Полностью переработан код использования набора инструкций MMX, добавлена поддержка наборов инструкций 3dNow! и 3DNowA;
- Ускорена работа бэкенда для платформы ARM, обеспечена поддержка оптимизации для процессоров Cortex-A8 и Cortex-A9,
По заявлению разработчиков LLVM 2.9 будет последним релизом серии 2.x. В версии 3.0 планируется отказаться от поддержки фронтэнда llvm-gcc в пользу Си/C++/Objective-C компилятора Clang и GCC-плагина DragonEgg. В настоящее время Clang является более оптимальным решением для сборки проектов на языке Си, а DragonEgg является хорошим решением для разработчиков, заинтересованных в интеграции LLVM в GCC.
Из параллельно развивающихся проектов, основанных на LLVM, можно отметить:
- KLEE - символьный анализатор и генератор тестовых наборов;
- Runtime-библиотека compiler-rt;
- llvm-mc - автогенератор ассемблера, дизассемблера и других, связанных с машинным кодом компонентов, на основе описаний параметров LLVM-совместимых платформ.
- VMKit - виртуальная машина для Java VM и .NET VM;
- Реализация функционального языка программирования Pure;
- LDC - компилятор для языка D;
- Roadsend PHP - оптимизатор, статический и JIT компилятор для языка PHP;
- Виртуальные машины для Ruby: Rubinius и MacRuby;
- Unladen Swallow - реализация языка Python;
- LLVM-Lua
- FlashCCompiler - средство для компиляции кода на языке Си в вид пригодный для выполнения в виртуальной машине Adobe Flash.
© OpenNet