Pok-12-wyk-Slajd23

Z Studia Informatyczne
Wersja z dnia 19:13, 30 sie 2006 autorstwa Complak (dyskusja | edycje)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacjiPrzejdź do wyszukiwania

Kontroler typów - tablica symboli(1)

Kontroler typów - tablica symboli(1)


Rzeczywista implementacja tablicy symboli w komercyjnym produkcie jest o wiele bardziej skomplikowana.

Dla każdego symbolu przechowuje się zazwyczaj więcej informacji. Oprócz nazwy i typu symbolu można przechowywać np. informacje o lokalizacji (plik i linia), gdzie został zadeklarowany i lokalizacjach, gdzie został użyty.

Kolejnym problemem jest efektywne przechowywanie nazw symboli. W językach takich, jak Basic czy Fortran identyfikatory były krótkie: jedno, dwu, najwyżej sześcioznakowe. Wystarczająco efektywną implementacją było zarezerwowanie pola o stałej długości dla każdego symbolu.

Nowsze języki, np. takie jak C++ czy Ada nie pozwalają na użycie takiego podejścia. Symbole w tych językach mogą mieć nazwy o dowolnej długości i wszystkie znaki są istotne. Rozwiązanie z wykorzystaniem wskaźników i alokacją pamięci na symbole ze sterty nie jest efektywne ze względu na prędkość i fragmentację sterty. Dobrym rozwiązaniem jest przechowywanie wszystkich symboli w jednym spójnym obszarze pamięci, a w tablicy symboli - jedynie wskaźnika do symbolu (i ewentualnie jego długości).

Niezwykle istotna jest również wydajność operacji wykonywanych na tablicy. Program w Adzie może mieć kilkaset tysięcy linii i kilkadziesiąt tysięcy identyfikatorów. Sprawne działanie kompilatora można zapewnić jedynie wtedy, gdy organizacja tablicy pozwala na efektywne wstawianie i wyszukiwanie danych.

Istotnym problemem jest szybkie wyszukiwanie symboli w tablicy. Najprostsze podejście (wyszukiwanie liniowe) jest zdecydowanie zbyt mało efektywne. W praktycznych rozwiązaniach stosuje się więc odpowiednie funkcje mieszające.

Kolejnym problemem, który trzeba uwzględnić projektując tablicę symboli jest blokowa struktura współczesnych języków programowania (bloki instrukcji, podprogramy, pakiety itp.). Możliwość deklarowania symboli lokalnych (której rezultatem jest konieczność zarządzania zakresem i widzialnością zmiennych) dodatkowo komplikują implementację.


<< Poprzedni slajd | Spis treści | Następny slajd >>