2012-01-12 13 views
6

Niedawno byłem bardzo zainteresowany kompilatorami i ich działaniem. Ponieważ GCC ma dostępne źródło, pomyślałem, że to najlepszy materiał do nauki.Nauka gcc internals

Pierwszą rzeczą, jaką sobie uświadomiłem, jest to, że bezcelowe byłoby studiowanie gcc, jeśli nie rozumiem podstawowych zasad projektowania kompilatorów. Odtąd pilnie czytałem "Smoczą księgę", która z tego, co widziałem, jest de facto książką o implementacji kompilatora.

Bez względu na to, lektura tej książki tylko pogłębiła moje pragnienie poznania kompilatorów takich jak gcc.

Dodatkowo uważam za stosowne powiedzieć, że mam pośrednie zrozumienie c/C++ (aka, nie próbuję studiować gcc bez znajomości c). Mam nadzieję, że studiowanie gcc pomoże mi to poprawić.

Pobrałem najnowszą kompilację, jaką mogłem znaleźć; jednak gubię się podczas przeglądania kodu źródłowego.

Czego szukam, to sugestie, jak postępować. Czy istnieje podobny projekt, który nie jest tak ogromny, mógłbym użyć go jako odskoczni do gcc? Czy jest jakiś konkretny moduł gcc, który można by polecić jako pierwszy? Czy są jakieś książki, które wchodzą w implementację gcc, a nie używają? Może powinienem przestać marudzić i po prostu czytać źródło, dopóki nie kliknie?

Wszelkie opinie będą mile widziane.

EDYCJA: Jeśli uważasz, że powinienem studiować inny kompilator/interpreter, bardzo doceniam sugestie, które z nich.

+3

Powinieneś przeczytać książkę smoka, a następnie napisać własny kompilator. Pomaga to ogromnie. –

+2

Słyszałem, że GCC to ból do zhakowania. Może LLVM byłaby alternatywą? – Blender

+0

1. Powinieneś całkowicie zrozumieć język na poziomie eksperckim. 2. Napisz swój własny kompilator najpierw dla małego języka 3. GCC to bałagan. Jest dużo lepszych alternatyw. – Pubby

Odpowiedz

6

Jeśli chcesz spojrzeć na bardzo mały kompilator, polecam Fabrice Bellard's Tiny C Compiler.

Warto również wspomnieć, że Fabrice Bellard wygrał zawoalowany konkurs z kodem c z jego numerem Obfuscated Tiny C Compiler. Jest też wersja odświeżona i pasuje do single c file.

Te powinny być świetne, jeśli chcesz czegoś małego i łatwego do opanowania.

+0

'8c' z Plan9 jest dość łatwe do odczytania, too. – Dave

5

Na pewno spojrzę na clang/LLVM. Myślę, że podstawa kodu jest bardzo czytelna. Jedną z bardzo opłacalnych opcji jest użycie LLVM jako back-end i napisanie własnego prostego lexera i analizatora składni.

+2

zgadzam, LLVM jest znacznie lepszy do nauki/hacking niż gcc. W szkole gradowej kurs kompilacji wykorzystywał LLVM do projektów. – TJD

+1

Nota prawna: Jestem trochę stronniczy. Mój projekt kompilatora używa LLVM: http://ellcc.org :-) –

0

Myślę, że dobrze jest przeczytać książkę "ruby pod mikroskopem" i ćwiczyć z opracowaniem rdzenia rdzenia, przed przeczytaniem kodu gcc. Ale powinieneś potrzebować wiedzy na temat programowania ruby. Chodzi o internaty ruby.

Jak wiem, najlepszą książką na temat gcc jest "ostateczny przewodnik do gcc" https://www.amazon.com/Definitive-Guide-GCC-Guides-Paperback/dp/1590595858. Chociaż jest trochę stara, myślę, że powinieneś to przeczytać.

0

Namiętnie o kompilatorach też wiele się nauczyłem z książki Niklausa Wirtha: Algorithms + Data Structures = Programs. Jeden z ostatnich rozdziałów opisał języki Pascal-0, a poprzednie rozdziały pokazują, jak analizować i kompilować bardzo minimalistyczny język. Pascal-0, PL/0 są kompilatorami dwuetapowymi, generują kod p, który jest "kodem maszynowym" dla minimalistycznej maszyny wirtualnej (podobnie jak Java).

This page describes a PL/0 virtual machine instruction set, a na samym końcu łącza do kompilatora PL/0 i innych interesujących informacji.

Niklaus Wirth has always had a knack za napisanie czytelnego i dobrze skonstruowanego kodu.Oto definicja języka i wiele innych interesujących linków.

Zaletą nauki i korzystania z Pascala jest to, że język jest bardzo uporządkowany, a nie ewolucją z asemblera (jak C). Ułatwia to kompilowanie. Nie jest nawet konieczne wykonywanie kilku przebiegów ...