Вот есть LLVM, который умеет генерить IR. И по сути этот IR мало чем отличается от языка C, только менее удобен для чтения человеком, но чуть более удобен для парсинга. В нем даже указатели и структуры есть.
Вопрос такой — не разумнее бы было генерить голый C (пусть даже сокращенную его версию) вместо IR?
Здравствуйте, Shmj, Вы писали:
S>Вот есть LLVM, который умеет генерить IR. И по сути этот IR мало чем отличается от языка C, только менее удобен для чтения человеком, но чуть более удобен для парсинга. В нем даже указатели и структуры есть.
S>Вопрос такой — не разумнее бы было генерить голый C (пусть даже сокращенную его версию) вместо IR?
S>>>Ну там же пример есть — llc — одна из тулуз LLVM. M>>Для компиляции С используй clang/gcc
S>Ваш вопрос был — зачем парсить IR. И мой ответ — хотя бы для того, чтобы из IR сделать ассемблерный код.
Ну,
чтобы тоже самое получить из С используй clang/gcc.
Здравствуйте, Muxa, Вы писали:
S>>Ваш вопрос был — зачем парсить IR. И мой ответ — хотя бы для того, чтобы из IR сделать ассемблерный код.
M>Ну, M>чтобы тоже самое получить из С используй clang/gcc.
M>Чего не хватает?
Здравствуйте, Shmj, Вы писали:
S>Вопрос такой — не разумнее бы было генерить голый C (пусть даже сокращенную его версию) вместо IR?
Не вполне понимаю смысл вашего вопроса.
Весь смысл LLVM — именно в IR. IR позволяет реализовывать широкий класс оптимизаций независимым от исходного языка образом.
Можете считать его "сокращённой версией голого C".
Вы же читали, собственно, вводную статью инициаторов проекта?
Цитирую:
The code representation is one of the key factors that differentiates LLVM from other systems. The representation is designed to provide high-level information about programs that is needed to support sophisticated analyses and transformations, while being low-level enough to represent arbitrary programs and to permit extensive optimization in static compilers.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Shmj, Вы писали: S>Но он ведь таковым не является. Если бы это была сокращенная версия C, что было бы разумно — то его можно было бы компилировать как C.
Эмм, по-прежнему непонятно, чего же вы хотите. IR можно компилировать точно так же, как С — получая на выходе бинарь для целевой платформы.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Shmj, Вы писали:
S>Но он ведь таковым не является. Если бы это была сокращенная версия C, что было бы разумно — то его можно было бы компилировать как C.
Чтобы скомпилировать как C тоже нужен какой-нибудь IR. Зачем тода нужен дополнительный промежуточный этап преобразования C++ в C если можно сразу преобразовать C++ в IR?
Здравствуйте, Sinclair, Вы писали:
S>>Но он ведь таковым не является. Если бы это была сокращенная версия C, что было бы разумно — то его можно было бы компилировать как C. S>Эмм, по-прежнему непонятно, чего же вы хотите. IR можно компилировать точно так же, как С — получая на выходе бинарь для целевой платформы.
Было бы удобнее вместо нового IR использовать упрощеный C. Его и человеку читать привычнее и для парсера от IR не слишком будет отличаться, имхо.
Здравствуйте, cserg, Вы писали:
S>>Но он ведь таковым не является. Если бы это была сокращенная версия C, что было бы разумно — то его можно было бы компилировать как C. C>Чтобы скомпилировать как C тоже нужен какой-нибудь IR.
Имхо, можно вместо IR использовать упрощенный C. Что мешает?
Здравствуйте, Shmj, Вы писали:
S>Имхо, можно вместо IR использовать упрощенный C. Что мешает?
Нет в C, тем более упрощенном, явной информации, которая нужна для оптимизации и генерации кода. Например, для каждой переменной нужно знать в каких местах программы она определяется и где используется, а для этого нужно сделать анализ потока управления и поиск псевдонимов и нужно сохранить их результаты в чем-то, из чего в конце концов получится IR.
Здравствуйте, cserg, Вы писали:
S>>Имхо, можно вместо IR использовать упрощенный C. Что мешает? C>Нет в C, тем более упрощенном, явной информации, которая нужна для оптимизации и генерации кода. Например, для каждой переменной нужно знать в каких местах программы она определяется и где используется, а для этого нужно сделать анализ потока управления и поиск псевдонимов и нужно сохранить их результаты в чем-то, из чего в конце концов получится IR.
Ну может можно какое-то подмножество C сделать, чтобы там переменные определялись только 1 раз. Оно бы было валидным с т.з. С-компилятора, удобным для прочтения человеком — и выполняло бы те же самые функции, которые выполняет IR.
Или кроме требования определять переменные единожды — еще что-то важное есть?