Re[7]: Про LLVM и IR
От: cserg  
Дата: 25.08.24 07:17
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Ну может можно какое-то подмножество C сделать, чтобы там переменные определялись только 1 раз. Оно бы было валидным с т.з. С-компилятора, удобным для прочтения человеком — и выполняло бы те же самые функции, которые выполняет IR.

Оно не будет удобным для человека. Там в местах слияния потока управления появляются phi функции. Замучаетесь на них смотреть.

S>Или кроме требования определять переменные единожды — еще что-то важное есть?

Есть. Например, если IR реализован как трехадресный код, то порядок вычислений детерменирован.
Re[11]: Про LLVM и IR
От: Muxa  
Дата: 25.08.24 07:20
Оценка:
S>А как из C++ получить C? Вот IR получить легко.

Аа, так тебе не clang/gcc, а clang++/g++ надо использовать для компиляции тогда.
Зачем вообще получать C/IR из C++?
Отредактировано 25.08.2024 11:41 Muxa . Предыдущая версия .
Re[7]: Про LLVM и IR
От: Zhendos  
Дата: 25.08.24 07:26
Оценка: 2 (1) +1
Здравствуйте, Shmj, Вы писали:

S>Ну может можно какое-то подмножество C сделать, чтобы там переменные определялись только 1 раз. Оно бы было валидным с т.з. С-компилятора, удобным для прочтения человеком — и выполняло бы те же самые функции, которые выполняет IR.


Так "С" недостаточно чтобы выразить сементику. Например "br i1 <cond>, label <iftrue>, label <iffalse>",
при замене его на "if () goto else goto" мы вернемся к тому с чего начинали.

То есть хотели превратить код, в то, что потом легко отобразилось бы на ассемблер,
а получаем опять AST, которое снова нужно парсить и превращать в "инструкции".

Можно было бы "C" научить передавать метки в функцию как аргументы,
типа:
br(condition, 'label1, 'label2);


но это уже явно не "С" будет.
Отредактировано 13.09.2024 15:31 Zhendos . Предыдущая версия . Еще …
Отредактировано 25.08.2024 9:42 Zhendos . Предыдущая версия .
Re[5]: Про LLVM и IR
От: Sinclair Россия https://github.com/evilguest/
Дата: 25.08.24 08:31
Оценка:
Здравствуйте, Shmj, Вы писали:
S>Было бы удобнее вместо нового IR использовать упрощеный C.
Кому удобнее?
S>Его и человеку читать привычнее и для парсера от IR не слишком будет отличаться, имхо.
Читаемость IR человеком не была среди приоритетов при разработке.
Но вы можете придумать C-синтаксис для IR и сделать компилятор туда-обратно. Всё, что нужно, у вас есть.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Про LLVM и IR
От: Pzz Россия https://github.com/alexpevzner
Дата: 25.08.24 09:52
Оценка: +4
Здравствуйте, Shmj, Вы писали:

S>Вот есть LLVM, который умеет генерить IR. И по сути этот IR мало чем отличается от языка C, только менее удобен для чтения человеком, но чуть более удобен для парсинга. В нем даже указатели и структуры есть.


Да ты прям универсал. И искуственный интеллект тебя интересует, и насущные проблемы компиляции, и проблемы философии и религии тебе не чужды. Прям Леонардо да Винчи наших дней.

S>Вопрос такой — не разумнее бы было генерить голый C (пусть даже сокращенную его версию) вместо IR?


IR — это абстрактный ассемблер, а не Си.
Re[2]: Про LLVM и IR
От: Shmj Ниоткуда  
Дата: 25.08.24 15:21
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>IR — это абстрактный ассемблер, а не Си.


Ну нет, это именно Си-подобный язык, с чуть более формальным синтаксисом.
Re[3]: Про LLVM и IR
От: Pzz Россия https://github.com/alexpevzner
Дата: 25.08.24 15:26
Оценка:
Здравствуйте, Shmj, Вы писали:

Pzz>>IR — это абстрактный ассемблер, а не Си.


S>Ну нет, это именно Си-подобный язык, с чуть более формальным синтаксисом.


Он семантически ассемблер, а не Си.
Re[4]: Про LLVM и IR
От: Shmj Ниоткуда  
Дата: 25.08.24 15:35
Оценка:
Здравствуйте, Pzz, Вы писали:

S>>Ну нет, это именно Си-подобный язык, с чуть более формальным синтаксисом.

Pzz>Он семантически ассемблер, а не Си.

Это с чего вы взяли то? Ассемблер работает напрямую с регистрами — а в IR — этого нет.
Re[5]: Про LLVM и IR
От: Muxa  
Дата: 25.08.24 16:13
Оценка: +1
S>>>Ну нет, это именно Си-подобный язык, с чуть более формальным синтаксисом.
Pzz>>Он семантически ассемблер, а не Си.

