LINUX.ORG.RU

LLVM. Зачем он вообще нужен?

 ,


3

6

Я понимаю, зачем его используют: чтобы не писать 100500 раз в каждом компиляторе одни и те же алгоритмы оптимизации.

Я не понимаю, почему не использовать просто компиляцию через Си или Си++. Оптимизации сделает компилятор Си. Семантика у LLVM всё равно совпадает с Си, по объёму кода компилятора тоже выигрыша практически нет. Зато если использовать Си, можно использовать любой из компиляторов Си и компилировать для платформ, для которых нет реализации LLVM.

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

Если не важно, то чего ты бампаешь тред? Сиди себе в обнимку со своей панамкой и всем, что в неё понапихано. Разве что, я бы посоветовал тебе добавить в панамку учебник англюсика.

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

Если не важно, то чего ты бампаешь тред? Сиди себе в обнимку со своей панамкой и всем, что в неё понапихано. Разве что, я бы посоветовал тебе добавить в панамку учебник англюсика.

англюсика

Ловите тугосерю.

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

Тебе обязательно подтверждение от меня?

Подтверждение чего?

Тогда дождался.

Я жду логического объяснения причин, по которым ты отказал программе из поста в принадлежности к strictly conforming. Пока не вижу.

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

Я жду логического объяснения причин, по которым ты отказал программе из поста в принадлежности к strictly conforming. Пока не вижу.

Вы утомили уже своей тупостью и упрямством. Ваш пример не strictly conforming потому что:

A strictly conforming program shall not produce output dependent on any unspecified, undefined, or implementation-defined behavior.

Signed overflow нарушает этот пункт. Поиск этих строчек в С стандарте оставляю вам как домашнее задание, хоть в стандарт загляните.

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

Вы утомили уже своей тупостью и упрямством. Ваш пример не strictly conforming потому что

Его поинт в том, что там нет вывода, поэтому на UB насрать. Но, как мы выяснили, вывод там есть :)))))))))

anonymous
()

LLVM - это виртуальная машина, созданная корпорациями, чтобы через виртуальную машину отделить программы от железа и вытеснить gcc.

anonymous
()
11 ноября 2025 г.

недостатки Си как языка (а следовательно и С++) обсуждались многократно. просто некоторые операции и типы данных в Си мешают или сильно затрудняют некоторые оптимизации. точнее чтоб определить возможно ли применить эти оптимизации компилятору надо очень замудрено проверять зависимости чуть ли не интерпретируя программу по шагам. алиасинг указателей и прочее. парадокс в том что если использовать более строго типизированный язык с урезанными возможностями то компилятор потом сможет оптимизировать лучше. да да те самые языки Паскаль или МЛ семейства. или там Фортран современный. не зря же физики на нем пишут до сих пор - он чутка лучше оптимизирует чем Си. и никакой магии, просто авторы этих языков думали более математически точно. так что копилятору не надо потом гадать что имелось ввиду. в этом плане libFirm наверное проще всего как бэкэнд а не Си. в конце концов SSA это почти функциональный язык, типа МЛ. да да вы правильно поняли любой современный компилятор на самом деле переводит любой код любого моднявого языка в МЛ-подобный внутренний SSA язык и далее работает уже с ним. сюрприз.

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

Это если выбирать, писать ли компилятор Си++. Но он же уже есть. И оптимизирует обычно лучше (в виде g++) или по крайней мере не хуже (в виде clang++), чем любой другой язык, компилируемый через LLVM.

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

Это если выбирать, писать ли компилятор Си++. Но он же уже есть. И оптимизирует обычно лучше (в виде g++) или по крайней мере не хуже (в виде clang++), чем любой другой язык, компилируемый через LLVM.

В транспиляторе на C++ не получится использовать std, STL, … так как в них масса ограничений.
Значит какой ЯП придётся использовать для транспиляции?

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

