LINUX.ORG.RU

LLVM 3.0

 , ,


1

3

30.11.2011 в свет вышла очередная версия фреймворка для построения компиляторов и виртуальных машин.

Википедия

Low Level Virtual Machine (LLVM) — универсальная система анализа, трансформации и оптимизации программ, реализующая виртуальную машину с RISC-подобными инструкциями. Может использоваться как оптимизирующий компилятор этого байткода в машинный код для различных архитектур либо для его интерпретации и JIT-компиляции (для некоторых платформ).

Проект LLVM официально включает в себя следующие основные проекты:

  • LLVMCore - библиотеки для обеспечения платформонезависимой оптимизации и кодогенерации под различные виды процессоров и платформ;
  • CLang - компилятор языков C/C++/Objective-C для LLVM;
  • dragonegg - объединяет в себе парсер GCC-4.5 и оптимизацию и кодогенерацию на основе библиотек LLVM;
  • LLDB - дебаггер, использует Clang и LLVM;
  • libc++ - реализация стандартной библиотеки C++ (включает неполную поддержку стандарта C++11);
  • vmkit - реализация языков Java и .Net для LLVM;
  • SAFECode - память-безопасный компилятор С/С++.

Помимо упомянутых официальных проектов существует большое количество проектов, которые используют LLVM для компиляции программ для таких языков как Ruby, Python, Haskell, Java, D, PHP, Lua и т.д.

Основные изменения:

  • llvm-gcc больше не поддерживается, рекомендуется использовать clang или dragonegg;
  • LLVM IR (intermediate representation - платформонезависимый ассемблер для LLVM) включает в себя полную поддержку атомарных операций с памятью (load, store, compare, exchange, read/modify/write, etc.);
  • полностью переделан механизм обработки исключений в LLVM IR;
  • полностью переделана система типов LLVM IR;
  • MIPS backend доведён до production quality;
  • ...

Полный и подробный перечень изменений можно посмотреть в подробностях.

В настоящее время для скачивания доступен только исходный код (через svn). В ближайшее время на сайте в списке закачек ожидается появление бинарных сборок и тарболла.

>>> Подробности (англ.)

★★★★★

Проверено: mono ()
Последнее исправление: mono (всего исправлений: 2)

Ответ на: комментарий от shty

Мой вердикт таков

Твой вердикт - понты.

Ну чо, наивный малтшик, не в курсе что означают две первых L в слове LLVM.

Этот «малтшик», если что, сделал на LLVM достаточно сложный проект и поделился своим опытом использования. В отличие от тебя - не мальчика, но мужа.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Этой весной лидер команды Native Client сказал, что в ближайшее (время год-два) у них будет качественный питон в ллвм. Значит у них будет качественный питон в ллвм.

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

так LLVM и есть кнопка, не? и она ему не подходит по форме

нет, не кнопка ни разу, и именно поэтому low level

для того чтобы там сделать нестандартные штуки - надо засучить рукава и поработать головой

shty ★★★★★
() автор топика
Ответ на: комментарий от Gorthauer

Конечно - это гарантия того что ПО на Java работает на любой платформе, и в любой из поддерживаемых VM(и под любой ОС, где доступна одна из VM).

Вот соответствующий раздел спецификации

lucentcode ★★★★★
()
Ответ на: комментарий от tailgunner

В отличие от тебя - не мальчика, но мужа.

да, мой компилятор прошёл тест, в отличие от поделок школьников-неосиляторов, которым всё подавай на блюдечке готовое

shty ★★★★★
() автор топика
Ответ на: комментарий от shty

да, мой компилятор прошёл тест

...но этот компилятор ты никому не покажешь?

в отличие от поделок школьников-неосиляторов

...и в отличие от поделок школьников-неосиляторов твой компилятор - со статически типизированного Си-подобного языка?

tailgunner ★★★★★
()
Ответ на: комментарий от lucentcode

нах тебе перенос бинарников между архитектурами? Собери несколько бинарников и будет счастье

stevejobs ★★★★☆
()
Ответ на: комментарий от tailgunner

