Jak działają kompilatory C / C++?

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

Jestem w miarę dobrym programistą i mam doraźną kolekcję kompilatorów "przesądów", więc chciałbym zrestartować swoją wiedzę i zacząć od podstaw.

Czy ktoś może polecić linki do zasobów internetowych lub ulubionych książek? Szczególnie interesuję się kompilacją C / C++, optymalizacją, GCC i LLVM.

Author: fury.slay, 2009-07-06

10 answers

Zacznij od Księgi Smoka....(więcej na temat optymalizacji kodu i generowania kodu)

Go on write a toy compiler for an educational programming language like Decaf or Cool.., możesz użyć generatorów parserów (lex i yacc) dla Twojego front endu(aby ułatwić życie i skupić się na większej ilości rzeczy imp)....

Następnie przeczytaj GCC internals book wraz z przeglądaniem kodu źródłowego gcc.

 28
Author: sourabh jaiswal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-06 05:26:14
 11
Author: Brandon E Taylor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-06 05:03:36

Teksty kompilatorów są dobre, ale są trochę ciężkie do nauki. 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."Podąża za metodologią " Learn By Doing", która jest świetna, jeśli nie uzyskałeś nic z zajęć formalnych na ten temat, lub minęło zbyt wiele lat od jej podjęcia (to mój przypadek). Trzyma cię za rękę i prowadzi przez pisanie kompilatora zamiast bicia Cię Lambdą Rachunku i głębokich zagadnień teoretycznych, na których troszczy się tylko środowisko akademickie. To był dobry sposób, aby poruszyć te komórki mózgowe, które miały tylko zamazaną pamięć pisania czegoś na Vax (tak, to prawo VAX!) wiele księżyców temu w szkole. Jest napisany bardzo konwersacyjnie i łatwy do 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 już masz podstawy do zrozumienia, to bardziej tradycyjny tekst, taki jak Księga Smoka są świetnymi odniesieniami do poszerzenia twojego zrozumienia. (A osobiście lubię wersje Dead Tree, wydrukowałem Jack ' a, dużo łatwiej jest czytać w wygodnej pozycji niż na laptopie. A czytniki ebooków są zbyt drogie na coś, co nie wydaje się jeszcze prawdziwą książką.)

To, co niektórzy mogą nazwać "minusem", to to, że jest napisane w Pascalu, ale myślałem, że to po prostu skłoniło mnie do zastanowienia się nad tym bardziej, niż gdyby ktoś dał mi działający program C do uruchomienia z. Appart z tego, że został napisany z myślą o 68000, który jest używany tylko w systemach wbudowanych w tym momencie. Znowu dla mnie to nie był problem, wiedziałem, że 68000 asm i 68000 asm jest łatwiejszy do odczytania niż jakiś inny asm.

 11
Author: NoMoreZealots,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-13 14:02:02

Jeśli chcesz mieć edycję dead-tree, wypróbuj The Art of Compiler Design: Theory and Practice.

 9
Author: J-16 SDiZ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-06 05:13:40

Jak zauważył Pete Eddy, samouczek Jacka Crenshawa jest doskonały dla początkujących. Ale jeśli chcesz zobaczyć Jak działa prawdziwy, produkcyjny kompilator C - taki, który został Zaprojektowany przez genialnych inżynierów, a nie stworzony przez rzucanie kodu w ścianę, aż coś utknie-zdobądź kopię Frasera i Hansona a Retargetable C Compiler: Design and Implementation, który zawiera kod źródłowy do bardzo czystego kompilatora C.lcc kompilator. Objaśnienia konstrukcji i implementacja jest mieszana z kodem. Nie jest to pierwsza książka dla początkujących, ale zwróci staranną naukę, a używaną kopię można dostać za 35 dolarów.

Aby dowiedzieć się więcej o lcc, zobacz Kompiluj C szybciej na Linuksie .

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

P. S. Przepraszam, że cię okradli na uniwerku.
 4
Author: Norman Ramsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-07 02:14:54
 3
Author: jens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-06 06:54:25

Zobacz kod źródłowy Otcc Fabrice ' a Bellarda

Http://bellard.org/otcc/

 3
Author: plan9assembler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-11 10:54:17

W zależności od tego, co dokładnie chcesz wiedzieć, powinieneś rzucić okiem na pipes&filter pattern, ponieważ z tego, co wiem, to (lub coś podobnego) jest używane w wielu kompilatorach w ostatnich latach.

Gdy moja wiedza o kompilatorze nie jest zbyt przestarzała to działa tak:

Parse sourcecode into symbolic representation

Wyczyść symboliczną reprezentację, zrób jakąś normalizację

Optymalizacja drzewa symbolicznego na podstawie pewnych reguł

Napisz kod wykonywalny oparty na drzewie symbolicznym

Oczywiście zależności itp. też trzeba to rozwiązać.

I oczywiście spojrzenie na gcc lub javac sourcecode może pomóc w bardziej szczegółowym zrozumieniu.

 2
Author: Patrick Cornelissen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-06 05:14:47

Cenne może być również pobranie i odczytanie kodu źródłowego kompilatorowi. Wątpię, aby GCC był najlepszym pierwszym wyborem, ponieważ jest obciążony pełną kompatybilnością z ponad 20-letnią ewolucją języka. Ale jestem też pewien, że lektura jego źródła, prowadzona przez jeden z wewnętrznych podręczników referencyjnych, byłaby edukacyjna.

Poważnie rozważyłbym przyjrzenie się źródłu do języka skryptowego, który jest wewnętrznie skompilowany do kodu bajtowego maszyny wirtualnej. Kilka języki pasują do tego opisu, ale zacznę od Lua . Język jest mały, a VM jest nowy. kod źródłowy jest również mały, a bity, na które patrzyłem, były bardzo jasne, chociaż lekko skomentowane.

 1
Author: RBerteig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-06 08:03:07

Zobacz Kalejdoskop . Możesz napisać własny kompilator w ciągu zaledwie kilku dni z LLVM.

 0
Author: name,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-01 16:32:35