2009-09-30 8 views
23

uczę kompilatory kursu, kompilacja programu następuje poniżej krokiJak mogę zobaczyć drzewo parse, kod pośredni, kod optymalizacyjny i kod zespołu podczas kompilacji?

  1. analiza leksykalna
  2. Składnia analizy
  3. analizy semantycznej
  4. Intermediate generowania kodu
  5. optymalizacja kodu
  6. generowanie kodu docelowego.

Jak mogę zobaczyć dane wyjściowe każdego kroku, np. Chcę zobaczyć drzewo analizy po analizie składni.

Kompiluję program na komputerze z systemem Linux z kompilatorem GCC.

Możemy zobaczyć kod zespołu programu za pomocą opcji -Wa kompilator w gcc, podobnie istnieje opcja, aby zobaczyć Tokeny, drzewo Parse i kod Inetmediate.

Odpowiedz

8

Możesz zobaczyć wyjście preprocesora z -E. -fdump-tree-* zrzuca wewnętrzne przedstawienie drzewa, np. -fdump-tree-all. Istnieją różne opcje zrzucania reprezentacji pośrednich RTL, np. -fdump-rtl-all (patrz instrukcja dla poszczególnych przebiegów, z których otrzymujesz zrzuty); ponadto, -dD zrzuca wszystkie definicje makr.

+2

Uwaga dla czytelników: z opcją kompilator zrzuca drzewo do pliku z nazwą kodu źródłowego i postfiksem takim jak ".optimized". Nie jest to wcale oczywiste, spędziłem ≈20 minut, przejrzałem dokumentację i przeszukano przypadki, w których gcc nie generuje zrzutu, gdy od czasu do czasu odnotowywano nowy plik * (co nie jest łatwe, ponieważ wykonałem test w '/ tmp /', który jest dość niezdarny) *. –

15

Chociaż można użyć opcji -fdump-tree-all i -fdump-rtl-all w gcc, nie sądzę, że ich wyniki są bardzo przydatne dla ucznia kompilatora. FWIW, zacząłem pracować nad gcc w ramach moich studiów doktoranckich, mając już ukończone dwa studia licencjackie i znalazłem gcc, a jego pliki debugujące jako nieprzejrzyste i trudne do naśladowania.

Ponadto gcc tak naprawdę nie podąża za podręcznikiem projektowania kompilatorów. Nikt tak naprawdę nie robi, ponieważ nie działa tak dobrze. Jestem prawie pewien, że gcc nie generuje drzewa parsowania ani drzewa-składni abstrakcyjnej. Tworzy IR (zwany gimple), na którym wykonuje optymalizacje wysokiego poziomu.

Proponuję zamiast tego spróbować LLVM, który ma reputację dobrze zaprojektowanego i łatwego do naśladowania. Inną alternatywą jest pobranie kodu z podręcznika, zwłaszcza z książki Appel, zakładając, że jest ona dostępna.

Inną propozycją, jeśli mogę polecić własną na chwilę, jest użycie phc. Za pomocą phc można zobaczyć drzewo analizy jako obraz i wyświetlić AST i kod źródłowy po każdym pojedynczym przejściu w kompilatorze. Here is a comparison of parts of the AST and the parse tree. Są generowane trywialnie za pomocą phc. W gałęzi dataflow można zobaczyć kompilator IR, formularz CFG, SSA i dane wyjściowe debugowania z wnioskowania o typ i analizy aliasów. Możesz także włączać i wyłączać optymalizacje oraz przekazywać efekty, aby zobaczyć, jaki mają efekt.

Myślę, że to może być przydatne dla Ciebie.

+0

Och, nie ma mowy, to twoja strona? Objaśnienie tego wirtualnego dziedzictwa jest fantastyczne.Po przeczytaniu tego naprawdę dostałem "dlaczego" wirtualne i zapowiedź w systemach obiektów C. Czy obecnie myślisz o dobrych kompilatorach pedagogicznych? – Praxeolitic

+0

Ale 'phc' wydaje się być samodzielnym kompilatorem, tj. Nie jest aplikacją ułatwiającą zrozumienie kodu bajtowego GCC. –