2012-01-01 12 views
36

Jaki byłby najprostszy sposób tworzenia kompilatora C dla niestandardowego procesora, zakładając oczywiście, że już mam do niego asembler?Jak utworzyć kompilator języka C dla niestandardowego procesora?

Ponieważ kompilator języka C generuje zestaw, czy istnieje sposób na zdefiniowanie standardowych bitów i fragmentów kodu zespołu dla różnych idiomów języka C, przebudowanie kompilatora i uzyskanie w ten sposób kompilatora krzyżowego dla docelowego sprzętu?

Najlepiej, aby sam kompilator był napisany w języku C i budowany jako natywny plik wykonywalny dla systemu Linux lub Windows.

Uwaga: Jestem nie z pytaniem, jak napisać sam kompilator. Podjąłem ten kurs na studiach, wiem o ogólnych kompilatorach kompilatorów itp. W tej sytuacji chciałbym skonfigurować niektóre istniejące ramy, jeśli to w ogóle możliwe. Nie chcę modyfikować języka, po prostu chcę mieć możliwość kierowania na dowolną architekturę. Jeśli odpowiedź okaże się "nie działa w ten sposób", , informacje będą przydatne dla mnie i dla każdego, kto mógłby założyć podobne założenia.

+4

Nie ma * podstawowego * wymagania, że ​​kompilator produkuje asembler: to tylko zwyczajna i wygodna praktyka. – dmckee

+0

@dmckee - załóżmy, że jest to wymagane w tym przypadku. Wiem, że są tacy w tej społeczności, którzy mieliby na to odpowiedź. Proszę zwrócić uwagę, że odpowiedź na to, o co pytam, to * nie * "idź na kurs pisania kompilatora". – JustJeff

+1

PS: Zakładając, że masz niestandardowy procesor, który jest tak nowy, nie masz nawet kompilatora. Skąd pochodzi system operacyjny? Co masz na myśli "natywny plik wykonywalny"? Natywne na * CO *?!? – paulsm4

Odpowiedz

29

Quick overview/tutorial on writing a LLVM backend.

Dokument ten opisuje techniki pisania backendów dla LLVM, który konwertuje reprezentację LLVM na kod zespołu maszyny lub inne języki.

[. . . ]

Aby utworzyć statyczny kompilator (jeden zespół, który emituje tekst), należy wdrożyć następujące:

  • opisywać zbiór rejestrów.
  • Opisz zestaw instrukcji.
  • Opisz maszynę docelową.
  • Zaimplementuj drukarkę zespołu dla architektury.
  • Wprowadź selektor instrukcji dla architektury.
+0

LLVM jest bardzo złożona i całkowicie nieudokumentowana. Nawet go nie dotykaj. To zmarnowało 1 miesiąc mojego życia. – Ehsan

+3

Jestem tą samą osobą, która opuściła poprzedni komentarz. Pracuję nad LLVM już od półtora roku. Mógłbym rozwinąć własny backend i złożyć. Tak, to zajmuje rok, aby zrozumieć infrastrukturę LLVM, ale myślę, że warto. – Ehsan

+1

@ Ehan Czy myślisz, że mógłbyś napisać jakąś dokumentację? :-D – wizzwizz4

8

Istnieje koncepcja kompilatora krzyżowego, tzn. Takiego, który działa na jednej architekturze, ale jest kierowany na inną. Możesz zobaczyć, jak GCC to robi (na przykład) i dodać nową architekturę do zestawu, jeśli jest to kompilator, który chcesz rozszerzyć.

Edit: Właśnie zauważył pytanie kilka lat temu na liście dyskusyjnej GCC, w jaki sposób dodać nowy cel i ktoś wskazał this

+0

Tak. Jak dodać nową architekturę? Proszę rozwinąć? – JustJeff

+1

Edytowano odpowiedź za pomocą linku. To trochę spory dokument, ale myślę, że to jest droga ... –

+1

Czy zdarzyło się, że * patrzy * na źródło GCC, aby zobaczyć, jak to działa? PS: * do * spójrz na źródło gcc, a * także * spójrz na LLVM. Myślę, że znajdziesz zarówno informacyjny ... – paulsm4

3

1) Krótka odpowiedź:

„Nie. Nie ma czegoś takiego jak«ram kompilatora», gdzie można po prostu dodać wodę (wtyk w swoim własnym zestawem montażowym), mieszać, i to się robi . "

2) Dłuższa odpowiedź: jest to z pewnością możliwe. Ale wyzwanie. I prawdopodobnie drogi.

Jeśli chcesz zrobić to sam, zacznę od spojrzenia na Gnu CC. Jest już dostępny dla wielu różnych procesorów i platform.

3) Spójrz na ten link, aby uzyskać więcej pomysłów (w tym idei „po prostu zbudować bibliotekę funkcji i makr”), która byłaby moja pierwsza sugestia:

