Nauka pisania kompilatora [zamknięta]

zamknięte. to pytanie nie spełnia wytycznych dotyczących przepełnienia stosu . Obecnie nie przyjmuje odpowiedzi.

chcesz poprawić to pytanie? Update the pytanie więc to on-topic {[3] } dla przepełnienia stosu.

Zamknięte 6 lat temu .

Odpowiedzi na to pytanie są wysiłkiem społeczności. Edytuj istniejące odpowiedzi, aby poprawić ten post. Obecnie nie przyjmuje nowych odpowiedzi ani interakcji.

preferowane języki : C / C++, Java i Ruby.

Szukam pomocnych książek/samouczków, jak napisać własny kompilator w celach edukacyjnych. Jestem najbardziej zaznajomiony z C / C++, Java i Ruby, więc wolę zasoby, które obejmują jeden z tych trzech, ale każdy dobry zasób jest akceptowalny.

Author: Anton, 2008-08-04

30 answers

Wielka lista zasobów:

Legenda:

  • ¶ Link do pliku PDF
  • $ Link do drukowanej książki
 1121
Author: Anton,
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
2020-10-06 07:38:38

To jest dość niejasne pytanie, myślę; tylko ze względu na głębię tematu. Kompilator może być jednak podzielony na dwie oddzielne części; górną-połowę i dolną-jedną. Górna połowa zazwyczaj przyjmuje język źródłowy i przekształca go w reprezentację pośrednią, a dolna połowa zajmuje się generowaniem kodu specyficznego dla platformy.

Niemniej jednak, jednym z pomysłów na łatwy sposób podejścia do tego tematu (ten, którego użyliśmy w mojej klasie kompilatorów, przynajmniej) jest zbuduj kompilator w dwóch częściach opisanych powyżej. W szczególności, uzyskasz dobry obraz całego procesu, budując tylko górną połowę.

Samo zrobienie górnej połowy pozwala uzyskać doświadczenie w pisaniu analizatora leksykalnego i parsera i przejść do generowania jakiegoś "kodu" (o tej pośredniej reprezentacji wspomniałem). Tak więc weźmie Twój program źródłowy i przekonwertuje go na inną reprezentację i zrobi pewną optymalizację (jeśli chcesz), która jest sercem kompilatora. Na dolna połowa zajmie tę pośrednią reprezentację i wygeneruje bajty potrzebne do uruchomienia programu na określonej architekturze. Na przykład, dolna połowa zajmie pośrednią reprezentację i wygeneruje plik wykonywalny PE.

Niektóre książki na ten temat, które uznałem za szczególnie pomocne, to Kompilatory zasady i techniki (lub Księga Smoka, ze względu na uroczego smoka na okładce). Ma świetną teorię i zdecydowanie obejmuje gramatyki bez kontekstu w bardzo przystępny sposób. Ponadto, do budowy analizatora leksykalnego i parsera, prawdopodobnie użyjesz narzędzi * nix lex i yacc. I co ciekawe, książka o nazwie "lex i yacc " podniosła się tam, gdzie Księga Smoków zakończyła się dla tej części.

 71
Author: mrduclaw,
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-20 23:01:20

Myślę, że Nowoczesna implementacja kompilatora w ML jest najlepszym wstępnym kompilatorem piszącym tekst. Istnieje również wersja Java i C , z których każda może być bardziej dostępna, biorąc pod uwagę tło językowe. Książka zawiera wiele przydatnych materiałów podstawowych (skanowanie i parsowanie, analiza semantyczna, zapisy aktywacji, wybór instrukcji, generowanie kodu natywnego RISC i x86) oraz różne "zaawansowane" tematy (kompilowanie języków OO i funkcyjnych, polimorfizm, zbiór śmieci, optymalizacja i pojedyncza forma przypisania statycznego) na stosunkowo niewielką przestrzeń (~500 stron).

Wolę nowoczesną implementację kompilatora niż książkę Smoka, ponieważ współczesna implementacja kompilatora bada mniej pola -- zamiast tego ma naprawdę solidne pokrycie wszystkich tematów, które trzeba by napisać poważny, przyzwoity kompilator. Po przepracowaniu tej książki będziesz gotowy bezpośrednio zająć się dokumentami badawczymi, aby uzyskać więcej głębi, jeśli tego potrzebujesz.