да, мой компилятор прошёл тест

...но этот компилятор ты никому не покажешь?

а ты часто с рабочих реп на лор код постишь?

в отличие от поделок школьников-неосиляторов твой компилятор - со статически типизированного Си-подобного языка?

в отличие от, я взял и сделал, а не ныл в интернетах

PS помажь свой баттхёрт финалгоном, а то синяк будет

shty ★★★★★
() автор топика
Ответ на: комментарий от shty

нет, не кнопка ни разу, и именно поэтому low level
не кнопка ни разу

интересно тогда, с каким предметом из «реального мира» ассоциируется у тебя ассемблер x86

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

Этой весной лидер команды Native Client сказал, что в ближайшее (время год-два) у них будет качественный питон в ллвм

Ну как бы никто и не сомневается, что можно сделать качественный Питон на LLVM. Но, как и сказано выше, во времена Unladen не подходила LLVM для динамических языков. И, судя по оценке этого самого лидера, даже сейчас не очень подходит.

tailgunner ★★★★★
()
Ответ на: комментарий от shty

конечно не поверю, ибо только что с гемором на эту тему разбирался
читали эту статью, думаете она ни с того ни с сего появилась?

Еще раз: тема о LLVM, если Вы используете Алгол, то он будет преобразован в LLVM инструкции, а дальше все как обычно.

anonymous
()
Ответ на: комментарий от stevejobs

интересно тогда, с каким предметом из «реального мира» ассоциируется у тебя ассемблер x86

шило

shty ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

Но, как и сказано выше, во времена Unladen не подходила LLVM для динамических языков.

долго ты ещё этот бред здесь таскать будешь?

shty ★★★★★
() автор топика
Ответ на: комментарий от shty

а ты часто с рабочих реп на лор код постишь?

Я и не болтаю на ЛОР о крутизне кода в своих рабочих репах.

в отличие от поделок школьников-неосиляторов твой компилятор - со статически типизированного Си-подобного языка?

в отличие от, я взял и сделал

Похоже, я прав. Это многое объясняет.

PS помажь свой баттхёрт финалгоном, а то синяк будет

У тебя явно большой опыт лечения баттхерта.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

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

1. я не использую Алгол
2. и мы говорили не про Алгол, а про pass-by-name, и я Вам сказал, что с этим есть вполне конкретные проблемы и привёл пример
3. кем или чем, он будет преобразован, позвольте поинтересоваться?
4. а для любого другого языка не будут сгенерированы инструкции LLVM IR?

shty ★★★★★
() автор топика

ээх. пропустил.
Тут вот 2 вопросика.
Какая версия Ди для ллвм?
и второй, могу ли я результат написанный на питоне, пользовать в коде, который написан на Ди? ну все в пределах ллвм есессно...

ах да ЪАноним, по ссылкам не хожу.

anonymous
()
Ответ на: комментарий от tailgunner

Я и не болтаю на ЛОР о крутизне кода в своих рабочих репах.

не покажешь где конкретно я «болтал» о «крутизне»? или у тебя крутизна - это всё что работает? :)

PS помажь свой баттхёрт финалгоном, а то синяк будет

У тебя явно большой опыт лечения баттхерта.

дарю

shty ★★★★★
() автор топика
Ответ на: комментарий от anonymous

могу ли я результат написанный на питоне, пользовать в коде, который написан на Ди?

что значит результат?

shty ★★★★★
() автор топика
Ответ на: комментарий от anonymous

И где pass-by-name кроме алгола применяется?

там где его запилили, и это не обязан быть mainstream язык, как Вы понимаете

shty ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

по сути нечего ответить?

shty ★★★★★
() автор топика
Ответ на: комментарий от shty

Ну я больше не знаю, где оно используется. Если не поняли как это можно запарелелить переведите указанный вами пример, например, на Си и все :)

anonymous
()

LLDB - дебаггер, использует Clang и LLVM;

А здесь много работающих на маке? Или инфа на оф. сайте устарела?

gag ★★★★★
()
Ответ на: комментарий от shty

