Релиз набора компиляторов LLVM 3.0
2 декабря 2011 года
После 7 месяцев разработки доступен (Архивная копия от 29 августа 2015 на Wayback Machine) релиз проекта LLVM 3.0 (Low Level Virtual Machine) - GCC совместимого инструментария (компиляторы, оптимизаторы и генераторы кода), компилирующего программы в промежуточный биткод RISC подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизации). Сгенерированный платформонезависимый псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы.
В версии 3.0 осуществлён отказ от поддержки фронтэнда llvm-gcc в пользу Си/C++/Objective-C компилятора Clang и GCC-плагина DragonEgg. В настоящее время Clang является более оптимальным решением для сборки проектов на языке Си, а DragonEgg является хорошим решением для разработчиков, заинтересованных в интеграции LLVM с GCC. Кроме того, прекращена поддержка загрузки ".bc" и ".ll" файлов из LLVM 2.8 и более ранних версий. С выпуском LLVM 3.0 отмечена стабилизация формата, а целью проекта стало обеспечение совместимости всех будущих релизов LLVM с текущим форматом файлов ".bc" и ".ll".
Основные новшества LLVM 3.0:
- В LLVM-фронтэнде Clang, поддерживающем языки C, C++ и Objective-C, расширена поддержка стандарта C++0x (C++ 2011), добавлены некоторые возможности, ожидаемые в будущем стандарте C1x. Значительно улучшена поддержка сборки приложений на языке C++, увеличена стабильность и расширены средства диагностики. Расширена поддержка Objective-C, реализованы возможности, необходимые для работы Objective-C runtime для Mac OS X 10.7 / iOS 5. Добавлены дополнительные оптимизации в библиотеку libclang,
- В DragonEgg, плагине к набору компиляторов GCC, заменяющем оригинальные оптимизаторы и генераторы кода GCC на аналоги, созданные в рамках проекта LLVM, реализована полная поддержка работы в виде плагина к GCC 4.5 и 4.6 без применения дополнительных патчей (прошлая версия DragonEgg поддерживала только GCC 4.5 и требовала наложения патчей). Добавлена опция, позволяющая одновременно использовать оптимизаторы LLVM и GCC (ранее DragonEgg заменял кодом из LLVM оптимизатор GCC). Связка из GCC-фронтэнда и LLVM-бэкенда официально поддерживает языки C, C++, Фортран и Ада, частично реализована поддержка Java, Objective-C, Objective-C++ и Google Go;
- Библиотеки libc++ и compiler_rt теперь распространяются под двойной лицензией MIT и UIUC. Библиотека представляет собой реализацию стандартной библиотеки классов C++, распространяемую под BSD-подобной лицензией и нацеленную на высокоэффективную генерацию кода и на максимальное обеспечение совместимости с существующими и будущими стандартами (C++0X). Библиотека обеспечивает минимальное потребление памяти, высокую скорость выполнения функций, быструю компиляцию и совместимость на уровне ABI с libstdc++ из состава GCC для некоторых низкоуровневых возможностей, таких как объекты-исключения (exception objects), rtti и распределение памяти. LLVM C++ планируется использовать по умолчанию в качестве стандартной С++ библиотеки во FreeBSD 10;
- В VMKit, виртуальной машине Java VM, использующей LLVM для статической и JIT-компиляции, добавлена поддержка упреждающей компиляции небольшой части базовой библиотеки Java. Обеспечена поддержка создания собственных виртуальных методов для индивидуальных классов. Добавлена новая модель обработки исключительных ситуация и улучшена реализация поддержки inline-развёртывания для инструкций Java-байткода. Увеличена скорость запуска и производительность runtime-компонентов;
- В LLVM IR (Intermediate Representation) добавлена полная поддержка атомарных операций с памятью, включая поддержку модели, определённой в спецификациях C++11 (C++0x) и C'1x (атомарная загрузка и сохранение, сравнение, обмен значений, инструкции чтения/изменения/записи и т.п.). В LLVM IR значительна переработана система типов и модель обработки исключительных ситуаций, что позволило избавиться от некоторых давно мешающих проблем;
- Основанная на линейном сканировании система распределения регистров (register allocator) заменена на новый "жадный" аллокатор регистров ("greedy" register allocator), способным на лету дробить диапазоны и реализующим много интересных оптимизаций, что в конечном итоге приводит к увеличению качества кода;
- Большой рывок в развитии отмечается для бэкенда MIPS, который из экспериментальных переведен в разряд готовых для промышленной эксплуатации. В новой версии реализована поддержка MIPS32r1/r2 и MIPS64, протестирован O32 ABI, доведёна до конца реализация JIT, прекращена поддержка старых архитектур MIPS1 и MIPS2;
- Оптимизатор и генератор кода теперь поддерживает информацию в форматах gprof и gcov, полученную из систем профилирования и анализа покрытия кода. Для работы с cov/gcov подготовлена утилита llvm-cov. Clang может использовать данные профилирования через совместимые с GCC опции;
- В бэкенде, ассемблере и дизассемблере архитектуры x86 обеспечена полная поддержка набора инструкций AVX 1 (Advanced Vector Extensions), поддерживаемых процессорами серии AMD Bulldozer и Intel Sandy Bridge. Включение производится через опцию "-mavx". В ассемблере и дизассемблере добавлена поддержка дополнительных инструкций, используемых в Atom, Ivy Bridge, SSE4a/BMI и RdRand;
- В ARM-бэкенде значительно увеличена производительность кода, сгенерированного для чипов на базе CPU ARM Cortex-A9, улучшена поддержка процессоров серии Cortex-M. Задействованы дополнительные оптимизации при генерации кода с инструкциями NEON, полученного при помощи Clang.
Из параллельно развивающихся проектов, основанных на LLVM, можно отметить:
- KLEE - символьный анализатор и генератор тестовых наборов;
- Runtime-библиотека compiler-rt;
- llvm-mc - автогенератор ассемблера, дизассемблера и других, связанных с машинным кодом компонентов, на основе описаний параметров LLVM-совместимых платформ.
- VMKit - виртуальная машина для Java и .NET;
- Реализация функционального языка программирования Pure(недоступная ссылка);
- LDC - компилятор для языка D;
- Roadsend PHP (Архивная копия от 28 декабря 2011 на Wayback Machine) - оптимизатор, статический и JIT компилятор для языка PHP;
- Виртуальные машины для Ruby: Rubinius и MacRuby;
- [http://code.google.com/p/unladen-swallow/ 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.
Источники править
- Главная ссылка к новости (http://lists.cs.uiuc.edu/piper...) (Архивная копия от 29 августа 2015 на Wayback Machine)
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.