I muszę przyznać, że mam poważny słabość do konstrukcji kompilatora Niklausa Wirtha. jest to dostępne online w formacie PDF. Uważam, że estetyka programowania Wirtha jest po prostu piękna, jednak niektórzy uważają jego styl za zbyt minimalny (na przykład Wirth faworyzuje rekurencyjne parsery descent, ale większość kursów CS skupia się na narzędziach generujących parsery; projekty językowe Wirtha są dość konserwatywne.) Budowa kompilatora jest bardzo zwięzłą destylacją podstawowych idei Wirtha, więc czy podoba Ci się jego styl czy nie czy nie, Gorąco polecam lekturę tej książki.

 56
Author: Dominic Cooney,
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
2019-12-04 14:42:49

Zgadzam się z Dragon Book reference; IMO, jest to ostateczny przewodnik po budowie kompilatora. Przygotuj się jednak na hardcorową teorię.

Jeśli chcesz książkę, która będzie lżejsza od teorii, opanowanie skryptów do gier może być lepszą książką dla Ciebie. Jeśli jesteś totalnym nowicjuszem w teorii kompilatorów, zapewnia łagodniejsze wprowadzenie. Nie obejmuje bardziej praktycznych metod parsowania (decydując się na nie-predykcyjne rekurencyjne zejście bez omawiania parsowania LL lub LR), i jak przypomnijmy, nie omawia nawet żadnej teorii optymalizacji. Dodatkowo, zamiast kompilować do kodu maszynowego, kompiluje się do kodu bajtowego, który powinien działać na maszynie wirtualnej, którą również piszesz.

To nadal przyzwoita lektura, szczególnie jeśli możesz ją tanio odebrać na Amazon. Jeśli chcesz tylko łatwego wprowadzenia do kompilatorów, opanowanie skryptów w grze nie jest złym sposobem. Jeśli chcesz przejść hardcore z przodu, powinieneś zadowolić się niczym innym, jak książką Smoka.

 45
Author: user316,
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
2008-08-04 23:08:18

"zbudujmy kompilator" jest niesamowity, ale trochę przestarzały. (Nie mówię, że to sprawia, że jest to nawet trochę mniej ważne.)

Lub sprawdź . Jest to podobne do "zbudujmy kompilator", ale jest znacznie lepszym zasobem, szczególnie dla początkujących. W zestawie znajduje się samouczek pdf, który zawiera 7-stopniowe podejście do nauczania kompilatora. Dodanie linku quora, ponieważ ma linki do wszystkich różnych portów SLANG, w C++, Java i JS, również interpreterów w Pythonie i java, pierwotnie napisana przy użyciu C# i platformy. NET.

 29
Author: RBz,
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
2016-08-16 05:55:29

Jeśli chcesz używać potężnych narzędzi wyższego poziomu, a nie budować Wszystko samemu, przechodząc przez projekty i odczyty dla ten kurs jest całkiem dobrą opcją. Jest to kurs językowy autora Java parser engine ANTLR. Książkę na kurs możesz otrzymać w formacie PDF od The Pragmatic Programmers .

Kurs przechodzi przez Standardowy kompilator rzeczy, które można zobaczyć gdzie indziej: parsowanie, typy i sprawdzanie typu, polimorfizm, tabele symboli i generowanie kodu. Praktycznie jedyną rzeczą, która nie jest objęta, są optymalizacje. Finalny projekt to program, który kompiluje podzbiór C . Ponieważ używasz narzędzi takich jak ANTLR i LLVM, możliwe jest napisanie całego kompilatora w ciągu jednego dnia(mam na to dowód istnienia, choć mam na myśli ~24 godziny). Jest ciężki w praktycznej inżynierii przy użyciu nowoczesnych narzędzi, nieco lżejszy w teorii.

LLVM, nawiasem mówiąc, jest po prostu fantastyczne. Wiele sytuacje, w których można normalnie skompilować do assembly, byłoby znacznie lepiej skompilować do pośredniej reprezentacji LLVM . Jest to wyższy poziom, cross platform, a LLVM jest całkiem dobry w generowaniu zoptymalizowanego montażu z niego.

 24
Author: Peter Burns,
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
2008-08-04 23:25:02

