Budowa jedności
W inżynierii oprogramowania kompilacja jednostkowa (znana również jako kompilacja ujednolicona lub kompilacja jumbo ) to metoda stosowana w tworzeniu oprogramowania w językach C i C++ w celu przyspieszenia kompilacji projektów poprzez połączenie wielu jednostek tłumaczeniowych w jedną, zwykle osiąganą za pomocą dyrektyw włączających aby połączyć wiele plików źródłowych w jeden większy plik.
Realizacja
Jeśli dwie różne jednostki tłumaczeniowe file_a.cc
#include "header.h" // zawartość pliku źródłowego A...
i plik_b.cc
#include "header.h" // zawartość pliku źródłowego B...
w tym samym projekcie oba zawierają nagłówek header.h
, nagłówek ten będzie przetwarzany dwukrotnie przez łańcuch kompilatora, raz dla każdego zadania kompilacji. Jeśli dwie jednostki tłumaczeniowe zostaną połączone w jeden plik źródłowy jumbo_file.cc
#include „plik_a.cc” #include „plik_b.cc”
wtedy plik header.h
zostanie przetworzony tylko raz (dzięki dodaniu strażników ) podczas kompilacji jumbo_file.cc
.
Efekty
Główną zaletą kompilacji Unity jest ograniczenie podwójnego wysiłku związanego z analizowaniem i kompilowaniem zawartości nagłówków zawartych w więcej niż jednym pliku źródłowym. Zawartość nagłówków zwykle stanowi większość kodu w pliku źródłowym po wstępnym przetworzeniu . Kompilacje Unity zmniejszają również obciążenie wynikające z dużej liczby małych plików źródłowych, zmniejszając liczbę plików obiektowych tworzonych i przetwarzanych przez łańcuch kompilacji, a także umożliwiają międzyproceduralną analizę i optymalizację plików tworzących zadanie kompilacji Unity (podobnie jak w przypadku kompilacji Unity efekty optymalizacji czasu łącza ). Ułatwiają także wykrycie naruszeń Reguły jednej definicji , ponieważ jeśli symbol zostanie zdefiniowany dwukrotnie w różnych plikach źródłowych w tej samej kompilacji Unity, kompilator będzie w stanie zidentyfikować redefinicję i wyemitować ostrzeżenie lub błąd.
Jedną z wad kompilacji Unity jest większe zużycie pamięci ze względu na większe jednostki tłumaczeniowe. Większe jednostki tłumaczeniowe mogą również negatywnie wpływać na kompilacje równoległe, ponieważ niewielka liczba dużych zadań kompilacji jest zazwyczaj trudniejsza lub niemożliwa do zaplanowania w celu efektywnego nasycenia wszystkich dostępnych zasobów obliczeń równoległych. Kompilacje Unity mogą również pozbawić części zalet kompilacji przyrostowych, które polegają na przebudowie jak najmniejszej ilości kodu, tj. tylko jednostek tłumaczeniowych, na które miały wpływ zmiany od czasu ostatniej kompilacji.
Kompilacje Unity mają również potencjalnie niebezpieczny wpływ na semantykę programów. Niektóre prawidłowe konstrukcje C++, które opierają się na wewnętrznych połączeniach, mogą nie działać w przypadku kompilacji jedności, na przykład zderzenia symboli statycznych i symboli zdefiniowanych w anonimowych przestrzeniach nazw z tym samym identyfikatorem w różnych plikach. Jeśli różne pliki C++ definiują różne funkcje o tej samej nazwie, kompilator może nieoczekiwanie rozwiązać problem przeciążenia , wybierając niewłaściwą funkcję, w sposób, który nie był możliwy przy projektowaniu oprogramowania z plikami jako różnymi jednostkami tłumaczeniowymi. Kolejnym niekorzystnym skutkiem jest możliwy wyciek makro definicje w różnych plikach źródłowych.
Zbuduj wsparcie systemu
Niektóre systemy kompilacji zapewniają wbudowaną obsługę zautomatyzowanych kompilacji jedności, w tym Visual Studio , Meson i CMake .
- Bibliografia _ (2019)
- ^ Kiriłow, Wiktor (7 lipca 2018). „Przewodnik po budowaniu jedności” . Zarchiwizowane od oryginału w dniu 2020-11-12.
- ^ Olga Arkhipova (2 lipca 2018). „Obsługa plików Unity (Jumbo) w programie Visual Studio 2017 15.8 (eksperymentalnie)” . Microsoftu.
- ^ „Jedność buduje” .
- ^ „UNITY_BUILD — dokumentacja CMake 3.17.0” .
- Kubota, Takafumi; Yusuke, Suzuki; oraz Kenji Kono (2019). Ujednolicać czy nie ujednolicać: studium przypadku dotyczące ujednoliconych kompilacji (w WebKit) . Materiały z 28. Międzynarodowej Konferencji na temat budowy kompilatorów. doi : 10.1145/3302516.3307347 .