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
In single pass Compiler source code directly transforms into machine code. For example, Pascal language.
Two Pass Compiler
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
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.
- 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
.