Skip to content
chaser92 edited this page Mar 31, 2015 · 2 revisions

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.

Uruchomienie VM

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.

Wykonanie funkcji

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.

Instrukcje maszynowe

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.

Clone this wiki locally