Jeśli masz mało czasu, polecam "budowę kompilatora" Niklausa Wirtha (Addison-Wesley. 1996) , mała książeczka, którą można przeczytać w jeden dzień, ale wyjaśnia podstawy (w tym jak zaimplementować lexery, rekurencyjne parsery descent i własne maszyny wirtualne oparte na stosie). Po tym, jeśli chcesz głębokiego nurkowania, nie ma możliwości obejścia Książki Smoka, jak sugerują inni komentatorzy.

 20
Author: Matthieu,
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
2011-10-18 13:55:17

Możesz zajrzeć do Lex / Yacc (lub Flex / Bison, jak chcesz je nazwać). Flex jest analizatorem leksykalnym, który analizuje i identyfikuje składniki semantyczne ("tokeny") Twojego języka, a Bison będzie używany do definiowania, co się dzieje, gdy każdy token jest analizowany. Może to być, ale na pewno nie jest ograniczone do, wydrukowanie kodu C, dla kompilatora, który skompilowałby się do C, lub dynamiczne uruchamianie instrukcji.

Ten FAQ powinien ci pomóc, a to tutorial wygląda na całkiem przydatny.

 17
Author: Zachary Murray,
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-20 22:47:04

Ogólnie rzecz biorąc, nie ma pięciominutowego samouczka dla kompilatorów, ponieważ jest to skomplikowany temat, a pisanie kompilatora może zająć miesiące. Będziesz musiał zrobić własne poszukiwania.

Python i Ruby są zwykle interpretowane. Może chcesz zacząć od tłumacza. Generalnie jest łatwiej.

Pierwszym krokiem jest napisanie formalnego opisu języka, gramatyki języka programowania. Następnie musisz przekształcić kod źródłowy, który chcesz skompilować lub interpretować zgodnie z gramatyką w abstrakcyjne drzewo składni, wewnętrzną formę kodu źródłowego, który komputer rozumie i może działać na. Ten krok jest zwykle nazywany parsowaniem, a oprogramowanie, które przetwarza kod źródłowy, nazywa się parserem. Często parser jest generowany przez generator parserów, który przekształca gramatykę formalną w kod maszynowy źródłowy. Dla dobrego, nie-matematycznego wyjaśnienia parsowania polecam techniki parsowania-praktyczny przewodnik. Wikipedia ma porównanie generatorów parserów, z których możesz wybrać ten, który jest odpowiedni dla Ciebie. W zależności od wybranego przez Ciebie generatora parserów, znajdziesz tutoriale w Internecie, a dla naprawdę popularnych generatorów parserów (takich jak GNU bison) są również książki.

Pisanie parsera dla Twojego języka może być naprawdę trudne, ale to zależy od gramatyki. Sugeruję więc, aby Twoja gramatyka była prosta (w przeciwieństwie do C++); dobrym przykładem na to jest LISP.

W drugim kroku drzewo składni abstrakcyjnej jest przekształcony ze struktury drzewa w liniową reprezentację pośrednią. Jako dobry przykład dla tego kodu bajtowego Lua jest często cytowany. Ale reprezentacja pośrednicząca naprawdę zależy od Twojego języka.

Jeśli budujesz interpreter, będziesz musiał po prostu zinterpretować reprezentację pośrednią. Możesz też skompilować go na czas. Polecam LLVM i libjit do kompilacji just-In-time. Aby język był użyteczny, musisz również uwzględnić pewne dane wejściowe i wyjściowe funkcje i być może mała biblioteka standardowa.

Jeśli zamierzasz skompilować język, będzie to bardziej skomplikowane. Będziesz musiał napisać backendy dla różnych architektur komputerów i wygenerować kod maszynowy z pośredniej reprezentacji w tych backendach. Do tego zadania polecam LLVM.

Jest kilka książek na ten temat, ale nie mogę polecić żadnej z nich do ogólnego użytku. Większość z nich jest zbyt akademicka lub zbyt praktyczna. Nie ma "Naucz się kompilatora pisząc w ciągu 21 dni", a więc będziesz musiał kupić kilka książek, aby dobrze zrozumieć ten cały temat. Jeśli przeszukasz Internet, natkniesz się na niektóre książki online i notatki z wykładów. Może w pobliżu jest Biblioteka Uniwersytecka, gdzie można wypożyczyć książki na kompilatorach.

