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
- 1. Jak zrobić clang kompilacji do llvm IR
- 2. Zrozumienie najprostszy llvm IR
- 3. Debugowanie LLVM IR
- 4. Jak przekonwertować llvm IR na kod c?
- 5. Dokumentacja kodu LLVM IR opcode
- 6. Język kompilacji do C
- 7. Czy istnieje debugger dla LLVM IR?
- 8. Dump IR po każdej optymalizacji LLVM (każdy towarzysza), obie przełęcze LLVM IR i backend debugowania
- 9. Call vs Invoke w kodach IR LLVM
- 10. Parsowanie i modyfikowanie kodu LLVM IR
- 11. Jak emitować LLVM-IR z Cargo
- 12. Czy można przetłumaczyć język asemblera na LLVM IR, zoptymalizować go, a następnie przekompilować do innej architektury?
- 13. SpecFlow vs Cuke4Nuke kontra Ogórek + IR
- 14. Dostęp do członków struct i tablice kodowanym z LLVM IR
- 15. Język dla kompilatora opartego na LLVM
- 16. Jak przekazać Xcode do emisji IR (LLVM Bitcode) dla Swifta?
- 17. Jak uzyskać wartość literału ciągu w LLVM IR?
- 18. Co to jest LLVM C++ API?
- 19. Generowanie kodu binarnego (biblioteki współdzielonej) z osadzonego LLVM w C++
- 20. Tworzenie backendu VHDL dla LLVM?
- 21. Wywołanie LLVM Jit z programu c
- 22. Jak znaleźć wskaźniki funkcji dla testów z kodu LLVM IR programu Rust?
- 23. nakładka na kompilator oparty na LLVM
- 24. Blastowa platforma LLVM
- 25. Język skryptowy dla C/C++?
- 26. Błąd krytyczny podczas kompilacji LLVM/szczęk - 'cstddef' file not found
- 27. jak korzystać z llvm + clang do kompilacji dla stm32
- 28. Język C: znaczenie operatora "#"?
- 29. LLVM Struct Powrót Optymalizacja
- 30. Czy istnieje język programowania oparty na LLVM, który może zagwarantować szybkie pliki binarne bezpieczne dla piaskownicy?
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ć. –