Zamknięte . To pytanie musi być bardziej
skoncentrowane . Obecnie nie przyjmuje odpowiedzi.
Komentarze
Odpowiedź
Powiedzmy, że piszesz nowy język programowania o nazwie „XYZ”. Pierwszym krokiem jest napisanie kompilatora dla tego języka. Ponieważ ten nowy język jeszcze nie istnieje, kompilator piszesz w… powiedzmy java. Nazwijmy go jxyz. Wykonanie tego procesu to typowe zajęcia na uczelni .
Teraz masz program java (jxyz), który pobiera plik źródłowy XYZ i tworzy plik wykonywalny. Można wtedy napisać kompilator dla XYZ w XYZ, który jest zgodny z jxyz.
W tym momencie masz kompilator dla XYZ zgodny z jxyz. Nazwij ten program „xyzFromJ”.
„xyzFromJ” powinien być w stanie przyjąć siebie jako dane wejściowe i skompilować się całkowicie, usuwając wszystko, co zostało utworzone przez jxyz z zależności i definicji języka. Od tego momentu wszelkie zmiany w języku XYZ można wprowadzać na kompilatorze napisanym w XYZ i skompilowanym przy jego użyciu.
Odpowiedź
Krok 1. Napisz kompilator w innym języku.
Krok 2. Skompiluj kod z kroku 1.
Krok 3. Napisz kompilator w tym samym języku.
Krok 4. Skompiluj kod z krok 3.
Powtórz kroki 3-4, aby uzyskać dalsze aktualizacje kompilatora.
Pamiętaj, że kroki 1 i 3 mogą być wykonywane jednocześnie lub w innej kolejności.
Przyznaję, że jest to bardzo duże uproszczenie.
Komentarze
Odpowiedź
W przeciwieństwie do innych odpowiedzi, które sugerują napisanie kompilatora w innym języku (prawdopodobnie taki, który działa na tej samej maszynie, na którą celujesz), możliwe jest również (właściwie preferowane) napisanie kompilatora w języku docelowym od samego początku.
Powiedzmy, że chcesz napisać kompilator dla C dla procesora ARM. Masz już kompilator C, który działa w systemie Windows (architektura Intel). Piszesz swój nowy kompilator w języku C, zarówno frontend (analiza leksykalna i parsowanie), jak i zaplecze (generowanie kodu). Oczywiście zaplecze jest napisane w celu generowania kodu dla ARM, a nie dla Intela.
Następnie kompilujesz źródło dla nowego kompilatora z istniejącym kompilatorem. Gdy będziesz zadowolony, że kompilator generuje prawidłowy kod dla ARM, bierzesz skompilowany kod ARM i uruchamiasz go na docelowej architekturze ARM. Masz teraz źródło nowego kompilatora, które można zmodyfikować i wprowadzić do jego pliku wykonywalnego i wygenerować nową wersję.
Ten proces nazywa się kompilacją krzyżową. Zaletą jest to, że masz tylko napisać kompilator raz.
Odpowiedź
z innej odpowiedzi:
Step 1. Write your compiler in a different language. Step 2. Compile the code from Step 1. Step 3. Write your compiler in the same language. Step 4. Compile the code from step 3.
Kroki 1 i 2 są potrzebne tylko dla „pierwszego w historii” kompilatora nowego języka. Istnieje wiele odmian kroków 3 i 4, więc na przykład możesz napisać generator kodu dla nowej architektury, cross compile, a następnie uruchom ten sam kompilator na nowej maszynie.Lub możesz rozszerzyć swój kompilator, aby obsługiwał nową składnię i konstrukcje bez używania żadnego z rozszerzeń, a następnie przepisać kompilator, aby używał rozszerzeń i skompilować się.