Polecam również dobrą wiedzę w zakresie Informatyki Teoretycznej i teorii grafów, jeśli chcesz, aby twój projekt był poważny. Dyplom z informatyki będzie również pomocne.

 17
Author: user141335,
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-21 10:37:00
 14
Author: Taylor Leese,
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
2014-12-27 12:39:08

Jedna książka jeszcze nie zasugerowana, ale bardzo ważna jest "Linkers and Loaders" autorstwa Johna Levine ' a. Jeśli nie używasz zewnętrznego asemblera, będziesz potrzebował sposobu na wypisanie pliku obiektowego, który można połączyć z końcowym programem. Nawet jeśli używasz zewnętrznego asemblera, prawdopodobnie będziesz musiał zrozumieć relokacje i jak działa cały proces ładowania programu, aby stworzyć działające narzędzie. Ta książka gromadzi wiele losowych informacji na temat tego procesu dla różnych systemów, w tym Win32 i Linux.

 11
Author: Ben Combee,
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
2008-08-18 20:18:32

Uznałem książkę Smoka za zbyt trudną do odczytania z zbyt dużym naciskiem na teorię języka, która nie jest tak naprawdę wymagana do napisania kompilatora w praktyce.

Dodałbym Oberon książkę, która zawiera pełne źródło niezwykle szybkiego i prostego kompilatora Oberon projektu Oberon .

Alt text

 11
Author: Lothar,
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
2014-12-27 12:39:09

Pamiętam, że zadałem to pytanie jakieś siedem lat temu, kiedy byłem raczej nowy w programowaniu.

Byłem bardzo ostrożny, gdy pytałem i o dziwo nie dostałem tyle krytyki, co Ty. Wskazali mi jednak kierunek " Dragon Book ", która jest moim zdaniem naprawdę świetną książką, która wyjaśnia wszystko, co musisz wiedzieć, aby napisać kompilator (oczywiście będziesz musiał opanować jeden lub dwa języki. Im więcej języków znasz, tym weselej.).

I tak, wiele osób mówi, że czytanie tej książki jest szalone i niczego się z niej nie nauczysz, ale całkowicie się z tym nie zgadzam.

Wiele osób twierdzi również, że pisanie kompilatorów jest głupie i bezcelowe. Cóż, istnieje wiele powodów, dla których rozwój kompilatora jest przydatny:

  • bo to zabawne.
  • jest edukacyjny, ucząc się pisania kompilatorów dowiesz się wiele o informatyce i innych technikach, które są przydatne, gdy pisanie innych aplikacji.
  • gdyby nikt nie pisał kompilatorów, istniejące języki nie byłyby lepsze.

Od razu nie napisałem własnego kompilatora, ale po zapytaniu Wiedziałem od czego zacząć. A teraz, po nauczeniu się wielu różnych języków i przeczytaniu Księgi Smoka, pisanie nie stanowi większego problemu. (Studiuję również inżynierię komputerową, ale większość tego, co wiem o programowaniu, to samouk.)

Podsumowując, Księga Smoków jest wielką "tutorial". Ale poświęć trochę czasu na opanowanie języka lub dwóch, zanim spróbujesz napisać kompilator. Nie oczekuj jednak, że będziesz Guru kompilatorów w ciągu następnej dekady.

Książka jest również dobra, jeśli chcesz nauczyć się pisać parsery/interpretery.

 11
Author: Pandafox,
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
2019-05-26 23:00:07

Księga Smoków {[2] } jest zdecydowanie książką "kompilatorów budowlanych", ale jeśli twój język nie jest tak skomplikowany jak obecna generacja języków, możesz spojrzeć na wzór interpretera z wzorców projektowych.

Przykład w książce projektuje język podobny do wyrażeń regularnych i jest dobrze przemyślany, ale jak mówią w książce, jest dobry do myślenia przez proces, ale jest skuteczny naprawdę tylko w małych językach. Jednak jest to znacznie szybsze napisanie interpretera dla małego języka z tym wzorcem niż poznanie różnych typów parserów, yacc i lex, itd...

 10
Author: Chris Bunch,
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
2008-08-05 16:16:01

