Komputery cyfrowe nie rozumieją języków, którymi posługują się ludzie. Zamiast tego używają języka binarnego zwanego kodem maszynowym lub językiem maszynowym. Kod maszynowy składa się z sekwencji prostych instrukcji komputerowych, z których każda jest wyrażona jako ciąg cyfr binarnych lub bitów (tj. 1 i 0). Różne komputery typowo „mówią” lub „rozumieją” różne języki maszynowe. Na przykład jeden komputer może reprezentować operację ADD jako 10011111, podczas gdy inny może reprezentować te same operacje jako 000110. Nie tylko wzory bitów są zazwyczaj różne w zależności od rodzaju komputera, ale nawet liczba bitów używanych do reprezentowania operacji może być różna.

Ponadto, gdy program jest uruchamiany, system operacyjny (np. Windows, Linux, OS X, itp.) działa jako środowisko hosta, który zapewnia usługi dla programu.Usługi te obejmują podstawowe wsparcie, takie jak dostęp do klawiatury, ekranu i dysków twardych. Niestety, sposób, w jaki program uzyskuje dostęp do tych usług jest również różny w zależności od systemu operacyjnego. W wyniku różnic między językami maszynowymi a wymaganiami systemu operacyjnego, programy napisane w języku maszynowym są bardziej skoncentrowane na systemie, w którym działa program, niż na tym, jak program rozwiązuje problem. Ponadto oznacza to również, że nie jest możliwe przenoszenie kodu maszynowego między różnymi komputerami bez zapewnienia pewnego rodzaju usługi tłumaczenia – zwykle w postaci maszyny wirtualnej.

Pisanie programów w języku maszynowym jest powolne, żmudne i podatne na błędy. Rozwiązaniem było opracowanie języków programowania wyższego poziomu, które skupiały się bardziej na problemie, a mniej na systemie (sprzęcie i systemie operacyjnym), w którym program jest uruchamiany (patrz rys. 2). Jednak komputery zazwyczaj nie wykonują programów napisanych w językach wysokiego poziomu, więc musi istnieć jakiś sposób na przetłumaczenie programu napisanego w języku wysokiego poziomu na język maszynowy. Dwa rodzaje programów komputerowych dokonują niezbędnego tłumaczenia: kompilatory i interpretery.

Kompilator to program, który tłumaczy inne programy napisane w języku programowania wysokiego poziomu, takim jak C lub C++, na kod maszynowy lub język maszynowy.Inne języki, takie jak Java i C#, wybierają inną drogę: Programy napisane w tych językach są kompilowane do reprezentacji pośredniej (reprezentacji, która leży gdzieś pomiędzy językiem wysokiego poziomu a językiem maszynowym), która jest często nazywana kodem maszyny wirtualnej. Kod maszyny wirtualnej staje się następnie wejściem do innego programu zwanego interpreterem lub maszyną wirtualną (VM, program, który symuluje sprzętowy procesor). Niektóre języki, takie jak Javascript i Perl, są całkowicie interpretowane, to znaczy nie są kompilowane, ale interpretowane bezpośrednio.

Lustracja przedstawiająca kompilator czytający plik z kodem źródłowym C++, tłumaczący kod C++ na kod maszynowy i zapisujący kod maszynowy do pliku wykonywalnego.
Tłumaczenie lub konwersja programu napisanego w skompilowanym języku na kod maszynowy. Kompilator odczytuje kod źródłowy C++ z pliku kończącego się na .cpp i tworzy plik z kodem maszynowym, który jest wykonywalny. Na komputerach z systemem Windows pliki wykonywalne produkowane przez kompilator C++ kończą się na .exe; inne systemy operacyjne stosują inne konwencje nazewnicze. Systemy operacyjne są w stanie uruchamiać pliki wykonywalne bez dalszego przetwarzania.
Zilustrowano kompilator czytający plik z kodem źródłowym Javy i tłumaczący kod Javy na kod maszyny wirtualnej, który jest zapisywany w nowym pliku. Maszyna wirtualna, inny program, odczytuje kod maszyny wirtualnej z nowego pliku i interpretuje go w celu wykonania operacji określonych przez kod maszyny wirtualnej.
Kompilacja i uruchomienie programu napisanego w języku, który tworzy kod maszyny wirtualnej. Języki takie jak Java czy C# są najpierw kompilowane do kodu maszyny wirtualnej, czyli do kodu maszynowego dla wirtualnego komputera – komputera, który tak naprawdę nie istnieje. Po skompilowaniu kodu źródłowego, program zwany maszyną wirtualną (VM) wykonuje kod symulując działania prawdziwego komputera. System operacyjny uruchamia maszynę wirtualną.
Zdjęcie przedstawia plik kodu źródłowego Javascript, który jest odczytywany i przetwarzany przez interpreter.
Uruchamianie programu napisanego w języku czysto interpretowanym. Języki takie jak Javascript i Perl nie są w ogóle kompilowane. Program zwany interpreterem czyta plik z kodem źródłowym po jednym stwierdzeniu na raz i wykonuje lub interpretuje każde stwierdzenie, jak jest czytane, bez tłumaczenia go na inny język. Interpreter Javascript jest wbudowany w większość przeglądarek internetowych, które są uruchamiane przez system operacyjny. W przypadku innych języków interpretowanych system operacyjny uruchamia interpreter jako program aplikacji.

Każde podejście do uruchamiania programu napisanego w języku programowania wysokiego poziomu ma zalety i wady. Programy napisane w językach w pełni skompilowanych (np. C i C++) wykonują się szybciej niż programy napisane w językach częściowo skompilowanych (np. Java i C#) i wykonują się znacznie szybciej niż programy napisane w językach w pełni interpretowanych (np. Javascript i Perl). Aby zobrazować różnicę w wydajności, powiedzmy, że program napisany w języku C++, po skompilowaniu, wykonuje się w czasie 1.0. Równoważny program napisany w języku, który jest kompilowany, a następnie interpretowany, będzie zazwyczaj wykonywany w czasie od 3 do 10. Ten sam program wykonany w języku czysto interpretowanym będzie działał w czasie około 100. Współczesne implementacje maszyn wirtualnych Java i C# używają interpretera just in time (JIT), który kompiluje część kodu wirtualnego do kodu maszynowego podczas jego przetwarzania. Procesory JIT skracają czas działania do około 1,5 raza w porównaniu z czysto kompilowanymi systemami językowymi. Język programowania Python jest nieco inny: główna część programu w Pythonie jest interpretowana, ale jest stosunkowo niewielka i ma minimalny wpływ na całkowity czas działania. Większość bibliotek Pythona, w których program spędza większość czasu, jest napisana w C, więc programy Pythona działają prawie tak szybko jak równoważne programy C.

Z drugiej strony, programy wykonywalne wyprodukowane przez czysty kompilator nie mogą być przenoszone między różnymi platformami (np. nie można uruchomić programu Windows na komputerze Apple), podczas gdy programy napisane w językach interpretowanych są łatwiej przenoszone między różnymi komputerami. Przenośność ta jest osiągana poprzez dostarczenie VM lub interpretera dla każdej platformy (kombinacji sprzętu i systemu operacyjnego). Interpretery i maszyny wirtualne są programami napisanymi w czysto skompilowanych językach, więc nie są przenośne, ale programy, które przetwarzają, są.

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.