Jedna rzecz, której naprawdę nie rozumiem, to funkcja clang, jeśli clang jest przednim końcem kompilatora, powinien po prostu wykonać pracę parsera dla kodu źródłowego, pozostała praca zostanie wykonana przez LLVM. Ale clang może również produkować plik wykonywalny. Jak to zrozumieć? Jaka jest relacja między klangiem a llvm?Jeśli clang jest przednim końcem kompilatora, to dlaczego może wytworzyć plik wykonywalny?
Odpowiedz
Jeśli jesteś bardzo konkretny: plik wykonywalny clang jest sterownikiem kompilatora. Wywołuje wszystkie części potrzebne do utworzenia pliku wykonywalnego. Wywołuje libclang, który wykonuje zadania front-end: parser/lexer, analizę semantyczną, budowanie AST i generowanie kodu. Kiedy AST jest obniżony do LLVM IR, zadania frontowe są wykonywane, a optymalizator i LLVM kopie. Po optmizowaniu kodu sterownik kompilatora wywoła back-end LLVM określony przez cel, a na końcu linker, który buduje plik wykonywalny. I dlatego sterownik kompilatora clang może budować pliki wykonywalne.
LLVM to kompilator, który został napisany przed klangiem, który pierwotnie używał przedniego końca gcc w narzędziu o nazwie "llvm-gcc". Clang to nazwa kodu front-end, ale clang to również nazwa narzędzia, które zawiera front-clang, ale także uruchomi dla ciebie całą kompilację. Późniejsze fazy kompilacji są wbudowane w narzędzie clang jako biblioteki, lub jeśli są oddzielnymi plikami wykonywalnymi, clang wie, jak je wywoływać. Z odpowiednimi argumentami wiersza polecenia, można dokonać zatrzymania dzyń część sposób thru
- -emit-ast po prostu robi to parse i sprawia Abstract Syntax drzewo
- sprawia LLVM Intermediate Representation -emit-LLVM, lecz nie zamień go na kod dla twojego komputera
Clang będzie działać jako sterownik dla całej kompilacji, ponieważ tego właśnie programiści zwykle chcą, skompresowany, wygenerowany obiekt, wykonany plik wykonywalny. Pragnienie, aby abstrakcyjne drzewo składniowe pluło do ciebie, jest dość rzadkie.
Oczywiście to jest sos dla wszystkich rzeczą LLVM http://llvm.org
Oto film z Chriss Lattner explaing co LLVM jest https://www.youtube.com/watch?v=029YXzHtRy0. Chandler Carruth ma kilka vids na temat wyjaśnienia części klangów, nad którymi pracował.
Istnieją 3 znaczenia Clang:
- Czołowy (libclang)
- Kompilator kierowca (dzyń wykonywalny)
- tradycyjny kompilator. Obejmuje to nie tylko front-end, ale także szeroko wykorzystuje middle-end i back-end, a nawet zintegrowany asembler, aby zakończyć etap kompilacji. (sterownik składa się głównie z kompilacji i łącza)
Jaka jest różnica między LLVM IR i LLVM? – storen
LLVM IR jest reprezentacją pośrednią, która produkuje front-end i przekształca back-end do odrębnego ISA. LLVM to tylko nazwa projektu. –