Fazy tłumaczenia
Programy C i C++ składają się z jednego lub więcej plików źródłowych, z których każdy zawiera część tekstu programu.Plik źródłowy, wraz z dołączonymi plikami (plikami dołączonymi za pomocą dyrektywy preprocesora #include), ale bez sekcji kodu usuniętych przez dyrektywy kompilacji warunkowej takie jak #if, nosi nazwę "jednostki tłumaczenia".
Pliki źródłowe mogą być tłumaczone w różnym czasie — w rzeczywistości bardzo często tłumaczone są tylko nieaktualne pliki.Przetłumaczone jednostki tłumaczenia mogą być przetwarzane do oddzielnych plików obiektu lub bibliotek kodu obiektu.Te oddzielne, przetłumaczone jednostki tłumaczenia są następnie łączone, aby sformułować program wykonywalny lub bibliotekę dynamicznych połączeń (DLL). Aby uzyskać więcej informacji dotyczących plików, które mogą być używane jako dane wejściowe do konsolidatora, zobacz Pliki wyjściowe LINK.
Jednostki tłumaczenia mogą komunikować się za pomocą:
Wywołań funkcji, które mają powiązania zewnętrzne.
Wywołań funkcji członkowskich klasy, które mają powiązania zewnętrzne.
Bezpośrednich modyfikacji obiektów, które mają powiązania zewnętrzne.
Bezpośrednich modyfikacji plików.
Komunikacji międzyprocesowej (tylko dla aplikacji opartych na Microsoft Windows).
Na poniższej liście opisano fazy, w których kompilator tłumaczy pliki:
Mapowanie znaków
Znaki w pliku źródłowym są mapowane do wewnętrznej reprezentacji źródła.Sekwencje trzech znaków są konwertowane na wewnętrzną reprezentację pojedynczych znaków w tej fazie.Łączenie wierszy
Wszystkie wiersze kończące się znakiem odwrotnej kreski ukośnej (\), po których bezpośrednio następuje znak nowego wiersza są przyłączane do następnego wiersza w pliku źródłowym, tworząc logiczne wiersze z wierszy fizycznych.O ile nie jest on pusty, plik źródłowy musi kończyć się znakiem nowego wiersza, który nie jest poprzedzony znakiem odwrotnej kreski ukośnej.Tokenizacja
Plik źródłowy jest dzielony na tokeny wstępnego przetwarzania i znaki spacji.Każdy komentarz w pliku źródłowym jest zamieniany na jeden znak spacji.Znaki nowego wiersza są zachowywane.Przetwarzanie wstępne
Dyrektywy preprocesora są wykonywane, a makra są rozwijane do pliku źródłowego.Instrukcja #include wywołuje tłumaczenie począwszy od powyższych trzech kroków tłumaczenia na dowolnym dołączonym tekście.Mapowanie zestawu znaków
Wszystkie elementy członkowskie zestawu znaków źródła i sekwencje unikowe są konwertowane na ich odpowiedniki w zestawie znaków wykonywania.W Microsoft C i C++, zestawy znaków źródła i wykonania są w kodowaniu ASCII.Łączenie ciągów
Wszystkie sąsiadujące ciągi znaków i literały szerokiego ciągu są łączone.Na przykład, "String " "concatenation" staje się "String concatenation".Tłumaczenie
Wszystkie tokeny są analizowane składniowo i semantycznie; tokeny te są przekształcane na kod obiektu.Połączenie
Wszystkie odwołania zewnętrzne są rozwiązywane, aby utworzyć bibliotekę dynamicznych połączeń lub program wykonywalny.
Kompilator generuje ostrzeżenia lub błędy podczas faz tłumaczenia, w których napotka błędy składniowe.
Konsolidator usuwa wszystkie odwołania zewnętrzne i tworzy plik wykonywalny lub bibliotekę DLL przez połączenie jednej lub więcej jednostek tłumaczenia z bibliotekami standardowymi.