http://www.instructables.com/answers/Custom-C-Compiler-for-homemade-instruction-set/

+1

Czy LLVM jest obecnie tak zwaną ramą "just add water"? –

3

Krótki odpowiedź brzmi, że nie działa w ten sposób.

Dłuższa odpowiedź polega na tym, że napisanie kompilatora dla nowego typu procesora wymaga pewnego wysiłku. Jednak nie trzeba tworzyć kompilatora od podstaw. Większość kompilatorów ma kilka przejść; Oto typowa architektura (możliwe są różne warianty):

  1. Analiza syntaktyczna (lexer i parser) oraz do wstępnego przetwarzania C, prowadząca do abstrakcyjnego drzewa składni.
  2. Sprawdzanie typu, prowadzące do drzewa składni z adnotacjami abstrakcji.
  3. Generowanie kodu pośredniego, co prowadzi do niezależnego od architektury kodu pośredniego. Niektóre optymalizacje są wykonywane na tym etapie.
  4. Generowanie kodu maszynowego, prowadzące do montażu lub bezpośrednio do kodu maszynowego. Na tym etapie przeprowadza się więcej optymalizacji.

W tym opisie tylko krok 4 jest zależny od urządzenia. Możesz więc wziąć kompilator, w którym krok 4 jest wyraźnie oddzielony i podłączyć swój własny krok 4. Wykonanie tego wymaga głębokiego zrozumienia procesora i zrozumienia wewnętrznych elementów kompilatora, ale nie musisz się martwić, co się dzieje wcześniej.

Prawie wszystkie procesory, które nie są bardzo małe, bardzo rzadkie lub bardzo stare, mają backend (krok 4) dla GCC. Główną dokumentacją do napisania backendu GCC jest GCC internals manual, w szczególności rozdziały na machine descriptions i target descriptions. GCC jest wolnym oprogramowaniem, więc nie ma żadnych opłat licencyjnych za jego używanie.

1

Można modyfikować istniejące kompilatory o otwartym kodzie źródłowym, takie jak GCC lub Clang. Inne odpowiedzi dostarczyły ci linki o tym, gdzie dowiedzieć się więcej. Ale te kompilatory nie są zaprojektowane w celu łatwego retuszowania; są "łatwiejsze" w porównaniu z kompilatorami niż inne kompilatory podłączone do określonych celów.

Ale jeśli chcesz kompilator, który jest stosunkowo łatwy do retargetowania, potrzebujesz takiego, w którym możesz określić architekturę maszyny w kategoriach bezpośrednich, a niektóre narzędzia generują resztę kompilatora (GCC robi to trochę; nie myśl, że Clang/LLVM robi dużo, ale mogę się mylić tutaj).

Jest wiele tego w literaturze, google "kompilator-kompilator".

Ale dla konkretnego rozwiązania dla C, powinieneś sprawdzić ACE, dostawcę kompilatorów, który generuje kompilatory na żądanie dla klientów. Nie za darmo, ale słyszę, że bardzo szybko produkują bardzo dobre kompilatory. Myślę, że produkuje standardowe pliki binarne (ELF?), Więc pomija etap asemblera. (Nie mam doświadczenia ani relacji z ACE.)

Jeśli nie zależy Ci na jakości kodu, możesz prawdopodobnie napisać tłumaczenie skierowane na syntezę C do asemblera za pomocą C AST. Możesz uzyskać C AST od GCC, Clang, może ANTLR, i od naszego DMS Software Reengineering Toolkit.

1

vbcc (na www.compilers.de) to dobry i prosty retargetable kompilator C napisany w C. Jest znacznie prostszy niż GCC/LLVM.Jest to tak proste, że mogłem ponownie ustawić kompilator na własny procesor z kilkutygodniową pracą bez wcześniejszej znajomości kompilatorów.

+0

Interesująca opcja. Zwykle ludzie nawet nie myślą o darmowych kompilatorach poza rodziną gcc/clang/llvm. Czy możesz trochę opracować dla OP na temat procesu przekierowywania? (np. czy istnieje jasno zdefiniowany pośredni etap "generycznego kodu maszynowego", od którego po prostu wpisujesz mniej lub bardziej bezpośrednio tłumacza do rzeczywistego zestawu instrukcji CPU?) – dodgethesteamroller

+0

Tak, front-koniec kompilatora VBCC generuje ogólny kod maszynowy sortów . Wywołuje funkcję back-end (te, które musisz napisać), aby przetłumaczyć te instrukcje na instrukcje dotyczące docelowego zespołu. Kompilator jest dość potężny i oferuje dobrą optymalizację. Uzyskanie działającego (choć niezbyt optymalizującego) zaplecza zajmuje bardzo mało czasu. Jeśli twoim celem jest osiągnięcie najlepszego kodu, to jest trochę trudniej. – dsula

Powiązane problemy