2012-04-22 16 views
8

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

7

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.

+1

Co masz na myśli IR jest wpisany? Czy C również nie jest napisane? – Dan

+3

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ć. –

0

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.

1

wątpię można wdrożyć właściwą obsługę debugowania dla języka podczas kierowania C.

+0

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. –

2

zalety LLVM:

  1. 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.
  2. Możesz uruchomić własne przejścia optymalizacyjne nad wygenerowanym IR.
  3. Odbicie za darmo - kontrola wygenerowanego kodu jest znacznie łatwiejsza w LLVM.
  4. Biblioteka LLVM nie jest tak duża jak większość kompilatorów języka C (oczywiście nie licząc tcc).

LLVM wady:

  1. 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.
  2. Zależność czasu wykonywania na bibliotekach C++ może być problemem.
+0

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

Powiązane problemy