Только я не пойму как это доказывает тезис «LLVM если и подходит для динамических языков, то только с недавних пор»?

Тебе написали, почему. Что не понятно?

anonymous
()
Ответ на: комментарий от shty

да, мой компилятор прошёл тест, в отличие от поделок школьников-неосиляторов, которым всё подавай на блюдечке готовое

Где этот компилятор?

anonymous
()

гуд. еще один гвоздь в гроб gcc.

anonymous
()

Где эти придурки опубликовали открытый ключ, которым подписывали свои поделки? gpg: запрашиваю ключ E95C63DC с hkp сервера subkeys.pgp.net gpgkeys: key E95C63DC not found on keyserver Ещё с 2.8 это тянется

anonymous
()
Ответ на: комментарий от anonymous

Какая версия Ди для ллвм?

есть компилятор, в котором есть D1 и D2. Раньше было два форка, ldc и ldc2, сейчас их слили в один.

https://github.com/ldc-developers/ldc/wiki/Project-Status
https://github.com/ldc-developers/ldc/wiki/Installation
https://github.com/ldc-developers/ldc/wiki/Build-from-Sources-for-Linux-FreeBSD

он пока ещё под LLVM 2.9, под 3.0 должны запилить на днях

https://github.com/ldc-developers/ldc/issues/11

надо пробовать

производительность LDC неплохая https://github.com/gizmomogwai/performance

кстати, Tango2 под LDC2 лежит здесь https://github.com/SiegeLord/Tango-D2 бранч d2port

могу ли я результат написанный на питоне, пользовать в коде, который написан на Ди? ну все в пределах ллвм есессно...

да хоть на С++. Смотришь биткод, в который откомпилируется питон (или С++). Смотришь его ABI, и думаешь, как его вызывать из D. Если ABI сильно похож на С, то и думать особо не надо. А так, пишешь свой ABI для LLVM, и вызываешь его из D. Или врапперы на LLVM ассемблере, и вызываешь их как intrinsic.

Да, и рантайм общий надо сочинить, чтобы из него инициализировались 2 рантайма, D и питоновский/C++.

anonymous
()
Ответ на: комментарий от anonymous

как-то так

version(LDC)
{
pragma(intrinsic, "llvm.sqrt.f64")
double sqrt(double val);
}
else
{
 ...
}

то есть, все функции с чужеродным ABI сделать как intrinsic в компиляторе.

только здесь чтобы подключить sqrt, написаный с питоновым ABI (или С++), придётся повозиться. есть два варианта, первый это использовать встроенный D asm, в LDC есть GNU-подобный asm — http://www.dsource.org/projects/ldc/wiki/InlineAsmExpressions см http://www.dsource.org/projects/ldc/wiki/Docs , второй вариант — хренячить в компиляторе LDC ещё один ABI, например, сделать в LDC extern(C++), extern(Python) по аналогии с extern(C). Например, взять кусок из clang и воткнуть в LDC, чтобы extern(C++) был одинаков. То есть: чтобы всё, что описано в extern(C++) выкоцывалось в отдельный файл и собиралось через clang, а сюда подставлялись манглированные С++ символы для линковки. или всё-таки прикрутить llvm-as в D как встроенный ассемблер какой-то новой прагмой, и собирать clang-ом в .ll, а этим асмом собирать из D, и автоматически генерить прототипы для линковки с D кодом.

такую штуку для вычисления прототипов для линковки можно написать на D CTFE шаблонах

если чо, можно накрутить шаблоны в СTFE поверх http://www.dsource.org/projects/ldc/wiki/InlineAsmExpressions для реализации ABI.

Ещё есть C биндинги к LLVM, 2.9 — кто бы их обновил под 3.0

http://www.dsource.org/projects/bindings/browser/trunk/llvm-2.9

D binding for LLVM While not part of the LDC compiler, llvm-c bindings for D can be found in the svn of the Bindings project. These bindings are a wrapper around the LLVM C interface with a few extensions.

anonymous
()
Ответ на: комментарий от sjinks