Jeśli chcesz korzystać z LLVM, sprawdź to: http://llvm.org/docs/tutorial / . uczy, jak napisać kompilator od podstaw za pomocą frameworka LLVM, i nie zakłada, że masz wiedzę na ten temat.

Tutorial sugeruje napisanie własnego parsera i lexera itp., ale radzę przyjrzeć się bizonowi i flexowi, gdy tylko wpadniesz na pomysł. Ułatwiają życie.

 10
Author: wvdschel,
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
2008-08-20 10:01:17

Przyglądam się tej samej koncepcji i znalazłem obiecujący artykuł Joela Pobara,

Tworzenie kompilatora języka dla. NET Framework-Nie wiem, gdzie to się stało

Tworzenie kompilatora języka dla. NET Framework-pdf kopia oryginału doc

Omawia koncepcję kompilatora wysokiego poziomu i kontynuuje wymyślanie własnego langauge dla. Net framework. Chociaż jego celem jest. NET Framework, wiele pojęć powinno być w stanie być reprodukowane. Artykuł obejmuje:

  1. definicja Langauge
  2. Skaner
  3. Parser (bit im głównie zainteresowany)
  4. Targeting the. Net Framework the
  5. Generator Kodu

Są inne tematy, ale masz rację.

Its aimed to people starting out, written in C# (not quite Java)

HTH

Kości

 10
Author: dbones,
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
2018-12-15 01:04:58

Kompilator LCC (wikipedia) (Strona główna projektu) (github.com/drh/lcc ) Frasera i Hansona opisano w ich książce "a Retargetable C Compiler: Design and Implementation". Jest dość czytelny i wyjaśnia cały kompilator, aż do generowania kodu.

 10
Author: mfx,
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
2019-12-04 14:40:14

"... Zbudujmy kompilator ..."

I ' d second http://compilers.iecc.com/crenshaw / by @ sasb. Na razie zapomnij o kupowaniu książek.

Dlaczego? Narzędzia i język.

Wymagany język to Pascal i o ile dobrze pamiętam jest oparty na Turbo-Pascalu. Tak się dzieje, jeśli pójdziesz do http://www.freepascal.org / i ściągnąć kompilator Pascala wszystkie przykłady działają prosto ze strony ~ http://www.freepascal.org/download.var piękna rzecz w Free Pascalu jest taka, że możesz go używać prawie niezależnie od procesora lub systemu operacyjnego, na którym możesz się opiekować.

Po opanowaniu lekcji spróbuj bardziej zaawansowanych "Księga Smoka" ~ http://en.wikipedia.org/wiki/Dragon_book

 9
Author: bootload,
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
2017-05-23 11:54:41

Łatwym sposobem tworzenia kompilatora jest użycie bison i flex (lub podobnych), zbudowanie drzewa (AST) i wygenerowanie kodu w C. generowanie kodu C jest najważniejszym krokiem. Generując kod C, twój język będzie automatycznie działał na wszystkich platformach, które mają kompilator C.

Generowanie kodu C jest tak proste jak generowanie HTML( wystarczy użyć print, lub równoważnego), co z kolei jest znacznie łatwiejsze niż pisanie parsera C lub parsera HTML.

 8
Author: Peter Stuifzand,
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
2008-08-20 09:56:34

Z komp.Kompilatory FAQ :

"Programowanie komputera osobistego" Per Brinch Hansen Prentice-Hall 1982 ISBN 0-13-730283-5

Ta niestety-tytułowa książka wyjaśnia projektowanie i tworzenie środowiska programowania dla jednego użytkownika dla micros, używając języka Pascala o nazwie Edison. Autor przedstawia cały kod źródłowy i wyjaśnienia dotyczące krok po kroku implementacji Kompilator Edisona i prosty wspierający system operacyjny, wszystko napisane w Edison siebie (z wyjątkiem małego jądra pomocniczego napisanego w symbolicznym asembler dla PDP 11/23; kompletne źródło można również zamówić dla IBM PC).

Najciekawsze rzeczy w tej książce to: 1) jej zdolność do zademonstrować, jak stworzyć kompletny, samowystarczalny, samowystarczalny, przydatny kompilator i system operacyjny, oraz 2) ciekawa dyskusja o problemy projektowania i specyfikacji języka oraz kompromisy w rozdziale 2.

