MRJP Wykład 4: Różnice pomiędzy wersjami
Początek pracy nad wykładem. Wprowadzenie definicji podstawowych pojęć. |
Nie podano opisu zmian |
||
Linia 1: | Linia 1: | ||
== Klasyfikacja realizacji języków programowania == | == Klasyfikacja realizacji języków programowania == | ||
Linia 8: | Linia 7: | ||
'''translator''' | '''translator''' | ||
jak wyżej, ale tłumaczenie konstrukcji języka źródłowego na konstrukcje języka docelowego odbywa się w dużym stopniu jeden do jednego | jak wyżej, ale tłumaczenie konstrukcji języka źródłowego na konstrukcje języka | ||
docelowego odbywa się w dużym stopniu jeden do jednego | |||
'''interpreter''' | '''interpreter''' |
Wersja z 11:23, 5 lip 2006
Klasyfikacja realizacji języków programowania
Realizacje języków programowania można podzielić na kilka kategorii:
kompilator tłumaczy program w języku źródłowym na program w języku docelowym
translator jak wyżej, ale tłumaczenie konstrukcji języka źródłowego na konstrukcje języka docelowego odbywa się w dużym stopniu jeden do jednego
interpreter wykonuje program posługując się jakąś jego reprezentacją
Podział ten nie jest ścisły - wiele realizacji można zaliczyć do kilku kategorii.
Język docelowy, maszyny wirtualne
Język docelowy kompilatora zwykle nie pokrywa się z językiem maszyny rzeczywistej, na której programy mają działać. Po pierwsze, niektórych cech maszyny kompilator nie wykorzystuje. Ponadto, ponieważ podczas wykonania programu mogą być potrzebne operacje, które nie są realizowane bezpośrednio przez sprzęt (np. zarządzanie pamięcią), wygenerowany kod jest uzupełniany o tzw. system czasu wykonania (ang. run-time system), który można traktować jako rozszerzenie maszyny docelowej.
Często stosowanym rozwiązaniem jest też tworzenie maszyny docelowej od podstaw, z myślą o realizacji konkretnego języka. Instrukcje tej maszyny zwykle nie są bezpośrednio rozumiane przez sprzęt, więc nazywamy ją maszyną wirtualną (abstrakcyjną). Ten sposób realizacji języka upraszcza kompilator, może też dawać dodatkowe korzyści - np. ułatwiać jego przenoszenie na inne systemy. Kod wygenerowany na maszynę wirtualną może być wykonywany przez interpreter lub przekazany na wejście kolejnego kompilatora, który przetłumaczy go na kod maszyny rzeczywistej. Spotyka się też rozwiązania pośrednie - połączenie interpretera i kompilatora uruchamianego podczas wykonania programu, by przetłumaczyć fragmenty szczególnie istotne dla jego efektywności. Technika ta nosi nazwę JIT (ang. just-in-time compilation).
Zaprojektowanie uniwersalnej maszyny wirtualnej, mimo wielu prób, jak dotąd nie udało się. Te, które powstają, są przeznaczone dla realizacji określonego języka lub rodziny podobnych języków, np. maszyny wirtualne Javy, Smalltalka, Prologu. Maszynę stworzoną w latach 70 dla realizacji języka Pascal nazywano p-code i określenie to bywa do dziś używane jako synonim języka maszyny wirtualnej. W p-code i maszynach do niej podobnych większość instrukcji pobiera argumenty ze stosu i tam odkłada wynik. Maszyny te nazywamy maszynami stosowymi (ang. stack machine) w odróżnieniu od maszyn wykorzystujących do tego celu rejestry (ang. register machine).