Brzęk - Clang

Szczęk
Nowe logo LLVM.png
Informacje o wersji Clang 12.0.1 screenshot.png
Brzęk 12.0.1
Pierwotny autor (autorzy) Chris Lattner
Deweloper(zy) Grupa programistów LLVM
Pierwsze wydanie 26 września 2007 ; 14 lat temu ( 2007-09-26 )
Wersja stabilna
13.0.0 / 4 października 2021 ; 12 dni temu ( 2021-10-04 )
Wersja zapoznawcza
13.0.0-rc2 / 27 sierpnia 2021 ; 50 dni temu ( 2021-08-27 )
Magazyn
Napisane w C++
System operacyjny Uniksopodobny
Platforma AArch64 , ARMv7 , IA-32 , x86-64 , ppc64le
Rodzaj Fronton kompilatora
Licencja Apache License 2.0 z wyjątkami LLVM
Strona internetowa clang .llvm .org

Clang / k l ć ŋ / jest Zaczepy kompilator do C , C ++ , Objective-C i Objective-C ++ języków programowania , jak również OpenMP , OpenCL , RenderScript , CUDA oraz HIP ram. Działa jako zamiennik dla GNU Compiler Collection (GCC), obsługując większość jego flag kompilacji i nieoficjalnych rozszerzeń językowych. Zawiera statyczny analizator i kilka narzędzi do analizy kodu.

Clang działa w tandemie z zapleczem kompilatora LLVM i był podprojektem LLVM 2.6 i nowszych. Podobnie jak w przypadku LLVM, jest to bezpłatne oprogramowanie o otwartym kodzie źródłowym na licencji oprogramowania Apache License 2.0 . Jego współtwórcami są Apple , Microsoft , Google , ARM , Sony , Intel i AMD .

Clang 12, najnowsza główna wersja Clang z kwietnia 2021 r., ma pełne wsparcie dla wszystkich opublikowanych standardów C++ aż do C++17 , implementuje większość funkcji C++20 i dodaje wstępne wsparcie dla nadchodzącego standardu C++23 . Od wersji 6.0.0 Clang domyślnie kompiluje C++ używając dialektu GNU++14, który zawiera funkcje ze standardu C++14 i zgodne z GNU rozszerzenia.

Tło

Począwszy od 2005 roku firma Apple Inc. zaczęła intensywnie wykorzystywać LLVM w kilku produktach komercyjnych, w tym w iOS SDK i Xcode 3.1. Jednym z pierwszych zastosowań LLVM był kompilator kodu OpenGL dla OS X, który konwertuje wywołania OpenGL na bardziej podstawowe wywołania procesorów graficznych (GPU), które nie obsługują niektórych funkcji. Umożliwiło to Apple obsługę OpenGL na komputerach korzystających z chipsetów Intel GMA , zwiększając wydajność na tych komputerach.

Projekt LLVM pierwotnie miał na celu użycie interfejsu GCC . Kod źródłowy GCC jest jednak obszerny i nieco nieporęczny; jak ujął to jeden z wieloletnich programistów GCC, odnosząc się do LLVM: „Próba wykonania tańca hipopotama nie jest zbyt zabawna”. Poza tym oprogramowanie Apple używa Objective-C , co jest niskim priorytetem dla programistów GCC. W związku z tym GCC nie integruje się płynnie ze zintegrowanym środowiskiem programistycznym (IDE) firmy Apple . Wreszcie umowa licencyjna GCC, GNU General Public License (GPL) w wersji 3 , wymaga od deweloperów, którzy rozpowszechniają rozszerzenia lub zmodyfikowane wersje GCC, udostępnienia swojego kodu źródłowego , ale liberalna licencja na oprogramowanie LLVM jest pozbawiona takiej przeszkody.

Ostatecznie Apple zdecydowało się opracować Clang, nowy interfejs kompilatora, który obsługuje C, Objective-C i C++. W lipcu 2007 roku projekt otrzymał zgodę na przejście na oprogramowanie open source.

Projekt

Clang działa w parze z LLVM. Kombinacja Clang i LLVM zapewnia większość narzędzi do wymiany stosu GCC . Jednym z głównych celów Clang jest zapewnienie architektury opartej na bibliotekach, tak aby kompilator mógł współpracować z innymi narzędziami, które współdziałają z kodem źródłowym, takimi jak zintegrowane środowiska programistyczne (IDE). W przeciwieństwie do tego, GCC działa w compile- linku - debugowania obieg; integracja z innymi narzędziami nie zawsze jest łatwa. Na przykład GCC używa kroku zwanego fold, który jest kluczem do całego procesu kompilacji, co ma efekt uboczny tłumaczenia drzewa kodu na formę, która wygląda inaczej niż oryginalny kod źródłowy. Jeśli błąd zostanie znaleziony podczas lub po kroku składania, może być trudno przetłumaczyć go z powrotem do jednej lokalizacji w oryginalnym źródle. Poza tym dostawcy korzystający ze stosu GCC w IDE muszą używać oddzielnych narzędzi do indeksowania kodu, aby zapewnić funkcje takie jak podświetlanie składni i inteligentne uzupełnianie kodu .