"Brinch Hansen na kompilatorach Pascala" by Per Brinch Hansen Prentice-Hall 1985 ISBN 0-13-083098-4

Kolejna teoria światła ciężka-na-pragmatyka oto-jak-zakodować-to książka. Autor przedstawia projektowanie, implementacja i kompletny kod źródłowy dla kompilatora i kodu p interpreter dla Pascala - (Pascal "minus"), podzbiór Pascala z boolowskim i typy całkowite (ale bez znaków, liczb rzeczywistych, podkategorii lub typów wyliczeniowych), definicje stałych i zmiennych oraz typy tablic i rekordów (ale nie spakowane, variant, set, pointer, nameless, przemianowane, lub typy plików), wyrażenia, instrukcje assignment, zagnieżdżone definicje procedur z wartością i zmienną parametrów, poleceń if, poleceń while oraz bloków begin-end (ale nie definicje funkcji, parametry proceduralne, instrukcje goto i etykiety, case statements, repeat statements, for statements i with statements).

Kompilator i interpreter są napisane w Pascalu* (Pascal "gwiazda"), a Podzbiór Pascala rozszerzony o kilka funkcji do tworzenia oprogramowanie systemy rozwoju. Kompilator Pascal* dla IBM PC sprzedawany jest przez autora, ale łatwo jest przenieść kompilator Pascala do dowolnego wygodna platforma Pascal.

Ta książka ułatwia projektowanie i implementację kompilatora. I szczególnie podoba się sposób, w jaki autor troszczy się o jakość, niezawodność i testowanie. Kompilator i interpreter mogą być łatwo używane jako podstawę bardziej zaangażowanego języka lub projektu kompilatora, zwłaszcza jeśli jesteś naciskany, aby szybko uzyskać coś działa.

 8
Author: joe snyder,
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
2010-06-27 19:00:38

Powinieneś sprawdzić " ichbins " Dariusa Bacona, który jest kompilatorem dla małego dialektu Lispu, celującym w C, na nieco ponad 6 stronach kodu. Zaletą, jaką ma w stosunku do większości kompilatorów zabawek, jest to, że język jest na tyle kompletny, że kompilator jest w nim napisany. (Tarball zawiera również interpreter do bootstrap rzeczy.)

Jest więcej rzeczy o tym, co znalazłem przydatne w nauce pisania kompilatora na mojej stronie Ur-Scheme.

 8
Author: 2 revs, 2 users 89%Kragen Javier Sitaker,
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
2010-12-01 12:50:57
    To jest ogromny temat. Nie lekceważ tego punktu. I nie lekceważ mojego punktu widzenia, aby go nie lekceważyć.
  1. I hear the Dragon Book is a (the?) miejsce na początek wraz z poszukiwaniami. :) Lepiej poszukaj, w końcu to będzie twoje życie.
  2. budowanie własnego języka programowania jest absolutnie dobrym ćwiczeniem! Ale wiedz, że nigdy nie będzie używany do żadnego praktycznego celu w końcu. Wyjątki od tego są nieliczne i bardzo daleko pomiędzy.
 8
Author: 280Z28,
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
2014-02-28 23:54:22

Python jest dołączony do kompilatora Pythona napisanego w Pythonie. Możesz zobaczyć kod źródłowy i obejmuje on wszystkie fazy, od parsowania, abstrakcyjnego drzewa składni, emitowania kodu itp. Zhakuj to.

 7
Author: yeruham,
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
2008-08-12 11:25:34

Przepraszam, to jest w języku hiszpańskim, ale to jest Bibliografia kursu o nazwie "Compiladores e Intérpretes" (kompilatory i Interpretatory) w Argentynie.