Девятый бит тоже остаётся (a & 0x100) >> 8 — порядок слов на порядковых номерах битов не сказывается.

Если так - то все хорошо. А если *((char*)&a)[1]&0x1 - то муйня

namezys ★★★★
()
Ответ на: комментарий от shty

Мой вердикт таков - чувак думал что LLVM - это страшное колдунство и если его запустить то оно автоматом все проблемы ему порешает.

По моему, это как раз было очевидно даже через вторые/третьи руки. у нас на работе чувак PyPy любит. Я его мучал, читали об этом, я пришел к выводу, что именно «не осилил». Думаю, что нужный им функционал в LLVM мог быть добавлен куда меньше ценой, чем реализация кодогенератора на PyPy

namezys ★★★★
()
Ответ на: комментарий от tailgunner

Но, как и сказано выше, во времена Unladen не подходила LLVM для динамических языков.

Блин, х86 ассемблер тоже не очень подходит

namezys ★★★★
()
Ответ на: комментарий от anonymous

или запилить так:

чтобы clang генерировал прототипы с calling convention C++, а какой-то llvm-python - Python

http://llvm.org/docs/LangRef.html#functionstructure :
cconv = c++/python

в идеале в каждый define надо вставлять аннотацию с прототипом. как оно было в C++ / python

в самом clang / llvm-python сделать этот calling convention в виде обёртки над тем, во что код транслируется

затем, clang или llvm-python генерит .ll ассемблер.

Парсер грепает по define с нужным calling convention и формирует автоматически «прототипы» для инклуда в D.

А из этих грепнутых прототипов автоматически формировать строки вида extern(LLVM-as) { .. define anycconv foobar... } / extern(C++) { ... void cpp::foobar(...} / extern (Python) {... python_foobar(...) ... }

здесь в {...} скорее всего будет текст (многострочная строка в D), а само содержимое extern (C++) {...} — будет формироваться как шаблон D из скрипта и разворачиваться в CTFE.

Кажется, даже пилить LDC не надо --всё можно сделать шаблонами LDC в CTFE. Только надо бы ассемблер брать llvm-овский, а не inline или GNU-подобный из import ldc.llvmasm; https://github.com/ldc-developers/ldc/tree/llvm3.0/runtime/import/ldc

Хотя это в основном — для красоты.

Что физически надо, так это уметь вызывать из D код с cconv C++ или Python, и не пытаться их вызывать с D cconv. тут-то и пригодятся LLVM intrinsic, например trampoline, на первую пору — хотя это kludgy, и по-нормальному это LDC должен уметь генерировать код с нужным cconv. Например, хотя бы обёртками на llvm ассемблере. В идеале этот код должен инлайнится через CTFE, и переменные-значения должны конвертироваться когда надо, и т.п.

anonymous
()
Ответ на: комментарий от anonymous

могу ли я результат написанный на питоне, пользовать в коде, который написан на Ди? ну все в пределах ллвм есессно..

Смотришь биткод, в который откомпилируется питон (или С++). Смотришь его ABI, и думаешь, как его вызывать из D. Если ABI сильно похож на С, то и думать особо не надо.

ну то есть: у этого твоего llvm-python ABI с-совместимый? Тогда в D заворачиваешь прототипы в extern(C) {...} ; и вперёд. Вот если по другому, то с реализацией своего cconv можно позаморачиваться, но не очень нужно, а нужно уметь вызывать из D этот чужеродный ABI. например, заинлайнив вызов чужеродного ABI в llvm ассемблер через D шаблоны во время CTFE (то есть, этот вызов в ллвм асме пускай умный макрос сам пишет).

anonymous
()
Ответ на: комментарий от anonymous

внезапно

Анонимусм, учись читать. Оно протухшее. Последнее обновление в svn касающееся исходников - октябрь прошлого года.

Andru ★★★★
()
Ответ на: комментарий от anonymous

да, не посмотрел.. вики в основном

anonymous
()
Ответ на: комментарий от namezys

Зачем люди умирают, солнце садится, деньги обесцениваются? )

vasily_pupkin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.