В транспиляторе на C++ не получится использовать std, STL, … так как в них масса ограничений.

Почему?

Вот есть L++, работающий через транспиляцию на C++. https://bitbucket.org/ktg/l/src

Спокойно можно втыкать хоть STL, хоть boost.

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

Значит какой ЯП придётся использовать для транспиляции?

Сам и отвечу.
Специализированный в который будет пригоден для создания любых алгоритмов.
А это как раз и сделано в LLVM.

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

Спокойно можно втыкать хоть STL, хоть boost.

Эээээээ.
«Втыкать» то можно …
Это как - "Можно ли из Запорожца сделать Мерседес.

Транспиляция конечно привлекательна, но не думаю, что это хороший путь разработки нового ЯП.

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

Транспиляция конечно привлекательна, но не думаю, что это хороший путь разработки нового ЯП.

Так я и пытаюсь понять, чем транспиляция в LLVM привлекательнее, чем транспиляция в Си++. Напрямую в машкод нынче мало кто компилирует.

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

В цпп проблемы оптимизации из-за алиасинга, отсутствие нормальных movable типов, переусложнённый язык, все возможности которого всё равно не сможешь использовать. Специализированный язык банально лучше.

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

Так я и пытаюсь понять, чем транспиляция в LLVM привлекательнее, чем транспиляция в Си++. Напрямую в машкод нынче мало кто компилирует.

Не простой вопрос конечно.
Для того чтобы на него ответить нужно привести пример транспиляции на C++ и сравнить результирующий код с кодом на LLVM.
Трудность здесь в том, что например std неплохо подходит для некоторых алгоритмов, но наверняка для обрпботки больших объёмов данных нужны иные алгоритмы.
Поэтому транспиляция не сможет решить эти вопросы.
С другой стороны LLVM так и вовсе не решает эти вопросы …

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

Так я и пытаюсь понять, чем транспиляция в LLVM привлекательнее, чем транспиляция в Си++. Напрямую в машкод нынче мало кто компилирует.

У меня встречный вопрос.
Какие проекты, исппользующие LLVM предоставляют возможность
создания динамических алгоритмов?

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

yandex ответил так

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

У меня встречный вопрос. Какие проекты, исппользующие LLVM предоставляют возможность создания динамических алгоритмов?

Почему задал такой вопрос?

Потому как динамические алгоритмы зачастую весьма упрощают разработку,

На том же 1С 7.7 динаический алгоритм на 300 строк позволяет эффективно выгрузить все объекты какой-либо конфигурации например в MySQL.
Да и произвести загрузку в 1С …

anonymous
()

!monk, пошучу на вопрос - «LLVM. Зачем он вообще нужен?»

Как говорила девочка в «Бриллиантовая рука» - «Мы провожаем папу».

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

В цпп проблемы оптимизации из-за алиасинга, отсутствие нормальных movable типов

А в LLVM нет алиасинга и есть нормальные movable типы? Можно пример кода какой-нибудь для наглядности?

все возможности которого всё равно не сможешь использовать

Так все и не нужны. Нужны достаточные для семантики реализуемого языка.

Специализированный язык банально лучше.

Вот и пытаюсь понять, чем лучше. Потому что у C/C++ есть объективное преимущество: использование библиотек. Чем лучше LLVM, пока непонятно.

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

Вот и пытаюсь понять, чем лучше. Потому что у C/C++ есть объективное преимущество: использование библиотек. Чем лучше LLVM, пока непонятно.

@monk, просто трудоёмкость разработуи какого-то нового ЯП меньше + неплохо оптимизированный код.
Но это отнюдб не значит, что такой код будет пригоден для обработки больших объёмов данных.
Для решения такого рода задач скорее нужен не новый ЯП, а хорошие алгоритмы.
То биш у LLVM имеется своя ниша задач для которых его целесообразно использовать, а разработку высокоэффективных алгоритмов скорее всего нужно поручать хорошему профи.

