Do pisania kompilatora, jakie są zalety i wady stosowania LLVM IR vs C dla języka docelowego? Wiem, że oba są używane, i wyobrażam sobie, że ostateczny kod maszynowy byłby podobny, gdybym użył klanga do kompilacji C. Więc jakie są inne rzeczy do rozważenia?Język kompilacji - LLVM IR kontra C
Odpowiedz
Użyłem LLVM IR dla kilku kompilatora powrotem końcach i pracował z kompilatory, które używają C jako back-end. Jedną z rzeczy, które znalazłem, która daje LLVM IR przewagę, jest to, że jest wpisane. Trudno jest całkowicie źle sformułować dane wyjściowe bez pobierania błędów z bibliotek LLVM.
Łatwiej jest również, aby utrzymać ścisłą korelację pomiędzy kodem źródłowym i IR do debugowania, moim zdaniem.
Plus, można uzyskać wszystkie fajne narzędzia wiersza poleceń LLVM analizować i przetwarzać IR emituje swoją front-end.
i architektury systemów operacyjnych, dla których nie ma szczęk oczywiście, lub które znajduje się w stanie doświadczalnej.
C jest bardziej powszechnie akceptowane, ale LLVM IR pozwala łyżka silnik LLVM paszy. Nie wszystkie ścieżki do IR są równe.
wątpię można wdrożyć właściwą obsługę debugowania dla języka podczas kierowania C.
To był dokładnie powód, dla którego szukam tego wątku. Nie widzę możliwości "map źródłowych" symboli debugowania, ponieważ są niekompatybilne wstecz zmiany w generatorze symboli debugowania kompilatorów C. Przy każdej zmianie obsługiwanych kompilatorów języka C należy zaktualizować oprogramowanie odwzorowujące symbole debugowania. –
zalety LLVM:
- JIT - można skompilować i uruchomić kod dynamicznie. Oczywiście to samo jest możliwe w przypadku C (np. Przy użyciu wbudowanego
tcc
), ale jest to znacznie mniej niezawodna i przenośna opcja. - Możesz uruchomić własne przejścia optymalizacyjne nad wygenerowanym IR.
- Odbicie za darmo - kontrola wygenerowanego kodu jest znacznie łatwiejsza w LLVM.
- Biblioteka LLVM nie jest tak duża jak większość kompilatorów języka C (oczywiście nie licząc
tcc
).
LLVM wady:
- kod nie jest przenośny, trzeba zmienić go nieznacznie w zależności od celu. Istnieje pewien przenośny podzbiór LLVM, ale wciąż jest to dość ryzykowna praktyka.
- Zależność czasu wykonywania na bibliotekach C++ może być problemem.
zapomniałeś: jeśli chcesz interakcji C (który język nie?) Musisz zakodować wszystkie te nieprzyjemne ABI ABI, ponieważ llvm sam tego nie robi (rozdziela tę pracę 50/50 z klangiem) – cap
Co masz na myśli IR jest wpisany? Czy C również nie jest napisane? – Dan
Prawo, C jest wpisane. Ale nie dostaniesz wskazania błędu, dopóki nie spróbujesz skompilować kodu C. Dzięki LLVM IR otrzymujesz wskazanie błędu podczas generowania IR. Znacznie łatwiej jest debugować. –