Clang zachowuje więcej informacji podczas procesu kompilacji niż GCC i zachowuje ogólną formę oryginalnego kodu, ułatwiając mapowanie błędów z powrotem do oryginalnego źródła. Raporty o błędach Clang są bardziej szczegółowe, szczegółowe i czytelne dla komputera, więc IDE mogą indeksować dane wyjściowe kompilatora. Modułowa konstrukcja kompilatora może oferować indeksowanie kodu źródłowego, sprawdzanie składni i inne funkcje zwykle związane z systemami szybkiego tworzenia aplikacji . Parse drzewo jest bardziej nadaje się do wspierania zautomatyzowane kodu refaktoryzacji , gdyż bezpośrednio reprezentuje oryginalny kod źródłowy.

Clang kompiluje tylko języki podobne do C, takie jak C, C++, Objective-C i Objective-C++. W wielu przypadkach Clang może w razie potrzeby zastąpić GCC, bez żadnych innych skutków dla całego toolchaina. Obsługuje większość powszechnie używanych opcji GCC. Projekt Flang autorstwa Nvidii i The Portland Group dodaje obsługę Fortran . Jednak w przypadku innych języków, takich jak Ada , LLVM pozostaje zależny od GCC lub innego interfejsu kompilatora.

Wydajność i kompatybilność z GCC

Clang jest kompatybilny z GCC. Jego interfejs wiersza poleceń współdzieli wiele flag i opcji GCC . Clang implementuje wiele rozszerzeń języka GNU i elementów wewnętrznych kompilatora, z których niektóre służą wyłącznie kompatybilności. Na przykład, mimo że Clang implementuje wewnętrzne struktury atomowe, które dokładnie odpowiadają C11 atomics , implementuje również __sync_*wewnętrzne elementy GCC w celu zapewnienia zgodności z GCC i libstdc++ . Clang utrzymuje również zgodność ABI z kodem wynikowym generowanym przez GCC . W praktyce Clang jest bezpośrednim zamiennikiem GCC.

Twórcy Clanga dążą do zmniejszenia zużycia pamięci i zwiększenia szybkości kompilacji w porównaniu z konkurencyjnymi kompilatorami, takimi jak GCC. W październiku 2007 donoszą, że Clang skompilował biblioteki Carbon ponad dwa razy szybciej niż GCC, używając około jednej szóstej pamięci i miejsca na dysku GCC. Wydaje się, że do roku 2011 Clang zachowa tę przewagę w wydajności kompilatora. Od połowy 2014 r. Clang wciąż konsekwentnie kompiluje się szybciej niż GCC w mieszanym teście porównawczym czasu kompilacji i wydajności programu. Jednak do 2019 r. Clang jest znacznie wolniejszy w kompilowaniu jądra Linuksa niż GCC, pozostając jednocześnie nieco szybszym w kompilowaniu LLVM.

Chociaż Clang był historycznie szybszy niż GCC podczas kompilacji, jakość wyjściowa pozostawała w tyle. Od 2014 r. wydajność programów skompilowanych przez Clang pozostawała w tyle za wydajnością programu skompilowanego przez GCC, czasami przez duże czynniki (do 5,5x), replikując wcześniejsze raporty o wolniejszej wydajności. Od tego czasu oba kompilatory ewoluowały, aby zwiększyć swoją wydajność, zmniejszając lukę:

  • Porównania z listopada 2016 r. między GCC 4.8.2 a clang 3.4 na dużej ilości plików testowych pokazują, że GCC przewyższa clang o około 17% na dobrze zoptymalizowanym kodzie źródłowym. Wyniki testów są specyficzne dla kodu, a niezoptymalizowany kod źródłowy C może odwrócić takie różnice. Oba kompilatory wydają się zatem zasadniczo porównywalne.
  • Porównania w 2019 r. na Intel Ice Lake wykazały, że programy wygenerowane przez Clang 10 osiągnęły 96% wydajności GCC 10 w 41 różnych testach porównawczych (wygrywając 22 i przegrywając 19 z nich).