S>Это с чего вы взяли то? Ассемблер работает напрямую с регистрами — а в IR — этого нет.


Регистры это особенности реализации того или иного цпу.
А IR это абстракция
Re[5]: Про LLVM и IR
От: Sinclair Россия https://github.com/evilguest/
Дата: 25.08.24 16:33
Оценка:
Здравствуйте, Shmj, Вы писали:
S>Это с чего вы взяли то? Ассемблер работает напрямую с регистрами — а в IR — этого нет.
Конечно есть. Вот только в его "виртуальной машине" количество регистров не ограничено.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: Про LLVM и IR
От: Shmj Ниоткуда  
Дата: 25.08.24 18:45
Оценка: :)
Здравствуйте, Muxa, Вы писали:

M>Регистры это особенности реализации того или иного цпу.

M> А IR это абстракция

Вот по этой причине он и не является ассемблером — а ближе к C языку. Те же указатели там есть, циклы, функции, структуры.
Re[7]: Про LLVM и IR
От: Muxa  
Дата: 25.08.24 19:34
Оценка:
S>Вот по этой причине он и не является ассемблером — а ближе к C языку. Те же указатели там есть, циклы, функции, структуры.

Нет там циклов — разве что ты циклом называешь if+goto, и структуры чисто условные — доступ к полям через вычисления смещений, вместо них можно просто массивы соответствующих размеров использовать.
Re: Про LLVM и IR
От: T4r4sB Россия  
Дата: 25.08.24 20:17
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Вопрос такой — не разумнее бы было генерить голый C (пусть даже сокращенную его версию) вместо IR?


Хорошо, как должен выглядеть голый C, но чтоб по имени типа однозначно было понятно его машинное представление (без мутных параграфов), чтобы по сигнатуре однозначно было понятно, какие аргументы-указатели могут указывать на общий участок, по вещественному литералу определялся каждый бит его значения, ну это первое что я вспомнил?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[7]: Про LLVM и IR
От: cserg  
Дата: 25.08.24 22:30
Оценка: +3
Здравствуйте, Shmj, Вы писали:

S>Вот по этой причине он и не является ассемблером — а ближе к C языку.

LLVM IR — трехадресный код, ближе к языку ассемблера и очень далеко от С.

S>Те же указатели там есть, циклы, функции, структуры.

Там нет циклов в явном виде, вместо них есть goto br и этого достаточно чтобы появидись циклы.
Re: Про LLVM и IR
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 26.08.24 10:29
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Вот есть LLVM, который умеет генерить IR. И по сути этот IR мало чем отличается от языка C, только менее удобен для чтения человеком, но чуть более удобен для парсинга. В нем даже указатели и структуры есть.


S>Вопрос такой — не разумнее бы было генерить голый C (пусть даже сокращенную его версию) вместо IR?


Вы наверное мало на ассемблере писали. IR это тот же ассемблер, только с присваиваниями.

define i64 @safe_div(i64 %n, i64 %d) {
  %1 = icmp eq i64 %d, 0
  br i1 %1, label %iszero, label %nonzero

iszero:
  ret i64 -1

nonzero:
  %2 = udiv i64 %n, %d
  ret i64 %2
}
Re[11]: Про LLVM и IR
От: пффф  
Дата: 26.08.24 12:39
Оценка:
Здравствуйте, Shmj, Вы писали:

M>>Чего не хватает?


S>А как из C++ получить C?


А зачем?
Re[11]: Про LLVM и IR
От: flаt  
Дата: 26.08.24 14:05
Оценка: +1
Здравствуйте, Shmj, Вы писали:


S>А как из C++ получить C? Вот IR получить легко.


https://github.com/JuliaHubOSS/llvm-cbe

Раньше это было штатной возможностью LLVM.
Re[7]: Про LLVM и IR
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.08.24 20:02
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Вот по этой причине он и не является ассемблером — а ближе к C языку. Те же указатели там есть, циклы, функции, структуры.


В ассемблерах макросами даже ооп почти полноценное делается, не то что функции, циклы или структуры
Re[5]: Про LLVM и IR
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 28.08.24 15:31
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>>>Ну нет, это именно Си-подобный язык, с чуть более формальным синтаксисом.

Pzz>>Он семантически ассемблер, а не Си.

S>Это с чего вы взяли то? Ассемблер работает напрямую с регистрами — а в IR — этого нет.


Ассемблер, условно — это язык самого вычислителя, в форме пригодной для чтения человеком.
Какой этот вычислитель, абстрактный, конкретный, хардварный или софтварный — дело десятое.
Например, стековая машина, регистровая машина, итд — все имеют свой собственный ассемблер.
Строго говоря, ассемблер вовсе не обязан транслировать инструкции в код конкретного хардварного процессора.
Ассемблер вполне себе может транслировать и в байт-код, который потом будет съеден JIT.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.