Кстати имеется сотни книг по алгоритмам, но приводимые примеры
зачастую не эффективны, а лишь знакомят как-то там с различными объектами.

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

А в LLVM нет алиасинга

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

есть нормальные movable типы

Опять же, movable тип - ему можно в любой момент сделать memmove и забыть. В цпп таких типов нет (кроме совсем базовых типа инта или флоата), они невыразимы в цпп. А следовательно будут невыразимы в твоём гипотетическом языке.

Нужны достаточные для семантики реализуемого языка.

А ещё нужны необходимые для семантики реализуемого языка. А их может и не быть.

у C/C++ есть объективное преимущество: использование библиотек

Линковаться к сишным библиотекам можно из любого языка. Проблема как всегда в отличающейся семантике выдуманного языка и си, нужен как минимум какой-то клей, приводящий твой язык и внешнюю библиотеку к общему знаменателю.

unC0Rr ★★★★★
()
Последнее исправление: unC0Rr (всего исправлений: 1)
Ответ на: комментарий от unC0Rr

Суть в том, что проблема есть в цпп, и его компилятор вынужден учитывать её, даже если твой исходный язык от алиасинга избавлен.

Тогда исходный язык будет транслироваться в функции, где все параметры с restrict. И алиасинг также будет игнорироваться.

В цпп таких типов нет (кроме совсем базовых типа инта или флоата), они невыразимы в цпп.

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

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

Линковаться к сишным библиотекам можно из любого языка.

Как из LLVM подключить puts?

declare i32 @puts(ptr nocapture) nounwind

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

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

А в LLVM есть

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

обычную структуру

Если только у неё поля movable, и при муве не нарушаются инварианты. Кроме того, если использовать только обычные структуры, нахрена тогда тебе вообще цпп?

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

Линковаться к сишным библиотекам можно из любого языка.

ИМХО суждения Кергиана и Ритчи о том, что ЯП должен быть прост, а фунциональность должна достигаться через разработку API верна.

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

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

Из того, что я видел, ограничения один-в-один.

Кроме того, если использовать только обычные структуры, нахрена тогда тебе вообще цпп?

Как промежуточный язык для компиляции в машкод. Вместо LLVM. Но с возможностью вызывать функции из библиотек, написанных на C++.

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

вызывать функции из библиотек, написанных на C++.

Окей, допустим. Какой пример вызова приходит на ум? Допустим, ты хочешь создать окошко с кнопкой в Qt. Сразу вопрос, а классы из цпп выразимы в придуманном языке? Что делать с созданным объектом? Будешь ты внутри твоего языка понимать, что этот объект нельзя мувать, что у него нужно вызывать деструктор или что деструктор может быть вызван, и доступа к объекту больше не будет? Если ответ на всё «да», то это точно вообще отдельный язык со своей семантикой, а не тупо цпп с парой плюшек сверху?

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

Окей, допустим. Какой пример вызова приходит на ум? Допустим, ты хочешь создать окошко с кнопкой в Qt. Сразу вопрос, а классы из цпп выразимы в придуманном языке? Что делать с созданным объектом?

То же, что с внешним интерфейсом к Си. Есть некий объект языка «ссылка на внешний объект» с особыми правилами.

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

Также, как на полученный указатель из Си надо вручную вызывать free (иногда специализированный из той же библиотеки, откуда указатель). Семантика работы с внешними сущностями часто отличается от семантики работы с объектами самого языка.

Но если в качестве промежуточного использовать не LLVM, а Си++, то указатели можно получить и от Си++ и вызывать методы полученных объектов.

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

Как-то посмотрел исходники транспайлера Haxe, а он то весьма скудно использовал возможности ЯП для которых он мог генерировать код …

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

Как транспилятор будет работать с адресами стороннего аллокатора?

Также, как сейчас в любом языке работает FFI. Там тоже адреса из разных аллокаторов есть.

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