-
Notifications
You must be signed in to change notification settings - Fork 3
VIPER VM
Maszyna wirtualna VIPERa jest w stanie przetwarzać a'la bajtkod kod w formie opisu środowiska globalnego i poszczególnych funkcji. W skład opisu funkcji wchodzi opis jej środowiska i jej graf przepływu sterowania (CFG) zaimplementowany za pomocą instrukcji maszyny wirtualnej VIPER C.
Cykl życia VM: przy inicjowaniu programu tworzony jest obiekt reprezentujący jego pamięć (mapowanie lokacja -> wartość). Obiekt ten jest opisany w module Memory
. Oprócz tego tworzone jest środowisko globalne (Environment
), a następnie w tym środowisku umieszczane są wartości początkowe zmiennych i wartości funkcji.
Dalej pozostaje już tylko uruchomić bezparametrową funkcję main
. Program kończy się, gdy stos wywołań będzie pusty.
Za przygotowanie funkcji do wykonania w maszynie wirtualnej służą funkcje w module FunctionCall
. Przygotowanie funkcji polega na zdjęciu wymaganych argumentów ze stosu obecnie wywoływanej funkcji, stworzeniu nowego ExecutionContext
i umieszczeniu go na stosie wywołań procesu, a następnie przygotowaniu środowiska nowo tworzonej funkcji w oparciu o jej szablon i wartości argumentów. Procesor przetwarzający kolejną instrukcję używa funkcji znajdującej się na stosie wywołań. Instrukcja RETURN
powoduje zdjęcie obecnego kontekstu ze stosu i umieszczenie wartości wynikowej na stosie wykonania funkcji będącej poniżej. W przypadku braku takiej funkcji (pusty stos wywołania po RETURN
) jest to traktowane jako kod wyjścia i umieszczane w zmiennej process.exitCode
.
Za dostarczanie klas odpowiedzialny jest moduł InstructionSet
, który udostępnia załadowane klasy obsługujące poszczególne instrukcje. Każda z klas instrukcji udostępnia konstruktor, który może przyjmować jeden parametr, jest on wypełniany stałą wartością param
z szablonu CFG. Przykład takiej instrukcji to PUT
, np. PUT 5
.
Wywołanie instrukcji procesora jest realizowane przez wywołanie metody invoke
takiego obiektu. Dostaje ona jako parametr kontekst wykonania i obiekt reprezentujący proces. W ten sposób jest w stanie obsługiwać stos wykonania, jak i stan całego procesu. Opcjonalnie metoda ta może zwrócić kolejny węzeł w grafie CFG, jeśli nie jest to określone podczas budowania grafu (robi to tylko instrukcja BRANCH
). W przypadku braku wartości zwracanej brany jest pod uwagę węzeł next
.