Size: a a a

Compiler Development

2021 February 06

LA

Liber Azerate in Compiler Development
Vartan RedMan
есть кто знает как внедрить в функцию вызов функции printf через llvm?
пытаюсь сделать через getOrInsertFunction() используя ModulePass но не получается
Просто создать функцию и вызвать, в чём проблема? llvm::Function::Create
источник

VR

Vartan RedMan in Compiler Development
я просто не понимаю что за параметры нужно передавать функции Create (сорян ещё новичок)
источник

LA

Liber Azerate in Compiler Development
Vartan RedMan
я просто не понимаю что за параметры нужно передавать функции Create (сорян ещё новичок)
Тип функции, linkage, название и модуль, в котором она создаётся. Я тоже новичок :)
источник

LA

Liber Azerate in Compiler Development
Vartan RedMan
есть кто знает как внедрить в функцию вызов функции printf через llvm?
пытаюсь сделать через getOrInsertFunction() используя ModulePass но не получается
Собственно, если что, задача выглядит несколько странной. Pass внедрять функцию в модуль не должен
источник

VR

Vartan RedMan in Compiler Development
Задача в том,чтобы зайти в каждую функцию в файле и написать из неё "Hello from <function name>"
источник

VR

Vartan RedMan in Compiler Development
Для этого нужно как-то внедрить printf туда
источник

LA

Liber Azerate in Compiler Development
Vartan RedMan
Для этого нужно как-то внедрить printf туда
Нет, не нужно. Во-первых, никто не мешает использовать printf напрямую. Во-вторых, у llvm есть свои средства для вывода
источник

VR

Vartan RedMan in Compiler Development
Я просто читал что через IrBuilder можно как-то внедрять функции, а напрямую текст печатать наверное было бы слишком просто
источник

LA

Liber Azerate in Compiler Development
Vartan RedMan
Я просто читал что через IrBuilder можно как-то внедрять функции, а напрямую текст печатать наверное было бы слишком просто
Pass – это не о внедрении функций, а о трансформациях над готовым IR. Если IRBuilder, то так, как я сказал ранее
источник

VR

Vartan RedMan in Compiler Development
А IRBuilder для чего если не для трансформации?
источник

LA

Liber Azerate in Compiler Development
Vartan RedMan
А IRBuilder для чего если не для трансформации?
IRBuilder, кхем, собственно из названия понятно – для построения IR. Над которым уже дальше проходят пассы
источник

LA

Liber Azerate in Compiler Development
Короче говоря, попытка внедрить в модуль printf, чтобы распечатать функции в модуле... Вы путаете мокрое с мягким, или как там. Просто наследуетесь от FunctionPass, переопределяете runOnFunction и выполняете в нём соответствующие операции
источник

VR

Vartan RedMan in Compiler Development
Скорее я что-то не до конца понял, спасибо))
источник
2021 February 07

DP

Dmitry Ponyatov in Compiler Development
MrSmith
Тогда думаю секунды будут
инкрементная компиляция, с поддержкой IDE — поредактировал функцию, она в очередь на компиляцию в background поставилась.
часть проблем со скоростью компиляции снимется — актуально особенно для Scala (перестал рассматривать как применимый язык после первого же HelloWorld)
источник

M

MrSmith in Compiler Development
Да на самом деле самый верный вариант, забываем про парсинг и работаем только с памятью
источник

NK

ID:0 in Compiler Development
На Хабре несколько дней назад появилась  статья, популярно поясняющая знаменитую технику реализации языка Scheme - Cheney on the M.T.A. Статья излагает историю названия и объясняет работу остроумного подхода к сборке мусора.

Исходный код Scheme здесь сначала должен быть преобразован в представление с продолжениями (см., например, книгу Compiling with Continuations). Функции этого представления один к одному компилируются в функции на языке C. Многочисленные временные значения, характерные для Scheme, сначала размещаются на стеке вызовов C. Во время работы программы стек вызовов функций C будет расти, так как при компиляции с продолжениями функции не возвращаются к точке исходного вызова.

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

Техника сильно упрощает компиляцию Scheme в C (например, рекурсивные вызовы и их оптимизацию, легко выражаются продолжения), из-за чего ее используют минимум два популярных компилятора: Cyclone и Chicken.

Статья на Хабре: https://habr.com/ru/company/ruvds/blog/540502/

Подробности реализации техники от разработчика Chicken Scheme:
https://www.more-magic.net/posts/internals-gc.html

Реализация Cyclone: https://justinethier.github.io/cyclone/docs/Garbage-Collector

Оригинальная публикация по Cheney on the MTA: http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=3A988CF024FE807165D1CFA957445BC8?doi=10.1.1.54.7143&rep=rep1&type=pdf

