2009-07-06 18 views
33

Po ponad dekadzie kodowania C/C++ zauważyłem następujący wzór - bardzo dobrzy programiści mają zazwyczaj szczegółową wiedzę o wnętrznościach kompilatora.Jak działają kompilatory C/C++?

Jestem całkiem dobrym programistą i mam ad hoc kolekcję "przesądów" kompilatora, więc chciałbym zrestartować moją wiedzę i zacząć od podstaw.

Czy ktoś może polecać linki do zasobów internetowych lub ulubionych książek? Szczególnie interesuje mnie kompilacja C/C++, optymalizacja, GCC i LLVM.

+4

Zapoznaj się z zasobami: http://stackoverflow.com/questions/1669/learning-to-write-a-compiler –

Odpowiedz

28

start z książką smoka .... (więcej na stres optymalizacji kodu i generowania kodu)

Go na napisać kompilator zabawka dla edukacyjnego języka programowania jak bezkofeinową lub ochłodzić .., można użyć generatorów parsera (lex i yacc) dla twojego przedniego końca (aby ułatwić sobie życie i skupić się na większej ilości elementów imp) ...

Następnie przeczytaj książkę wewnętrzną gcc wraz z przeglądaniem kodu źródłowego gcc.

+2

Dzięki, dobra kolejność. Ja biorę smoczą książkę: http://en.wikipedia.org/wiki/index.html?curid=188976 – Justicle

+2

Tak, to jest książka smoka. Czytałem 1. wydanie. Miał znacznie prostszego smoka ... – RBerteig

+2

Gah. Ludzie nadal to zalecają. Nie ja. Zacznij od swobodnego wprowadzenia --- powiedz "Zbudujmy kompilator" --- następnie spójrz na informatykę z zakresu matematyki i teorii. – dmckee

2

W zależności od tego, co dokładnie chcesz wiedzieć, powinieneś rzucić okiem na wzór filtra rurki, ponieważ o ile mi wiadomo, to (lub coś podobnego) jest używany w wielu kompilatorach w ostatnich latach.

Kiedy moja wiedza kompilator nie jest zbyt przestarzały to działa tak:

Parse sourcecode do symbolicznej reprezentacji

oczyścić reprezentacji symbolicznej, zrobić kilka normalizacja

optymalizacji symbolicznego drzewa w oparciu o pewne zasady

wypisz kod wykonywalny oparty na drzewie symbolicznym

Oczywiście zależności również muszą zostać rozwiązane.

Oczywiście spojrzenie na kod źródłowy gcc lub javac może pomóc w uzyskaniu bardziej szczegółowego zrozumienia.

1

Może to być również cenna odebrać i odczytać kodu źródłowego kompilatora. Wątpię, że GCC jest najlepszym pierwszym wyborem, ponieważ jest on obciążony pełną kompatybilnością z ponad 20-letnią ewolucją języka. Ale jestem też pewien, że czytanie jego źródła, kierowane przez jeden z wewnętrznych podręczników, byłoby edukacyjne.

Poważnie rozważę, patrząc na źródło, na język skryptowy, który jest wewnętrznie skompilowany do kodu bajtowego dla maszyny wirtualnej. Kilka języków pasuje do tego opisu, ale zacznę od Lua. Język jest mały, a VM to nowość. Model source code jest również mały, a fragmenty, które oglądałem, były bardzo wyraźne, chociaż lekko skomentowane.

11

Tekst kompilatora są dobre, ale są nieco ciężkie do samodzielnego uczenia się. Jack Crenshaw ma "książkę", która była serią artykułów, które można pobrać i przeczytać wywołanie "Lets Build a Compiler". Wynika to z metodologii "Ucz się przez działanie", która jest wspaniała, jeśli nie uzyskasz niczego, co mogłoby zająć formalne zajęcia na ten temat, lub to było zbyt wiele lat od jej podjęcia (tak jest w moim przypadku). Trzyma twoją rękę i prowadzi cię przez pisanie kompilatora, zamiast obrzucać cię rachunkiem Lambda i głębokimi teoretycznymi problemami, którymi interesuje się tylko środowisko akademickie. To był dobry sposób na pobudzenie tych komórek mózgowych, które miały tylko niewyraźne wspomnienie pisania czegoś na Vax (YEAH, to prawda VAX!) Wiele lat temu w szkole. Jest napisany bardzo rozmownie i łatwo po prostu usiąść i przeczytać, w przeciwieństwie do większości podręczników, które wymagają kilku garnków kawy, aby przejść przez pierwszy rozdział. Gdy masz już podstawy do zrozumienia, bardziej tradycyjny tekst, taki jak książka Smoka, jest świetnym odniesieniem do poszerzenia twojego zrozumienia. (Osobiste podoba mi się wersja "Zmarłe drzewo", wydrukowałem "Jacka", jest to o wiele łatwiejsze do odczytania w wygodnej pozycji niż na laptopie, a czytelnicy Ebookowi są zbyt drogie, aby coś, co nie wygląda tak, jakbyś czytał prawdziwa książka.)

To, co niektórzy mogą nazwać "minusem", jest napisane w języku Pascal, ale pomyślałem, że to właśnie sprawiło, że pomyślałem o tym bardziej, niż gdyby ktoś dał mi działający program C na początek. Z tego wynika, że ​​został napisany z myślą o 68000, który jest używany tylko w systemach wbudowanych w tym momencie. Ponownie dla mnie to nie był problem, wiedziałem, że 68000 asm i 68000 asm jest łatwiejszy do odczytania niż jakikolwiek inny asm.

4

Jak zauważył Pete Eddy, samouczek Jacka Crenshawa jest doskonały dla początkujących. Ale jeśli chcesz zobaczyć jak prawdziwy, produkcja C   kompilator działa — jeden który był zaprojektowany przez genialnych inżynierów zamiast stworzony przez rzucanie kod na ścianie, aż coś zatrzymany — dostać się kopię Fraser i Hansona A Retargetable C Compiler: Design and Implementation , który zawiera kod źródłowy do bardzo czystego kompilatora lcc. Wyjaśnienia dotyczące projektu i implementacji są mieszane z kodem. Nie jest to pierwsza książka dla początkujących, ale spłaci staranną naukę, a otrzymasz jej egzemplarz na   35 USD.

Aby uzyskać dłuższą rozmowę na temat lcc, patrz Compile C Faster on Linux.

Strona internetowa lcc zawiera również linki do wielu dobrych podręczników. Nie znam jednak tekstu intro, który bardzo mi się podoba.

P.S. Przykro mi, że zostałeś oszukany na Uni.

+0

Dzięki za podpowiedź - sprawdzę lcc na – Justicle

+0

inżynierów Brillant? Jack Crenshaw zaprojektował części wahadłowca, a domowe komputery były HOBBY jego. Aby nie kwestionować intelektu ludzi, którzy napisali lcc, ale nie musisz być genialny, aby zaprojektować kompilator. To naprawdę nie jest takie trudne. – NoMoreZealots

+1

Odwołanie nie dotyczyło Crenshaw, ale gcc. RMS to wiele rzeczy, ale genialny inżynier nie jest jednym z nich. Następnie dodaj 1000 małp i dobrze wymieszaj ... –

0

spojrzeć na Kaleidoscope. Możesz napisać swój własny kompilator w ciągu zaledwie kilku dni z LLVM.