W 2021 r. przeprowadzono test porównawczy, aby porównać wydajność LLVM 2.7 z LLVM 11 i czasy kompilacji. Wniosek był taki, że LLVM 11 zwykle zajmuje 2 razy dłużej kompilowanie kodu z optymalizacjami, w wyniku czego kod działa o 10-20% szybciej (z sporadycznymi wartościami odstającymi w obie strony), w porównaniu z LLVM 2.7, który ma ponad 10 lat.

Historia statusu

Ta tabela przedstawia tylko znaczące kroki i wydania w historii Clang.

Data Najważniejsze
11 lipca 2007 r. Frontend Clang wydany na licencji open-source
25 lutego 2009 Clang/LLVM może skompilować działające jądro FreeBSD .
16 marca 2009 Clang/LLVM może skompilować działające jądro DragonFly BSD .
23 października 2009 Wydano Clang 1.0, po raz pierwszy z LLVM 2.6.
grudzień 2009 Generowanie kodu dla C i Objective-C osiąga jakość produkcji. Wsparcie dla C++ i Objective-C++ wciąż niekompletne. Clang C++ potrafi parsować GCC 4.2 libstdc++ i generować działający kod dla nietrywialnych programów, a także może się kompilować.
2 lutego 2010 Clang self-hosting .
20 maja 2010 Najnowsza wersja Clang z powodzeniem zbudowała biblioteki Boost C++ i przeszła prawie wszystkie testy.
10 czerwca 2010 Clang/LLVM staje się integralną częścią FreeBSD , ale domyślnym kompilatorem jest nadal GCC.
25 października 2010 Clang/LLVM może skompilować działające zmodyfikowane jądro Linuksa .
Styczeń 2011 Zakończono wstępne prace nad wsparciem projektu standardu C++0x , z kilkoma nowymi funkcjami projektu obsługiwanych w wersji rozwojowej Clang.
10 lutego 2011 Clang może skompilować działającą wirtualną maszynę HotSpot Java .
19 stycznia 2012 Clang staje się opcjonalnym komponentem w wieloplatformowym systemie budowania NetBSD , ale GCC jest nadal domyślnym.
29 lutego 2012 Clang 3.0 może odbudować 91,2% archiwum Debiana .
29 lutego 2012 Clang staje się domyślnym kompilatorem w MINIX 3
12 maja 2012 Clang/LLVM ogłosił, że zastąpi GCC we FreeBSD .
5 listopada 2012 Clang staje się domyślnym kompilatorem we FreeBSD 10.x na amd64/i386.
18 lutego 2013 Clang/LLVM może skompilować działające zmodyfikowane jądro systemu Android Linux dla Nexusa 7 .
19 kwietnia 2013 Clang jest kompletną funkcją C++11 .
6 listopada 2013 Clang jest kompletną funkcją C++14 .
11 września 2014 Clang 3.5 może odbudować 94,3% archiwum Debiana. Od stycznia 2013 r. odsetek awarii spadł o 1,2% na wydanie, głównie ze względu na zwiększoną zgodność z flagami GCC.
Październik 2016 Clang staje się domyślnym kompilatorem dla Androida (a później tylko kompilatorem obsługiwanym przez Android NDK ).
13 marca 2017 Wydano Clang 4.0.0
26 lipca 2017 Clang staje się domyślnym kompilatorem w OpenBSD 6.2 na amd64/i386.
7 września 2017 Wydano Clang 5.0.0
19 stycznia 2018 Clang staje się domyślnym kompilatorem w OpenBSD 6.3 na ramieniu.
5 marca 2018 Clang jest teraz używany do tworzenia przeglądarki Google Chrome dla systemu Windows.
8 marca 2018 Wydano Clang 6.0.0
5 września 2018 Clang jest teraz używany do tworzenia Firefoksa dla Windows.
19 września 2018 Dzyń 7.0.0 wydany
20 marca 2019 Wydano Clang 8.0.0
1 lipca 2019 Clang staje się domyślnym kompilatorem w OpenBSD 6.6 na mips64.
19 września 2019 Clang 9.0.0 wydany z oficjalną obsługą celów RISC-V .
29 lutego 2020 Clang staje się jedynym kompilatorem C w podstawowym systemie FreeBSD , po usunięciu GCC .
24 marca 2020 Wydano Clang 10.0.0
2 kwietnia 2020 Clang staje się domyślnym kompilatorem w OpenBSD 6.7 na powerpc.
12 października 2020 Dzyń 11.0.0 wydany
21 grudnia 2020 Clang staje się domyślnym kompilatorem w OpenBSD 6.9 na mips64el.
14 kwietnia 2021 Dzyń 12.0.0 wydany

Zobacz też

Bibliografia

Zewnętrzne linki