Co to jest projekt kompilatora? Rodzaje, narzędzia budowlane, przykład
Co to jest kompilator?
Kompilator to program komputerowy, który pomaga przekształcić kod źródłowy napisany w języku wysokiego poziomu na język maszynowy niskiego poziomu. Tłumaczy kod napisany w jednym języku programowania na inny język bez zmiany znaczenia kodu. Kompilator sprawia również, że kod końcowy jest wydajny, zoptymalizowany pod kątem czasu wykonania i przestrzeni pamięci.
Proces kompilacji obejmuje podstawowe mechanizmy tłumaczenia i wykrywanie błędów. Proces kompilatora przechodzi przez analizę leksykalną, składniową i semantyczną na froncie oraz generowanie i optymalizację kodu na zapleczu.
Funkcje kompilatorów
- Poprawność
- Szybkość kompilacji
- Zachowaj prawidłowe znaczenie kodu
- Szybkość kodu docelowego
- Rozpoznawanie legalnych i nielegalnych konstrukcji programów
- Dobre raportowanie/obsługa błędów
- Pomoc w debugowaniu kodu
Rodzaje kompilatorów
Poniżej przedstawiono różne typy kompilatorów:
- Kompilatory jednoprzebiegowe
- Kompilatory dwuprzebiegowe
- Kompilatory wieloprzebiegowe
Kompilator jednoprzebiegowy
W pojedynczym przebiegu kod źródłowy kompilatora bezpośrednio przekształca się w kod maszynowy. Na przykład język Pascal.
Kompilator dwuprzebiegowy
Kompilator dwuprzebiegowy jest podzielony na dwie sekcje, mianowicie:
- Przód: Odwzorowuje kod prawny na reprezentację pośrednią (IR).
- Zaplecze: Mapuje IR na maszynę docelową
Metoda kompilatora dwuprzebiegowego upraszcza również proces retargetingu. Umożliwia także wiele frontendów.
Kompilatory wieloprzebiegowe
Kompilator wieloprzebiegowy przetwarza kod źródłowy lub drzewo składni programu kilka razy. Podzielił duży program na wiele małych programów i przetworzył je. Rozwija wiele kodów pośrednich. Wszystkie te układy wieloprzebiegowe pobierają sygnał wyjściowy z poprzedniej fazy jako sygnał wejściowy. Dlatego wymaga mniej pamięci. Jest również znany jako „szeroki kompilator”.
Zadania kompilatora
Główne zadania realizowane przez Kompilator to:
- Dzieli program źródłowy na części i narzuca im strukturę gramatyczną
- Umożliwia skonstruowanie żądanego programu docelowego na podstawie reprezentacji pośredniej, a także utworzenie tablicy symboli
- Kompiluje kod źródłowy i wykrywa w nim błędy
- Zarządzaj przechowywaniem wszystkich zmiennych i kodów.
- Obsługa osobnej kompilacji
- Przeczytaj, przeanalizuj cały program i przetłumacz na semantycznie równoważny
- Tłumaczenie kodu źródłowego na kod obiektowy w zależności od typu maszyny
Historia kompilatora
Ważny punkt orientacyjny w historii kompilatora jest następujący:
- Słowo „kompilator” zostało po raz pierwszy użyte na początku lat pięćdziesiątych XX wieku przez Grace Murray Hopper.
- Pierwszy kompilator został zbudowany przez Johna Backuma i jego grupę w latach 1954-1957 w IBM.
- COBOL był pierwszy język programowania który został skompilowany na wiele platform w 1960 roku
- W latach sześćdziesiątych i siedemdziesiątych XX wieku kontynuowano badania problemów skanowania i analizowania, aby zapewnić kompletne rozwiązanie.
Kroki dla systemów przetwarzania języka
Zanim poznasz koncepcję kompilatorów, musisz najpierw zapoznać się z kilkoma innymi narzędziami, które współpracują z kompilatorami.
- Preprocesor: Preprocesor jest uważany za część kompilatora. Jest to narzędzie, które generuje dane wejściowe dla kompilatora. Zajmuje się przetwarzaniem makr, rozszerzaniem, rozszerzaniem języka itp.
- Interpretator: Interpreter jest jak kompilator, który tłumaczy język wysokiego poziomu na język maszynowy niskiego poziomu. Główną różnicą między obydwoma jest to, że interpreter czyta i przekształca kod linia po linii. Kompilator odczytuje cały kod na raz i tworzy kod maszynowy.
- Assembler: Tłumaczy kod języka asemblera na język zrozumiały dla maszyny. Wynik asemblera jest znany jako plik obiektowy, który jest kombinacją instrukcji maszynowych, a także danych wymaganych do przechowywania tych instrukcji w pamięci.
- Linki: Linker pomaga łączyć i łączyć różne pliki obiektowe w celu utworzenia pliku wykonywalnego. Wszystkie te pliki mogły zostać skompilowane przy użyciu oddzielnych asemblerów. Głównym zadaniem linkera jest wyszukiwanie wywoływanych modułów w programie i znajdowanie miejsca w pamięci, w którym przechowywane są wszystkie moduły.
- Ładowarka: Moduł ładujący jest częścią systemu operacyjnego, która wykonuje zadania ładowania plików wykonywalnych do pamięci i ich uruchamiania. Oblicza również rozmiar programu, który tworzy dodatkową przestrzeń pamięci.
- kompilator krzyżowy: Kompilator krzyżowy w projektowaniu kompilatorów to platforma, która pomaga generować kod wykonywalny.
- Kompilator źródło-źródło: Kompilator źródła do źródła to termin używany, gdy kod źródłowy jednego języka programowania jest tłumaczony na kod źródłowy innego języka.
Narzędzia konstrukcyjne kompilatora
Narzędzia do budowy kompilatorów zostały wprowadzone, gdy technologie komputerowe rozprzestrzeniły się na całym świecie. Są one również znane jako kompilatory-kompilatory, kompilatory-generatory lub tłumacze.
Te narzędzia używają określonego języka lub algorytmu do określania i implementowania komponentu kompilatora. Poniżej przedstawiono przykład narzędzi do konstrukcji kompilatora.
- Generatory skanerów: To narzędzie pobiera jako dane wejściowe wyrażenia regularne. Na przykład LEX dla Uniksa OperaSystem tingu.
- Silniki tłumaczące sterowane składnią: Te narzędzia programowe zaoferuj kod pośredni za pomocą drzewa analizy. Ma na celu powiązanie jednego lub więcej tłumaczeń z każdym węzłem drzewa analizy.
- Generatory parserów: Generator parsera przyjmuje gramatykę jako dane wejściowe i automatycznie generuje kod źródłowy, który może analizować strumienie znaków za pomocą gramatyki.
- Automatyczne generatory kodów: pobiera kod pośredni i konwertuje go na język maszynowy.
- Silniki przepływu danych: To narzędzie jest pomocne przy optymalizacji kodu. Tutaj informacje są dostarczane przez użytkownika, a kod pośredni jest porównywany w celu analizy dowolnej relacji. Nazywa się ją również analizą przepływu danych. Pomaga dowiedzieć się, w jaki sposób wartości są przesyłane z jednej części programu do drugiej.
Po co używać kompilatora?
- Kompilator weryfikuje cały program, więc nie ma błędów składniowych ani semantycznych.
- Plik wykonywalny jest optymalizowany przez kompilator, dzięki czemu jest wykonywany szybciej.
- Umożliwia tworzenie wewnętrznej struktury w pamięci.
- Nie ma potrzeby uruchamiania programu na tej samej maszynie, na której został zbudowany.
- Przetłumacz cały program na inny język.
- Wygeneruj pliki na dysku.
- Połącz pliki w formacie wykonywalnym.
- Sprawdź błędy składniowe i typy danych.
- Pomaga poprawić zrozumienie semantyki języka.
- Pomaga w rozwiązywaniu problemów z wydajnością języka.
- Możliwość realizacji nietrywialnego projektu programistycznego.
- Techniki stosowane do konstruowania kompilatora mogą być przydatne również do innych celów.
Zastosowanie kompilatorów
- Projekt kompilatora pomaga w pełnej implementacji języków programowania wysokiego poziomu.
- Optymalizacja wsparcia dla komputera ArchiRównoległość architektury.
- Projektowanie nowych hierarchii pamięci maszyn.
- Szeroko stosowany w tłumaczeniu programów.
- Używany z innymi programowymi narzędziami zwiększającymi produktywność.
Podsumowanie
- Kompilator to program komputerowy, który pomaga przekształcić kod źródłowy napisany w języku wysokiego poziomu na język maszynowy niskiego poziomu.
- Poprawność, szybkość kompilacji, zachowanie prawidłowego znaczenia kodu to tylko niektóre ważne cechy projektu kompilatora.
- Kompilatory są podzielone na trzy części: 1) Kompilatory jednoprzebiegowe, 2) Kompilatory dwuprzebiegowe i 3) Kompilatory wieloprzebiegowe.
- Słowo „kompilator” zostało po raz pierwszy użyte na początku lat pięćdziesiątych XX wieku przez Grace Murray Hopper.
- Kroki systemu przetwarzania języka to: Preprocesor, Interpreter, Asembler, Linker/Loader.
- Ważnymi narzędziami do tworzenia kompilatorów są: 1) generatory skanerów, 2) silniki tłumaczeń kierunkowych składni, 3) generatory parserów, 4) generatory parserów, 5) automatyczne generatory kodu.
- Głównym zadaniem kompilatora jest weryfikacja całego programu, tak aby nie było błędów składniowych i semantycznych.