Kurs był od formalnej teorii języka do budowy kompilatora, a oto tematy, które musisz zbudować, przynajmniej, prosty kompilator:

  • Kompilatory Projektowanie w C.
    Allen I. Holub

    Prentice-Hall. 1990.

  • Compiladores. Teoría y Construcción.
    Sanchís Llorca, F. J., Galán Pascual, C. Editorial Paraninfo. 1988.

  • Budowa Kompilatora.
    Niklaus Wirth

    Addison-Wesley. 1996.

  • Lenguajes, Gramáticas y Autómatas. Un enfoque práctico.
    Pedro Isasi Viñuela, Paloma Martínez Fernández, Daniel Borrajo Millán. Addison-Wesley Iberoamericana España). 1997.

  • Sztuka projektowania kompilatorów. Teoria i praktyka.
    Tomasz Pittman, James Peters.

    Prentice-Hall. 1992.

  • Obiektowa Budowa Kompilatora. Jim Holmes.
    Prentice Hall, Englewood Cliffs, N. J. 1995

  • Compiladores. Conceptos Fundamentales.
    B. Teufel, S. Schmidt, T. Teufel.

    Addison-Wesley Iberoamericana. 1995.

  • Wprowadzenie do teorii automatów, języków i obliczeń.

    John E. Hopcroft. Jeffref D. Ullman. Addison-Wesley. 1979.

  • Wprowadzenie do języków formalnych.
    György E. Révész.

    Mc Graw Hill. 1983.

  • Techniki Parsowania. Praktyczny Przewodnik.
    Dick Grune, Ceriel Jacobs.
    Impreso por los autores. 1995
    http://www.cs.vu.nl / ~dick/PTAPG.html

  • Yacc: Yet Another Compiler-Kompilator.
    Stephen C. Johnson
    Informatyka Raport Techniczny Nr 32, 1975. Bell Laboratoria. Murray Hill, New
    Jersey.

  • Lex: Generator Analizatorów Leksykalnych.
    M. E. Lesk, E. Schmidt. Informatyka Nauka Technikum Raport Nr 39 Z 1975 R. Bell Laboratories. Murray Hill, New Jersey.

  • Lex & yacc. John R. Levine, Tony Mason, Doug Brown.
    O ' Reilly & Associates. 1995.

  • Elementy teorii obliczeń. Harry R. Lewis, Christos H. Papadimitriou. Segunda Edición. Prentice Hall. 1998.

  • Un Algoritmo Eficiente para la Construcción del Grafo de Dependencia de Control.
    Salvador V. Cavadini.
    Trabajo Final de Grado para obtener el Título de Ingeniero en Computación.
    Facultad de Matemática Aplicada. U. C. S. E. 2001.

 7
Author: eKek0,
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
2014-02-28 23:52:55

Nie jest książką, ale dokumentem technicznym i niezwykle zabawnym doświadczeniem w nauce, jeśli chcesz dowiedzieć się więcej o kompilatorach (i metacompilerach)... Ta strona poprowadzi Cię przez budowanie całkowicie autonomicznego systemu kompilatora, który może kompilować się sam i inne języki:

Tutorial: Metacompilers Part 1

To wszystko jest oparte na niesamowitym małym 10-stronicowym artykule technicznym:

Val Schorre META II: kompilator zorientowany na składnię Język

Z 1964 roku. NauczyĹ ' em siÄ ™ z tego kompilatorăłw w 1970 roku. Jest taki oszałamiający moment, kiedy w końcu przekonasz się, jak kompilator może się zregenerować....

Znam autora strony z czasów studiów, ale nie mam z nią nic wspólnego.

 6
Author: Ira Baxter,
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
2014-03-01 00:09:29

Jest tu wiele dobrych odpowiedzi, więc pomyślałem, że dodam jeszcze jedną do listy:

Ponad dekadę temu dostałem książkę Project Oberon, która ma bardzo dobrze napisany tekst na kompilatorze. Książka naprawdę wyróżnia się tym, że źródło i wyjaśnienia są bardzo praktyczne i czytelne. Cały tekst (wydanie z 2005 roku) został udostępniony w formacie pdf, więc można go już teraz pobrać. Kompilator jest omówiony w rozdziale 12:

Http://www.ethoberon.ethz.ch/WirthPubl/ProjectOberon.pdf

Niklaus Wirth, Jürg Gutknecht

(zabieg nie jest tak obszerny jak jego książka o kompilatorach)

Przeczytałem kilka książek o kompilatorach i mogę poprzeć książkę dragon, czas spędzony nad tą książką jest bardzo wartościowy.

 6
Author: tovare,
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
2019-12-04 14:38:41

Podobał mi się również Crenshaw tutorial, ponieważ pokazuje to absolutnie jasno, że kompilator jest po prostu kolejnym programem, który odczytuje niektóre dane wejściowe i zapisuje niektóre z nich.

