Bitbucket is a code hosting site with unlimited public and private repositories. We're also free for small teams!

Close
Pawel Wieczorek, MiniAlgolCompiler
Kopia dostepna pod adresem: http://trzask.int.pl/

Omowienie mechanizmow jakie zrobilem w tym kompilatorze
mogloby byc zbyt nieczytelne, gdyby bylo w calosci w
komentarzach. Dlatego umieszczam tutaj opis implementacji
pewnych mechanizmow.

1. Funkcje zagniezdzone.

Do implementacji funkcji zagniezdzonych uzywam instrukcji
procesora ENTER. Ona automatycznie, w zaleznosci od poziomu
zagniezdzenia, tworzy tablice przed zmiennymi lokalnymi zawierajaca
wskazniki do ramek funkcji o mniejszym zagniezdzeniu.

Aby odwolywac sie do ramek procedur, w ktorej dana procedura
jest zagniezdzona, kopiuje wskaznik z tej tablicy do rejestru EDX,
a nastepnie adresuje zmiennej tej ramki za pomoca niego.

2. Argumenty przekazywane przez nazwe.

Obsluga tego typu wartosciowania wymaga generacji
specyficznych procedur anonimowych, ktore bede nazywal
thunkami. Najlatwiej mi to omowic na przykladzie:

----
procedure test(x,y);
begin
    x := 4;
    write(y)
end

integer a;
test(a,a*a);
----

Argument y procedury test zostanie przekazany przez nazwe.
Za kazdym razem kiedy bedzie trzeba obliczyc wartosc tego
argumentu to bedzie trzeba obliczyc wartosc wyrazenia 'a*a'.
W tym celu generuje thunka, ktory zawiera w sobie kod obliczajacy
wyrazenie 'a*a'. Pojawia sie jednak problem, stos wywolan wyglada tak:

[ramka main, ze zmienna a]
[ramka test]
[ramka thunka 'a*a']

Thunk zawiera w sobie kod, ktory 'zyje' w ramce main. Wiec aby ten
kod mial sens trzeba odpowiednio ustawic ramke. Kompilator rozpoznaje
ile ramek wyzej jest ramka docelowa, i przed wywolaniem thunka
ustawia rejestr ECX na liczbe ramek do przeskoczenia. Thunk zawiera
w sobie nastepujacy kod na poczatku:

label:
    movl (%ebp), %ebp
    loop label

Ktory wykonuje ECX-razy instrukcje 'movl (%ebp), %ebp', ktora
przeskakuje ramki na stosie.

Te rozwiazania pozwala mi bez specjalnych metod zagniezdzac
thunki w thunkach (tzn thunki, ktore zawieraja kod uzywajacy
takze argumentow przekazanych przez nazwe).

Recent activity

Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.