Projekt kompilatora - przegląd

Komputery to wyważona mieszanka oprogramowania i sprzętu. Sprzęt jest po prostu elementem mechanicznego urządzenia, a jego funkcjami steruje kompatybilne oprogramowanie. Sprzęt rozumie instrukcje w postaci opłaty elektronicznej, która jest odpowiednikiem języka binarnego w programowaniu oprogramowania. Język binarny ma tylko dwa alfabety, 0 i 1. Aby poinstruować, kody sprzętowe muszą być zapisane w formacie binarnym, czyli po prostu ciągiem jedynek i zer. Pisanie takich kodów byłoby trudnym i uciążliwym zadaniem dla programistów komputerowych, dlatego mamy kompilatory do pisania takich kodów.

System przetwarzania języka

Dowiedzieliśmy się, że każdy system komputerowy składa się ze sprzętu i oprogramowania. Sprzęt rozumie język, którego ludzie nie rozumieją. Dlatego piszemy programy w języku wysokiego poziomu, który jest nam łatwiejszy do zrozumienia i zapamiętania. Programy te są następnie wprowadzane do szeregu narzędzi i składników systemu operacyjnego, aby uzyskać żądany kod, który może być używany przez maszynę. Jest to znane jako system przetwarzania języka.

Język wysokiego poziomu jest konwertowany na język binarny w różnych fazach. ZAcompilerto program konwertujący język wysokiego poziomu na język asemblera. Podobnie plikassembler jest programem, który konwertuje język asemblera na język maszynowy.

Najpierw zrozumiemy, jak program wykorzystujący kompilator C jest wykonywany na maszynie hosta.

  • Użytkownik pisze program w języku C (język wysokiego poziomu).

  • Kompilator C, kompiluje program i tłumaczy go na program asemblera (język niskiego poziomu).

  • Następnie asembler tłumaczy program asemblera na kod maszynowy (obiekt).

  • Narzędzie konsolidatora służy do łączenia wszystkich części programu razem w celu wykonania (wykonywalny kod maszynowy).

  • Program ładujący ładuje je wszystkie do pamięci, a następnie program jest wykonywany.

Zanim zagłębimy się w koncepcje kompilatorów, powinniśmy zrozumieć kilka innych narzędzi, które ściśle współpracują z kompilatorami.

Preprocesor

Preprocesor, ogólnie uważany za część kompilatora, to narzędzie, które generuje dane wejściowe dla kompilatorów. Zajmuje się przetwarzaniem makr, rozszerzaniem, włączaniem plików, rozszerzaniem języka itp.

Interpretator

Tłumacz, podobnie jak kompilator, tłumaczy język wysokiego poziomu na język maszynowy niskiego poziomu. Różnica polega na sposobie, w jaki odczytują kod źródłowy lub dane wejściowe. Kompilator odczytuje od razu cały kod źródłowy, tworzy tokeny, sprawdza semantykę, generuje kod pośredni, wykonuje cały program i może obejmować wiele przebiegów. W przeciwieństwie do tego interpreter odczytuje instrukcję z wejścia, konwertuje ją na kod pośredni, wykonuje ją, a następnie przyjmuje następną instrukcję w kolejności. Jeśli wystąpi błąd, interpreter zatrzymuje wykonywanie i zgłasza to. podczas gdy kompilator czyta cały program, nawet jeśli napotka kilka błędów.

Monter

Asembler tłumaczy programy w języku asemblera na kod maszynowy. Wyjście asemblera nazywa się plikiem obiektowym, który zawiera kombinację instrukcji maszynowych oraz dane wymagane do umieszczenia tych instrukcji w pamięci.

Łącznik

Linker to program komputerowy, który łączy i łączy różne pliki obiektowe w celu utworzenia pliku wykonywalnego. Wszystkie te pliki mogły zostać skompilowane przez oddzielne asemblery. Głównym zadaniem konsolidatora jest wyszukanie i zlokalizowanie modułu / procedur w programie, do którego istnieją odwołania, oraz określenie lokalizacji pamięci, w której te kody zostaną załadowane, dzięki czemu instrukcja programu będzie miała odniesienia bezwzględne.

Ładowarka

Loader jest częścią systemu operacyjnego i jest odpowiedzialny za ładowanie plików wykonywalnych do pamięci i ich wykonywanie. Oblicza rozmiar programu (instrukcje i dane) i tworzy dla niego miejsce w pamięci. Inicjuje różne rejestry, aby zainicjować wykonanie.

Kompilator krzyżowy

Kompilator działający na platformie (A) i zdolny do generowania kodu wykonywalnego dla platformy (B) nazywany jest kompilatorem krzyżowym.

Kompilator źródła do źródła

Kompilator, który pobiera kod źródłowy jednego języka programowania i tłumaczy go na kod źródłowy innego języka programowania, nazywany jest kompilatorem typu source-to-source.