Przeczytaj.

Pracuj, jeśli chcesz, ale spójrz na inne odniesienie, jak większe i bardziej kompletne Kompilatory są naprawdę napisane.

I przeczytaj o zaufaniu zaufania , aby uzyskać podpowiedź o nieoczywistych rzeczach, które można zrobić w tej dziedzinie.

 5
Author: dmckee,
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
2008-09-02 04:52:41

Jeśli jesteś zainteresowany napisaniem kompilatora dla języka funkcyjnego (a nie proceduralnego) Simon Peyton-Jones i David Lester "Implementing functional languages: a tutorial " jest doskonałym przewodnikiem.

Koncepcyjne podstawy działania oceny funkcjonalnej są oparte na przykładach w prostym, ale potężnym języku funkcjonalnym zwanym "rdzeniem". Dodatkowo, każda część kompilatora języka Core jest wyjaśniona przykładami kodu w Mirandzie (czysta funkcjonalność język bardzo podobny do Haskella).

Opisano kilka różnych typów kompilatorów, ale nawet jeśli stosujesz tylko tak zwany kompilator szablonów dla Core ' a, będziesz miał doskonałe zrozumienie tego, co sprawia, że programowanie funkcyjne jest właściwe.

 5
Author: Mark Reid,
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
2008-10-01 09:30:26

Możesz używać BCEL przez Apache Software Foundation. Za pomocą tego narzędzia możesz wygenerować kod podobny do asemblera, ale jest to Java z API BCEL. Możesz dowiedzieć się, jak wygenerować kod języka pośredniego (w tym przypadku kod bajtowy).

Prosty przykład

  1. Utwórz klasę Javy z tą funkcją:

    public String maxAsString(int a, int b) {
        if (a > b) {
            return Integer.valueOf(a).toString();
        } else if (a < b) {
            return Integer.valueOf(b).toString();
        } else {
            return "equals";
        }
    }
    

Teraz uruchom BCELifier z tą klasą

BCELifier bcelifier = new BCELifier("MyClass", System.out);
bcelifier.start();

Możesz zobaczyć wynik na konsoli dla całej klasy (jak zbudować kod bajtowy MyClass.java). Kod dla funkcji jest następujący:

private void createMethod_1() {
  InstructionList il = new InstructionList();
  MethodGen method = new MethodGen(ACC_PUBLIC, Type.STRING, new Type[] { Type.INT, Type.INT }, new String[] { "arg0", "arg1" }, "maxAsString", "MyClass", il, _cp);

  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load first parameter to address 1
  il.append(InstructionFactory.createLoad(Type.INT, 2)); // Load second parameter to adress 2
    BranchInstruction if_icmple_2 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPLE, null); // Do if condition (compare a > b)
  il.append(if_icmple_2);
  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load value from address 1 into the stack
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_13 = il.append(InstructionFactory.createLoad(Type.INT, 1));
  il.append(InstructionFactory.createLoad(Type.INT, 2));
    BranchInstruction if_icmpge_15 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPGE, null); // Do if condition (compare a < b)
  il.append(if_icmpge_15);
  il.append(InstructionFactory.createLoad(Type.INT, 2));
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_26 = il.append(new PUSH(_cp, "equals")); // Return "equals" string
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  if_icmple_2.setTarget(ih_13);
  if_icmpge_15.setTarget(ih_26);
  method.setMaxStack();
  method.setMaxLocals();
  _cg.addMethod(method.getMethod());
  il.dispose();
}
 5
Author: timaschew,
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
2014-03-01 00:06:24

Na razie nie ma tej książki:

Podstawy projektowania kompilatorów (Torben Mogensen) (z Wydz. Informatyka, Uniwersytet Kopenhaski)

Jestem również zainteresowany poznaniem kompilatorów i planuję wejść do tej branży w ciągu najbliższych kilku lat. Ta książka jest idealną książką teoretyczną, aby rozpocząć naukę kompilatorów, o ile widzę. Jest to bezpłatne kopiowanie i powielanie, czysto i starannie napisane i daje Ci je w prosty Angielski bez żadnego kodu, ale nadal prezentuje mechanikę za pomocą instrukcji i schematów itp. Warto zajrzeć imo.

 4
Author: magneto12321,
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
2014-03-12 16:05:11