Алгоритм сборки мусора Чейни: https://people.cs.umass.edu/~emery/classes/cmpsci691s-fall2004/papers/p677-cheney.pdf

Компиляторы, использующий другие подходы к компиляции в язык C:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.50.8424&rep=rep1&type=pdf - Bigloo - компилятор Scheme и Standard ML

https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.48.8788&rep=rep1&type=pdf - Gambit - компилятор Scheme

#garbagecollection #scheme
источник

K

Kakadu in Compiler Development
ID:0
На Хабре несколько дней назад появилась  статья, популярно поясняющая знаменитую технику реализации языка Scheme - Cheney on the M.T.A. Статья излагает историю названия и объясняет работу остроумного подхода к сборке мусора.

Исходный код Scheme здесь сначала должен быть преобразован в представление с продолжениями (см., например, книгу Compiling with Continuations). Функции этого представления один к одному компилируются в функции на языке C. Многочисленные временные значения, характерные для Scheme, сначала размещаются на стеке вызовов C. Во время работы программы стек вызовов функций C будет расти, так как при компиляции с продолжениями функции не возвращаются к точке исходного вызова.

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

Техника сильно упрощает компиляцию Scheme в C (например, рекурсивные вызовы и их оптимизацию, легко выражаются продолжения), из-за чего ее используют минимум два популярных компилятора: Cyclone и Chicken.

Статья на Хабре: https://habr.com/ru/company/ruvds/blog/540502/

Подробности реализации техники от разработчика Chicken Scheme:
https://www.more-magic.net/posts/internals-gc.html

Реализация Cyclone: https://justinethier.github.io/cyclone/docs/Garbage-Collector

Оригинальная публикация по Cheney on the MTA: http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=3A988CF024FE807165D1CFA957445BC8?doi=10.1.1.54.7143&rep=rep1&type=pdf

Алгоритм сборки мусора Чейни: https://people.cs.umass.edu/~emery/classes/cmpsci691s-fall2004/papers/p677-cheney.pdf

Компиляторы, использующий другие подходы к компиляции в язык C:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.50.8424&rep=rep1&type=pdf - Bigloo - компилятор Scheme и Standard ML

https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.48.8788&rep=rep1&type=pdf - Gambit - компилятор Scheme

#garbagecollection #scheme
А как с производительностью у этих компилируемых в Си схем по сравнению с Chez и Racket?
источник

VK

Vladimir Kazanov in Compiler Development
Kakadu
А как с производительностью у этих компилируемых в Си схем по сравнению с Chez и Racket?
Если верить популярному сравнению, то у Cyclone все с этим неплохо.
источник

VK

Vladimir Kazanov in Compiler Development
Хотя, конечно, зрелые компиляторы Chez (и портированный на него Racket)  и Gambit все же быстрей
источник
2021 February 08

ДК

Дмитрий К in Compiler Development
ID:0
На Хабре несколько дней назад появилась  статья, популярно поясняющая знаменитую технику реализации языка Scheme - Cheney on the M.T.A. Статья излагает историю названия и объясняет работу остроумного подхода к сборке мусора.

Исходный код Scheme здесь сначала должен быть преобразован в представление с продолжениями (см., например, книгу Compiling with Continuations). Функции этого представления один к одному компилируются в функции на языке C. Многочисленные временные значения, характерные для Scheme, сначала размещаются на стеке вызовов C. Во время работы программы стек вызовов функций C будет расти, так как при компиляции с продолжениями функции не возвращаются к точке исходного вызова.

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

Техника сильно упрощает компиляцию Scheme в C (например, рекурсивные вызовы и их оптимизацию, легко выражаются продолжения), из-за чего ее используют минимум два популярных компилятора: Cyclone и Chicken.

Статья на Хабре: https://habr.com/ru/company/ruvds/blog/540502/

Подробности реализации техники от разработчика Chicken Scheme:
https://www.more-magic.net/posts/internals-gc.html

Реализация Cyclone: https://justinethier.github.io/cyclone/docs/Garbage-Collector

Оригинальная публикация по Cheney on the MTA: http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=3A988CF024FE807165D1CFA957445BC8?doi=10.1.1.54.7143&rep=rep1&type=pdf

Алгоритм сборки мусора Чейни: https://people.cs.umass.edu/~emery/classes/cmpsci691s-fall2004/papers/p677-cheney.pdf

Компиляторы, использующий другие подходы к компиляции в язык C:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.50.8424&rep=rep1&type=pdf - Bigloo - компилятор Scheme и Standard ML

https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.48.8788&rep=rep1&type=pdf - Gambit - компилятор Scheme

#garbagecollection #scheme
Звучит как лютейший костыль.
источник