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 plikami dołączanymi pliki, które są uwzględniane przy użyciu #include
dyrektywy preprocesora, ale nie obejmuje sekcji kodu usuniętych przez dyrektywy kompilacji warunkowej, takich jak #if
, jest nazywany jednostką tłumaczenia.
Pliki źródłowe można tłumaczyć w różnym czasie. W rzeczywistości często tłumaczone są tylko nieaktualne pliki. Przetłumaczone jednostki translacji mogą być przetwarzane do oddzielnych plików obiektu lub bibliotek kodu obiektu. Te oddzielne, przetłumaczone jednostki translacji są następnie łączone, aby sformułować program wykonywalny lub bibliotekę dynamicznych połączeń (DLL). Aby uzyskać więcej informacji na temat plików, które mogą być używane jako dane wejściowe konsolidatora, zobacz LINK input files (Pliki wejściowe LINK).
Jednostki translacji mogą komunikować się za pomocą:
Wywołań funkcji, które mają powiązania zewnętrzne.
Wywołań funkcji składowych 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.
Splicing liniowy
Wszystkie wiersze kończące się ukośnikiem odwrotnym (\) bezpośrednio po znaku nowego wiersza są połączone z następnym wierszem w pliku źródłowym, tworząc linie logiczne z linii fizycznych. Jeśli plik źródłowy nie jest pusty, musi kończyć się znakiem nowego wiersza, który nie jest poprzedzony ukośnikiem odwrotnym.
Tokenizacja
Plik źródłowy jest dzielony na tokeny wstępnego przetwarzania i znaki odstępu. Każdy komentarz w pliku źródłowym jest zamieniany na jeden znak spacji. Znaki nowego wiersza są zachowywane.
Wstępnego przetwarzania
Dyrektywy przetwarzania wstępnego są wykonywane, a makra rozwijane do pliku źródłowego. Instrukcja #include
wywołuje translację począwszy od powyższych trzech kroków translacji 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. Zestawy znaków źródła i wykonania są w kodowaniu ASCII w Microsoft C i C++.
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ć program wykonywalny lub bibliotekę dołączaną dynamicznie.
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 translacji z bibliotekami standardowymi.