Skip to content
This repository has been archived by the owner on Sep 19, 2020. It is now read-only.
/ latte Public archive

Latte compiler for Compiler Construction @ University of Warsaw

Notifications You must be signed in to change notification settings

starsep/latte

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

62 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Filip Czaplicki fc359081@students.mimuw.edu.pl

Build Status

Kompilacja

Program kompiluje się po wykonaniu make. Za pomocą bnfc, happy oraz alex generowane jest z gramatyki część źródeł. Napisany przeze mnie kod wraz z wygenerowanym kompilowany jest przez ghc. W korzeniu projektu powstaje binarka Latte.

Uruchamianie programu

Program Latte przyjmuje jako parametry:

  • ścieżkę do pliku źródłowego
  • (opcjonalnie) flagę -O0 (słownie: minus o zero), która wyłącza optymalizacje

Wynik wypisuje na standardowe wyjście. Jest to 64-bitowy asembler notacji Intela, implementacja NASM.

Napisałem także dwa skrypty bashowe odpalające Latte: latc oraz latc_x86_64. Działają one zgodnie ze specyfikacją zadania.

Narzędzia i biblioteki

Struktura projektu

  • src
    • Backend
      • Asm.hs - definicje typów/funkcji związanych z asemblerem
      • Compiler.hs - główny plik backendu kompilatora
      • EmitClass.hs - generowanie kodu klas
      • EmitClass.hs-boot - plik nagłówkowy dla EmitClass.hs
      • EmitExpr.hs - generowanie kodu dla wyrażeń
      • EmitFunction.hs - generowanie kodu funkcji/metod
      • EmitStmt.hs - generowanie kodu dla wyrażeń
      • GC.hs - kod związany z Garbage Collection
      • Label.hs - asemblerowe etykiety
      • Locals.hs - liczenie ile potrzeba pamięci na zmienne lokalne
      • Optimize.hs - optymalizacje
      • State.hs - "stan" kompilacji
    • Frontend
      • Assert.hs - wszelakie asserty
      • Check.hs - główny plik frontendu
      • Classes.hs - sprawdzanie klas, dziedziczenia itp.
      • Classes.hs-boot - plik nagłówkowy dla Classes.hs
      • Context.hs - kontekst błędu
      • Env.hs - "środowisko" - stan frontendu, częściowo używany w backendzie
      • Errors.hs - funkcje pomocnicze do wypisywania błędów
      • Functions.hs - sprawdzenie funkcji/metod
      • Print.hs - funkcji pomocnicze związane z wypisywaniem błędów
      • Print.hs-boot - plik nagłówkowy dla Print.hs
      • Pure.hs - funkcje czyste, niekorzystające z monad
      • Typecheck.hs - statyczna analiza kodu
      • Typecheck.hs-boot - plik nagłówkowy dla Typecheck.hs
    • Main.hs - główny plik kompilatora, obsługa IO, argumentów itp.
    • Latte.cf - gramatyka języka
  • lib
    • runtime.c - implementacja funkcji printInt itp. oraz wewnętrznie używanych
  • latc
  • latc_x86_64
  • Makefile
  • README

Optymalizacje

Optymalizacje zaimplementowane są w src/Backend/Optimize.hs. Funkcja:

  • optimizeStmt robi "peephole optimization", lokalnie zastępuje instrukcje, usuwa niepotrzebne
  • removeUnusedLabels usuwa nieużywane etykiety
  • removeDeadCode usuwa martwy kod przy użyciu dfsa po instrukcjach asemblera.
  • optimizeOnce jest złożeniem tych funkcji.
  • optimize odpala optimizeOnce aż do uzyskanie punktu stałego

Zapożyczenia

Moje projekty:

Testy z https://github.com/tomwys/mrjp-tests

About

Latte compiler for Compiler Construction @ University of Warsaw

Resources

Stars

Watchers

Forks

Packages

No packages published