Metody realizacji języków programowania/MRJP Wykład 1

From Studia Informatyczne

Spis treści

Wstęp

Wykład ten stanowi uzupełnienie wykładu Techniki Kompilacji.

Nasz czytelnik mógł się zorientować, że w poprzednim wykładzie nacisk jest położony na analizę leksykalną i analizę składniową wykonywane podczas kompilacji. Te zadania analizy wystepują nie tylko podczas kompilacji ale także w wielu innych programach. Niektóre aplikacje tworzone przez Ciebie czytelniku będą być może zawierały moduły analizy składniowej.

Cele

Obecny wykład ma dwa cele:

  • przedstawić generowanie kodu i struktury danych wykorzystywane podczas generacji kodu,
  • przedstawić niektóre zagadnienia pojawiające się podczas kompilacji programów pisanych w rzadziej używanych językach programowania.

Struktura wykładu

Rozpoczynamy od prezentacji Tablicy Symboli. Ta struktura danych nabiera coraz większego znaczenia w dobie upowszechniania się środowisk wspomagających pracę programistów takich jak Exlipse, JBuilder, etc. W podręcznikach poświęconych kompilacji temat ten przedstawiany jest dośyć pobieżnie. Kompilacja programów napisanych w Javie wymaga jednak dobrego zrozumienia zasad wiązania wystąpień aplikacyjnych identyfikatorów z odpowiednimi wystąpieniami deklacji definiujących znaczenie danego identyfikatora w kontekście jego wystąpienia aplikacyjnego.

Kolejny wykład poświęcony jest zagadnieniu staycznej analizy semantycznej. Niewiele osób zdaje sobie sprawę z tego, że prawdziwą gramatyką języka programowania wcale nie jest gramatyka bezkontekstowa zapisywan zwykle w notacji BNF lub w postaci diagramów. Gramatyki języków programowania są gramatykami kontekstowymi. Trochę szkoda, że nie są one publikowane. Ale nie jest to wcale potrzebne. Właśnie moduł kontroli typów sprawdza czy kod źródłowy jest poprawny i sygnalizuje występowanie ewentualnego błędu kontekstowego.

Jeżeli żadnego błędu nie wykryto można przejść do generowania kodu wynikowego.

Musimy jednak wiedzieć na jaką maszynę będziemy generować kod. Bardzo popularnym rozwiązaniem jest generowanie kodu na pewną maszyne wirtualną. Potem można dokonywą kompilacji na pewną sprzętową platformę np. Intela czy PowerPC.

A więc najpierw musimy poznać maszynę wirtualną. W jaki sposób wygląda kod tej maszyny. Jak powstaja i są przechowywane rekordy aktywacji metod (procedur) i obiekty klas. Tej tematyce są poswięcone kolejne dwa wykłady.

Następny wykład omawia zadanie generowania kodu pośredniego. W tym momencie posiadamy już minimalny zestaw umiejetności niezbędnych dla zbudowania kompilatora. Wytworzony kod jest jednak daleki od doskonałości Wykłady 7, 8 i 11 poświęcone są zadaniu optymalizacji wytworzonego kodu.

Wykład 9 omawia problemy związane z zarządzaniem pamięcią obiektów i różne algorytmy odzyskiwania zaśmieconej pamięci.

Wykład 12 przeznaczony jest dla tych którzy zechcą napisać kompilator dla języka programowania funkcyjnego.

W ostanim wykładzie przedstawiamy mało znaną a bardzo ciekawą koncepcję umożliwiającą programowac w jednolitym formaliżmie zarówno aplikacje przeznaczone do współbieżnego wykonywania zadań zapisanych w obiektach aktywnych procesach jak i zadań z danymi rozproszonymi w sieci komputerowej lub algorytmami rozproszonymi. Koncepcja ta powstała kilkanaście lat temu w Instytucie Informatyki Uniwersytetu Warszawskiego.

Praca czytelnika/studenta

Dla dobrego opanowania przedstawionego tu materiału nie wystarczy przeczytać moduły składające sie na ten wykład. Wymagane jest aktywne wspóldziałanie. Czytelnik powinien opanować pojęcia jakie wprowadzamy, zrozumieć je i umieć się nimi posługiwać. Należy dobrze zrozumieć algorytmy tu przedstawiane i umieć wybrać właściwy spośród nich kierując sie kryteriami jego przydatności i kosztu jego zastosowania.

Laboratorium

Osobny moduł zawiera materiały niezbędne do przygotowania semestralnego zadania laboratoryjnego. Oczekuje się, że uczestnik tych zajęć samodzielnie przygotuje i uruchomi kompilator dla niedużego jezyka programowania kotek. Kotek jest językiem nieco prostszym niż język Tiger przedstawiony w książce Appela.