Samouczek projektowania kompilatorów: Co to jest, Typy, Narzędzia, 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. Przekłada on kod napisany w jednym języku programowania na inny język bez zmiany znaczenia kodu. Kompilator tworzy również wydajny kod końcowy, który jest zoptymalizowany pod kątem czasu wykonania i miejsca w pamięci.
Proces kompilacji obejmuje podstawowe mechanizmy tłumaczenia i wykrywania błędów. Proces kompilacji przechodzi przez analizę leksykalną, składniową i semantyczną na froncie oraz generowanie i optymalizację kodu na zapleczu.
W tym poradniku projektowania kompilatorów, dowiesz się
- Co to jest kompilator?
- Features of Compilers
- Types of Compiler
- Tasks of Compiler
- History of Compiler
- Steps for Language processing systems
- Compiler Construction Tools
- Why use a Compiler?
- Application of Compilers
Features of Compilers
- Correctness
- Speed of compilation
- Preserve the correct the meaning of the code
- The speed of the target code
- Recognize legal and illegal program constructs
- Good error reporting/handling
- Code debugging help
Types of Compiler
Following are the different types of Compiler:
- Single Pass Compilers
- Two Pass Compilers
- Multipass Compilers
Single Pass Compiler
![Single Pass Compiler](https://www.guru99.com/images/1/020819_1135_CompilerDes2.png)
In single pass Compiler source code directly transforms into machine code. For example, Pascal language.
Two Pass Compiler
![Two Pass Compiler](https://www.guru99.com/images/1/020819_1135_CompilerDes4.png)
Two pass Compiler is divided into two sections, viz.
- Front end: It maps legal code into Intermediate Representation (IR).
- Back end: It maps IR onto the target machine
The Two pass compiler method also simplifies the retargeting process. It also allows multiple front ends.
Multipass Compilers
![Multipass Compilers](https://www.guru99.com/images/1/020819_1135_CompilerDes5.png)
Kompilator multipassowy przetwarza kod źródłowy lub drzewo składni programu kilka razy. Dzieli duży program na wiele małych programów i przetwarza je. Opracowuje wiele kodów pośrednich. Wszystkie te multipassy biorą dane wyjściowe z poprzedniej fazy jako dane wejściowe. Wymaga więc mniej pamięci. Jest on również znany jako 'szeroki kompilator’.
Zadania kompilatora
Główne zadania wykonywane przez kompilator to:
- Rozbija program źródłowy na części i nakłada na nie strukturę gramatyczną
- Umożliwia skonstruowanie pożądanego programu docelowego z reprezentacji pośredniej, a także utworzenie tablicy symboli
- Kompiluje kod źródłowy i wykrywa w nim błędy
- Zarządza przechowywaniem wszystkich zmiennych i kodów.
- Wsparcie dla oddzielnej kompilacji
- Czytanie, analizowanie całego programu i tłumaczenie na semantycznie równoważny
- Tłumaczenie kodu źródłowego na kod obiektowy w zależności od typu maszyny
Historia kompilatora
Ważne punkty orientacyjne historii kompilatora są następujące:
- Słowo „kompilator” zostało po raz pierwszy użyte na początku lat pięćdziesiątych przez Grace Murray Hopper
- Pierwszy kompilator został zbudowany przez Johna Backuma i jego grupę w latach 1954-1957 w IBM
- COBOL był pierwszym językiem programowania, który został skompilowany na wielu platformach w 1960 roku
- Badania nad zagadnieniami skanowania i parsowania były kontynuowane w latach sześćdziesiątych i siedemdziesiątych w celu dostarczenia kompletnego rozwiązania
Kroki do systemów przetwarzania języka
Przed poznaniem koncepcji kompilatorów, musisz najpierw zrozumieć kilka innych narzędzi, które współpracują z kompilatorami.
![Kroki dla systemów przetwarzania języka](https://www.guru99.com/images/1/020819_1135_CompilerDes6.png)
- Preprocesor: Preprocesor jest uważany za część Kompilatora. Jest to narzędzie, które produkuje dane wejściowe dla Kompilatora. Zajmuje się przetwarzaniem makr, rozszerzaniem, rozszerzaniem języka itp.
- Interpreter: Interpreter jest jak Kompilator, który tłumaczy język wysokiego poziomu na język maszynowy niskiego poziomu. Główna różnica między nimi polega na tym, że interpreter czyta i przekształca kod linia po linii. Kompilator czyta cały kod na raz i tworzy kod maszynowy.
- Asembler: Tłumaczy kod języka asemblera na język zrozumiały dla maszyny. Wynik wyjściowy asemblera jest znany jako plik obiektowy, który jest kombinacją instrukcji maszynowych oraz danych wymaganych do przechowywania tych instrukcji w pamięci.
- Linker: Linker pomaga łączyć i scalać różne pliki obiektowe w celu utworzenia pliku wykonywalnego. Wszystkie te pliki mogły zostać skompilowane za pomocą oddzielnych asemblerów. Głównym zadaniem linkera jest wyszukiwanie nazwanych modułów w programie i znalezienie miejsca w pamięci, gdzie wszystkie moduły są przechowywane.
- Loader: Loader jest częścią systemu operacyjnego, która wykonuje zadania ładowania plików wykonywalnych do pamięci i ich uruchamiania. Oblicza on również rozmiar programu, który tworzy dodatkowe miejsce w pamięci.
- Kompilator krzyżowy: Kompilator krzyżowy w projektowaniu kompilatorów jest platformą, która pomaga w generowaniu kodu wykonywalnego.
- Kompilator źródło do źródła: Source to source compiler jest terminem używanym, gdy kod źródłowy jednego języka programowania jest tłumaczony na źródło innego języka.
Narzędzia do konstruowania kompilatorów
Narzędzia do konstruowania kompilatorów zostały wprowadzone wraz z rozprzestrzenianiem się technologii związanych z komputerami na całym świecie. Znane są one również jako kompilatory, kompilatory-generatory lub translatory.
Narzędzia te używają specyficznego języka lub algorytmu do określenia i implementacji składnika kompilatora. Poniżej przedstawiono przykładowe narzędzia do budowy kompilatorów.
- Generatory skanerów: To narzędzie przyjmuje wyrażenia regularne jako dane wejściowe. Na przykład LEX dla systemu operacyjnego Unix.
- Silniki tłumaczenia kierowanego składnią: Te narzędzia programowe oferują kod pośredni za pomocą drzewa parse. Jego celem jest powiązanie jednego lub więcej tłumaczeń z każdym węzłem drzewa parseków.
- Generatory parserów: Generator parsera przyjmuje gramatykę jako dane wejściowe i automatycznie generuje kod źródłowy, który może parsować strumienie znaków z pomocą gramatyki.
- Automatyczne generatory kodu: Pobiera kod pośredni i konwertuje go na język maszynowy
- Silniki przepływu danych: To narzędzie jest pomocne w optymalizacji kodu. Tutaj informacje są dostarczane przez użytkownika, a kod pośredni jest porównywany w celu przeanalizowania wszelkich relacji. Jest to również znane jako analiza przepływu danych. Pomaga dowiedzieć się, w jaki sposób wartości są przekazywane z jednej części programu do innej części.
Dlaczego warto używać kompilatora?
- Kompilator weryfikuje cały program, więc nie ma błędów składniowych lub semantycznych
- Plik wykonywalny jest optymalizowany przez kompilator, więc wykonuje się szybciej
- Pozwala na tworzenie wewnętrznej struktury w pamięci
- Nie ma potrzeby wykonywania programu na tej samej maszynie, na której został zbudowany
- Tłumaczenie całego programu na inny język
- Generowanie plików na dysku
- Podlinkowanie plików do formatu wykonywalnego
- Sprawdzenie błędów składni i typów danych
- Pomaga w lepszym zrozumieniu semantyki języka
- Pomaga w radzeniu sobie z problemami wydajności języka
- Szansa na nietrivial programming project
- The techniques used for constructing a compiler can be useful for other purposes as well
Application of Compilers
- Compiler design helps full implementation Of High-Level Programming Languages
- Support optimization for Computer Architecture Parallelism
- Design of New Memory Hierarchies of Machines
- Widely used for Translating Programs
- Used with other Software Productivity Tools
Summary
- A compiler is a computer program which helps you transform source code written in a high-level language into low-level machine language
- Correctness, szybkość kompilacji, zachowanie poprawnego znaczenia kodu to niektóre ważne cechy projektu kompilatora
- Kompilatory dzielą się na trzy części 1) Kompilatory jednoprzebiegowe 2) Kompilatory dwuprzebiegowe, oraz 3) Kompilatory wieloprzebiegowe
- Słowo „kompilator” zostało po raz pierwszy użyte na początku lat 50-tych przez Grace Murray Hopper
- Kroki systemu przetwarzania języka to: Preprocesor, Interpreter, Asembler, Linker/Loader
- Ważne narzędzia do budowy kompilatora to: 1) Generatory skanerów, 2) Silniki translacji skierowanej składnia-3), 4) Generatory parserów, 5) Automatyczne generatory kodu
- Głównym zadaniem kompilatora jest weryfikacja całego programu, aby nie było w nim błędów składniowych i semantycznych
.