2010-10-15 16 views
10

Powiel możliwe:
Learning to write a compilerJak napisać prosty kompilator w C/++?

Hi przepełnienia stosu, teraz nie zrozumcie mnie źle, nie mam zamiaru napisać kompilator C++ (chociaż mam zamiar ją napisać w C++) lub Java lub innym skomplikowanym języku programowania wysokiego poziomu. Chcę po prostu nauczyć się podstaw konwertowania podstawowego zestawu instrukcji na plik wykonywalny systemu Windows (powiedzmy, prosty język z 5-6 funkcjami, całkowicie niestandardowy). Również nie chcę pobierać żadnych bibliotek ani plików nagłówkowych. Gdybyś mógł połączyć mnie z jakimkolwiek bardzo podstawowym źródłem lub tutorialami z przykładami, byłoby to bardzo cenne!

+0

To jest coś, czego nigdy naprawdę nie był w stanie znaleźć coś wyjaśniający. Przepraszam, że spowodowałem facepalm = ( – Cr15py

+2

Primordial wersja [Nauka pisania kompilatora] (http://stackoverflow.com/q/1669/2509) .Dla prostego chcesz samouczek Crenshaw, ale dla prostych również nie * * chcę zrobić C++ ... – dmckee

+0

@dmckee +1 na nie chcącym C++ - kompilatory, które są na tyle zaawansowane, że potrzebują drzewa parse, wymagają wielu manipulacji drzewem i C++ (i Java, i prawie każdy język poza ML/Haskell rodzina i podobnie inspirowane języki, takie jak Scala) naprawdę cuchnie manipulacjami drzewami –

Odpowiedz

6

Jack Crenshaw na Let's Build a Compiler jest dobry tutorial, aby rozpocząć mecz. Jest dobrym pisarzem i sprawia, że ​​temat jest łatwy do zrozumienia.

4

Oto, co trzeba napisać podstawowy kompilator:

  1. Parser. Będziesz musiał przeanalizować swój język i utworzyć drzewo składni abstrakcyjnej. Możesz dowiedzieć się o pisaniu analizatorów składni. Możesz ręcznie zakodować parser lub użyć generatorów analizatora składni, np. Lex/yacc.
  2. Montaż. Będziesz musiał wygenerować instrukcje montażu z drzewa składniowego.
  3. Zestaw instrukcji. Będziesz musiał przetłumaczyć złożenie na kod maszynowy, w pewnym specyficznym zestawie instrukcji (typowy procesor Intel i AMD używa zestawu instrukcji x86, alternatywnie możesz wybrać zestaw instrukcji Java VM lub IL aplikacji .NET).
+2

-1 Lex nie jest analizatorem składni .. – alternative

+0

@mathepic: Nie twierdzą, że był to parser. –

+0

Zamierzałem powiedzieć generator parsera. – alternative

4

Aby przeprowadzić analizę danych wejściowych, należy przeczytać na recursive descent parsing (są to prawdopodobnie najprostszy parser wręczyć implementacji), choć należy również lexer jakiegoś produkować znaki dla parsera. Mogą być kodowane ręcznie (zrobiłem to), chociaż łatwiej jest użyć generatora lexerów, takiego jak lex lub flex.

Po analizowany wejście, trzeba będzie przekształcić go w odpowiednim wyjściem. Nie mogę ci tam wiele pomóc, ponieważ nie znam dobrze systemu narzędzi Windows. "Łatwym" sposobem jest generowanie zespołu i uruchamianie go przez NASM, MASM lub jakikolwiek asembler jest dostarczany z twoim środowiskiem kompilatora. Jeśli twój język jest wystarczająco prosty, możesz po prostu wygenerować złożenie w kodzie parsera.

+0

Dzięki człowieku, osobiście powodem, dla którego próbuję się tego nauczyć (i powodem, dla którego nienawidzę bibliotek) jest to, że uwielbiam sam pisać rzeczy i jest to temat, który chcę zrozumieć. Lexing i takie rozumiem, to ten tajemniczy punkt, w którym tekst przechodzi od tekstu do kodu wykonywalnego. Z drugiej strony chciałbym podziękować za link. – Cr15py

0

Polecam www.antlr.org. Pracowałem w C#, ale ma wsparcie dla C, Java, Python i więcej.

2

Właściwie, najważniejszą rzeczą, jakiej potrzebujesz, jest znalezienie binarnego formatu plików .exe (chyba, że ​​planujesz użyć istniejącego linkera, w którym to momencie myślę, że musisz tworzyć pliki obj, które również mają binarną format).

Należy również do czynienia z dużą ilością zgromadzeń, chyba że są już bardzo znane z zestawu instrukcji x86, chciałbym spróbować czegoś innego.

Oto kilka możliwości:

  • Kiedyś coś o nazwie "Tiny C" - Zgaduję, to jest to: http://bellard.org/tcc. Tiny C jest wystarczająco dobrym kompilatorem do zbudowania, ale nie tak skomplikowanym, że trudno go zrozumieć. Jest to prosta instrukcja "Jak zbudować kompilator" w pudełku. Zszokowany tym w 8088.

  • Dane wyjściowe dla "osadzonego" procesora. Mają zwykle proste języki asemblerowe i bardzo wyraźnie zdefiniowane formaty plików wykonywalnych. To byłoby dobre miejsce na rozpoczęcie.

  • Wyjście C-kod zamiast pliku binarnego. To na pewno oszust, ale możesz skoncentrować się na swoim języku i nie martwić się zbytnio o język asemblera.

  • Wreszcie, jeśli naprawdę chcesz bezpośrednio utworzyć .exe, najpierw napisz aplikację, która tworzy plik exe "Hello world". Nie przejmuj się, że to wszystko "zmodyfikuj", po prostu ręcznie edytuj kod, wprowadź go do formatu exe i uruchom - w ten sposób ZNAJDZIESZ, że wszystkie twoje bity ustawiłeś w odpowiednie miejsca, a potem może zacząć z kompilatorem z pewną pewnością.

Po tym, następnie tworzenie języka można dokonać przez wiele procedur podanych tutaj - ale jeśli chcesz po prostu zobaczyć, jak to wszystko działa, to bym na pewno zrobić kilka małych iteracji po pierwsze, nie przejmuj się tym, co napotkasz, dopóki się na nie nie natkniesz.

0

Aby dowiedzieć się, jak budować kompilator jest inny w C++ niż w, powiedzmy, C lub Pascal, wypróbuj framework Boost Spirit Boost.

Zakłada to znajomość C++.

Aby dowiedzieć się więcej o tworzeniu kompilatora, sugeruję użycie prostszego języka niż C++, a następnie być może przejście do C++.

Cheers & HTH.,