Релиз набора компиляторов 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