The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Релиз набора компиляторов LLVM 3.0

02.12.2011 09:44

После 7 месяцев разработки доступен релиз проекта 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 - оптимизатор, статический и 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.


  1. Главная ссылка к новости (http://lists.cs.uiuc.edu/piper...)
  2. OpenNews: Представлена открытая реализация OpenCL, базирующаяся на использовании LLVM
  3. OpenNews: На базе Sparse создан LLVM-бэкенд, нацеленный на пересборку ядра Linux
  4. OpenNews: Увидел свет Emscripten 1.4, компилятор байткода LLVM в JavaScript-представление
  5. OpenNews: Релиз набора компиляторов LLVM 2.9
Лицензия: CC-BY
Тип: Программы
Короткая ссылка: https://opennet.ru/32433-llvm
Ключевые слова: llvm, gcc, clang
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (25) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, namefields (?), 11:01, 02/12/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Пометьте пожалуйста: "промежуточный биткод RISC" не является переносимым.
    Об этом разработчики NaCL говорят открыто - не взлетает у них PortableNaCL. Работы в этом направлении только ведутся.

    И ещё, Unlanded Swallow подох.

     
  • 1.2, Аноним (-), 11:15, 02/12/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Может кто в курсе, когда ожидать C1x?
     
     
  • 2.8, Мужик32 (ok), 12:51, 02/12/2011 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Я в курсе. Летом 2011 года.
     
     
  • 3.18, Аноним (-), 17:15, 02/12/2011 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Верни машину времени где взял. Лето 2011 года уже прошло.
     

  • 1.3, user (??), 11:42, 02/12/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    Clang под недоось не планирует выходить?
     
  • 1.4, Motif (ok), 11:59, 02/12/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А никто не в курсе, может ли LLVM генерить нативный код без JIT?
     
     
  • 2.6, RedRat (ok), 12:32, 02/12/2011 [^] [^^] [^^^] [ответить]  
  • +/
    Может, разумеется. Или ты думаешь, что ядро Фряхи, скомпилированное Шлангом, тоже во время запуска транслируется? ;-)
     
     
  • 3.11, Аноним (-), 14:46, 02/12/2011 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > Может, разумеется. Или ты думаешь, что ядро Фряхи, скомпилированное Шлангом, тоже во время запуска транслируется? ;-)

    Оно еще и запускается? 8-O

     
     
  • 4.27, Anonymouse (?), 22:19, 02/12/2011 [^] [^^] [^^^] [ответить]  
  • +/
    Нет конечно. Тебе просто снится что этот сайт работает :)
     
  • 3.13, Аноним (-), 14:56, 02/12/2011 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > Может, разумеется. Или ты думаешь, что ядро Фряхи, скомпилированное Шлангом, тоже во
    > время запуска транслируется? ;-)

    Да кто этих фряшников знает, у них там все не как у людей, они и до jit перед запуском могут додуматься. А что, теоретически круто же :)

     
     
  • 4.14, RedRat (ok), 15:04, 02/12/2011 [^] [^^] [^^^] [ответить]  
  • +/
    > Да кто этих фряшников знает, у них там все не как у
    > людей, они и до jit перед запуском могут додуматься. А что,
    > теоретически круто же :)

    Чтобы запустить JIT перед запуском ядра, надо сначала запустить что-то, что запустит JIT... :-)

     
     
  • 5.16, Аноним (-), 16:25, 02/12/2011 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > Чтобы запустить JIT перед запуском ядра, надо сначала запустить что-то, что запустит JIT... :-)

    Например, VmWare под WinXP =)

     
  • 5.19, Аноним (-), 17:32, 02/12/2011 [^] [^^] [^^^] [ответить]  
  • +/
    > Чтобы запустить JIT перед запуском ядра, надо сначала запустить что-то, что запустит
    > JIT... :-)

    А что, пусть бутлоадер JIT делает! Это тоже теоретически круто! :)

     
     
  • 6.25, Andrew Kolchoogin (?), 20:19, 02/12/2011 [^] [^^] [^^^] [ответить]  
  • +/
    Теоретически для FreeBSD это возможно, если написать JIT на FORTH. :)
     
     
  • 7.28, Аноним (-), 22:46, 02/12/2011 [^] [^^] [^^^] [ответить]  
  • +/
    Даешь порт FreeBSD на GA144!
     
  • 2.10, Аноним (-), 13:44, 02/12/2011 [^] [^^] [^^^] [ответить]  
  • +/
    > А никто не в курсе, может ли LLVM генерить нативный код без
    > JIT?

    Я в курсе

    http://clang.llvm.org/get_started.html

    >clang file.c -S -O3 -o - (output native machine code)

     

  • 1.7, Мужик32 (ok), 12:49, 02/12/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    >добавлены некоторые возможности, ожидаемые в будущем стандарте C1x
    >будущем стандарте C1x
    >02.12.2011 09:44  Релиз набора компиляторов LLVM 3.0

    Слоупоки-слоупочики.

     
     
  • 2.9, savant (ok), 13:44, 02/12/2011 [^] [^^] [^^^] [ответить]  
  • +1 +/
    C1x != C++0x
     
     
  • 3.15, Мужик32 (ok), 15:09, 02/12/2011 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Похоже, надо больше спать.
     
  • 3.17, Аноним (-), 16:46, 02/12/2011 [^] [^^] [^^^] [ответить]  
  • +/
    s/C++0x/C++11
     
  • 2.23, Сергей (??), 19:35, 02/12/2011 [^] [^^] [^^^] [ответить]  
  • +/
    > Как здорово, что ещё пишут что-то не на/для JS!

    Почти всё пишут не на JS :)

     
  • 2.24, Сергей (??), 19:36, 02/12/2011 [^] [^^] [^^^] [ответить]  
  • +/
    > Как здорово, что ещё пишут что-то не на/для JS!

    Всё пишут на Си и Си++. Всё остальное - процентов 10%.

     

  • 1.21, Аноним (-), 18:18, 02/12/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    > sparse-llvm - бэкенд, нацеленный на создание Си-компилятора, способного собирать ядро Linux.

    Непонятно, зачем это яблочникам понадобилось.

     
  • 1.22, botman (ok), 18:54, 02/12/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    За пределы Apple и кормящихся с лицензии BSD не улетит, поэтому так запутана вся работа с FreeBSD и OpenBSD, а Apple боиться открытия кода MacOS X и iOS. Даже не нужно выдумывать открытость там где её не планируется.
     
     
  • 2.26, Школьник (ok), 20:38, 02/12/2011 [^] [^^] [^^^] [ответить]  
  • +/
    >поэтому так запутана вся работа с FreeBSD и OpenBSD

    Что именно запутано?

    >а Apple боиться открытия кода MacOS X и iOS.

    Ядро MacOS X - открытое под очень либеральной по меркам F/OSS лицензией.

    > Даже не нужно выдумывать открытость там где её не планируется.

    Это вы про что, про LLVM? А аргументами подкрепить свою оценку открытости не затруднитесь ли?

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2021 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру