Uniwersytet Warszawski

Wydział Matematyki, Informatyki i Mechaniki

 

 

 

 

 

 

 

Dionizy Boruń

nr albumu 153543

ViewCode: Graficzny system wizualizacji
deklaracji struktur danych

(FRAGMENTY)

 

 

 

praca magisterska

napisana pod kierunkiem

dr Janiny Mincer–Daszkiewicz

w Instytucie Informatyki

 

 

Warszawa 1999

 

Spis treści:

1.Wstęp *

4. Architektura systemu ViewCode *

4.1 Wprowadzenie *

4.2 Konwerter ViewC *

4.3 Program ViewC Viewer *

4.4 Arkusz stylu XSL *

4.5 Przenośność systemu *

6. Opis systemu ViewCode *

6.1. Wprowadzenie *

6.2. Konwerter ViewC *

6.3. Program ViewC Viewer *

6.4 Możliwości rozwoju systemu *

7.Podsumowanie *

Załącznik A. Formalny opis formatu ViewC *

 

 

 

1.Wstęp

 

Projektowanie systemów informatycznych jest jedną z najważniejszych dziedzin informatyki. Zarządzanie dużymi projektami, ze względu na ich rozmiar jest stosunkowo trudne. Do projektowania i budowy systemu potrzebne są narzędzia umożliwiające w sposób jak najmniej skomplikowany badanie poprawności oraz złożonych zależności pomiędzy modułami. Narzędzia te w znacznym stopniu wspomagają i przyśpieszają prace projektowe. Wśród nich dużą popularnością, ze względu na łatwość w użyciu i efektywność, cieszą się narzędzia graficzne.

Ważnym kryterium w ocenie przydatności narzędzi jest też możliwość obsługi danych zapisanych w uniwersalnym, przenośnym formacie. Akceptowanie jedynie specjalnego, dedykowanego formatu uniemożliwia swobodną wymianę danych między różnymi aplikacjami. W celu dostarczenia elastycznego formatu danych, World Wide Web Consortium opracowało nowy język zapisu danych, zwany Extensible Markup Language (XML)[]. Słowami kluczowymi języka XML, który jest podzbiorem języka SGML, są znaczniki. Każdy znacznik może posiadać wiele atrybutów. Znaczniki mogą być zagnieżdżone. Język ten może stanowić warstwę pośrednią pomiędzy systemami informatycznymi. Jego podstawowym zadaniem jest reprezentacja danych w prostym, przenośnym formacie. Do generacji dokumentów XML służą programy zwane konwerterami, natomiast rozpoznawaniem i sprawdzaniem poprawności tych dokumentów zajmują się parsery. W standardzie XML każdy dokument może zawierać opis swojej budowy w postaci gramatyki.

Innym równie ważnym kryterium w ocenie narzędzi jest ich przenośność pomiędzy różnymi systemami operacyjnymi. Jednym rozwiązaniem jest stworzenie różnych wersji narzędzi na różne platformy. Jego wadą są duże koszty związane z rozwojem oprogramowania, częste różne działanie programów w różnych środowiskach. Innym, dużo lepszym rozwiązaniem jest stworzenie jednej wersji programu dla maszyny wirtualnej Javy. Java [] jest prostym, zorientowanym obiektowo językiem programowania zaprojektowanym specjalnie do zastosowań sieciowych. Programy napisane w Javie są przenośne i mogą być wykonywane we wszystkich systemach operacyjnych wyposażonych w maszynę wirtualną języka.

System ViewCode, zaprojektowany i zaimplementowany w ramach niniejszej pracy, służy do przeglądania i wyszukiwania powiązań w deklaracjach struktur danych. Powstał on z myślą o wykorzystaniu do wspomagania projektowania dużych systemów informatycznych napisanych w językach imperatywnych. Z powodzeniem może być także wykorzystywany w celach edukacyjnych. Użytkownik może przeglądać zależności pomiędzy strukturami danych dowolnego programu w zadanym języku.

Inspiracją do stworzenia systemu ViewCode były zajęcia z przedmiotu “Systemy Operacyjne”, w których uczestniczyłem na III roku studiów. W ramach zajęć studenci analizują źródła systemu Linux prawie w całości napisane w języku C. Deklaracje struktur danych systemu znajdują się w wielu plikach, co skutecznie utrudnia wynajdowanie zależności pomiędzy tymi strukturami. Ponieważ moim głównym celem była wizualizacja struktur danych systemu operacyjnego Linux, ViewCode działa na źródłach programów napisanych w języku C. Nie ogranicza to możliwości systemu, ponieważ architektura systemu umożliwia obsługę programów napisanych w innych imperatywnych językach programowania.

Główne zalety systemu ViewCode to:

System ViewCode wymaga środowiska obliczeniowego wyposażonego w maszynę wirtualną Javy oraz kompilator zgodny z Gnu CC. Do opisu danych został opracowany nowy format dokumentu, ViewC, zdefiniowany za pomocą języka XML.

Na projekt systemu ViewCode składają się następujące elementy:

Niniejsza praca opisuje wszystkie trzy wspomniane elementy. W pierwszej części pracy omówię techniki wizualizacji projektów informatycznych oraz przedstawię zalety technologii XML w aspekcie sformułowanego zadania. Następnie zaprezentuję rozwiązania przyjęte w systemie ViewCode. Ostatnie części pracy poświęcę na opisanie funkcji systemu, szczegółów implementacyjnych programu ViewC Viewer oraz możliwości rozwoju systemu.

 

 

 

4. Architektura systemu ViewCode

4.1 Wprowadzenie

System ViewCode służy do wizualizacji powiązań deklaracji struktur danych. Podczas projektowania tego systemu szczególną uwagę zwróciłem na to, aby miał on strukturę warstwową. Schemat budowy systemu przedstawia rysunek 5. Warstwę najniższą stanowi konwerter ViewC służący do konwersji źródeł programów w języku imperatywnym do opracowanego formatu ViewC. Następną warstwę stanowi parser XML, który wczytuje wygenerowany przez konwerter dokument ViewC i udostępnia go programowi ViewC Viewer.

Procesor XML/XSL służy do publikacji powiązań struktur danych w Internecie. Wynikiem działania procesora może być dokumentacja w dowolnym formacie.

4.2 Konwerter ViewC

Budowę warstwy konwertera ViewC przedstawia rysunek 6. Dokument ViewC zawiera deklaracje wszystkich struktur danych występujących w danym pliku źródłowym oraz we wszystkich plikach włączanych. Informacje nie związane ze strukturami danych są pomijane.

Do poprawnego działania konwertera ViewC jest potrzebny preprocesor języka C zgodny z GNU, który wstępnie przetwarza pliki źródłowe. Wynikiem działania preprocesora jest plik z włączanymi plikami źródłowymi oraz rozwiniętymi wszystkimi makrami.

Konwerter ViewC został zaimplementowany za pomocą generatora analizatorów składniowych Bison i generatora analizatorów leksykalnych Lex. Konwerter ten korzysta z gramatyki będącej połączeniem gramatyki języka C autorstwa J. Roskinda [] oraz zawartej w kodzie źródłowym kompilatora GNU CC.

Warstwa konwertera jest warstwą wymienną. Konwerter może być wymieniony na inny, na przykład na napisany w przenośnym języku programowania takim jak Java.

4.3 Program ViewC Viewer

Parser XML wczytuje dokument w formacie ViewC, interpretuje znaczniki i udostępnia reprezentację dokumentu za pomocą interfejsu DOM. Dzięki temu parser jest jednoznacznie określony. Używany parser stanowi następną wymienną warstwę. Może on być zastąpiony przez każdy parser XML udostępniający dokument za pomocą interfejsu programistycznego DOM.

Wyświetlaniem dokumentu ViewC zajmuje się program ViewC Viewer. Korzysta on z interfejsu DOM. Wynajduje powiązania deklaracji struktur danych w obiektowej reprezentacji dokumentu ViewC i wyświetla je użytkownikowi. Napisany przeze mnie program ViewC Viewer również stanowi wymienny komponent systemu.

W przyszłości program ViewC Viewer może stanowić wtyczkę do przeglądarki. Nowa wersja przeglądarki Internet Explorer 5.0 oraz Netscape Nawigator mają mieć wbudowany parser XML udostępniający dokument XML za pomocą interfejsu DOM. W starszych typach przeglądarek dostęp do dokumentów XML jest teoretycznie możliwy, jednak w praktyce jest bardzo wolny, zawodny, niedopracowany i zależny od typu przeglądarki. Oznacza to, że każda przeglądarka odwołuje się w inny sposób do dokumentu XML.

4.4 Arkusz stylu XSL

Procesor XML/XSL służy do generowania widoków dokumentu XML. Działa on w następujący sposób: dla każdego znacznika z dokumentu ViewC wykonuje daną akcję z arkusza stylu XSL. Wynikiem działania procesora jest plik w formacie HTML. Dokument XML to dane, natomiast arkusz stylu XSL to reguły, w jaki sposób dane mają być wyświetlane.

Na dzień dzisiejszy, z powodu niedoskonałości przeglądarek, ViewC Viewer nie działa w przeglądarce, lecz jako oddzielna aplikacja. Publikację deklaracji struktur danych w Internecie zapewnia procesor XML/XSL. Użytkownik w prosty sposób może zmienić sposób wyświetlania danych, edytując arkusz stylu XSL. Jeżeli program ViewC Viewer będzie wtyczką do przeglądarki następnej generacji, to arkusz stylu XSL będzie zbędny, gdyż publikacją będzie się zajmował ViewC Viewer.

4.5 Przenośność systemu

W systemie ViewCode zasadniczo można wyodrębnić dwie części: jedną zajmującą się dostosowaniem plików źródłowych do formatu ViewC i drugą mającą na celu wizualizację danych zawartych w dokumencie. Wskazane jest, aby obydwie części były przenośne. Z drugą częścią systemu nie ma żadnego problemu, gdyż nie jest w żaden sposób zależna od platformy. Zaimplementowany przeze mnie program ViewC Viewer jest napisany w przenośnym języku Java. Dużo więcej problemów nastręcza pierwsza część, wymagająca analizy kodu źródłowego programu. Bardzo często kod ten zależy od systemu, któremu jest dedykowany. Warstwa konwertera do poprawnego działania musi zawierać narzędzie podobne w działaniu do kompilatora. Zaimplementowany przeze mnie konwerter ViewC może działać w każdym systemie wyposażonym w kompilator języka C zgodny z
GNU CC.

 

 

 

 

6. Opis systemu ViewCode

6.1. Wprowadzenie

Rozdział ten zawiera opis implementacji systemu ViewCode. W ramach tego systemu zostały napisane następujące programy:

Tabela 1 przedstawia poszczególne pliki wchodzące w skład wyżej wymienionych programów.

Konwerter ViewC

konwerter.sh

skrypt uruchamiający konwerter

parser.exe

binaria konwertera na platformę Win32

parser

binaria konwertera na platformę Linux

ViewC Viewer

*.class

binaria programu ViewC Viewer

.ViewCviewer

plik konfiguracyjny

help.xml

plik pomocy

Tabela 1. Pliki wchodzące w skład programów w systemie ViewCode

6.2. Konwerter ViewC

Konwerter ViewC jest uruchamiany z linii poleceń powłoki systemu operacyjnego. Pierwszym parametrem wywołania konwertera jest nazwa pliku przetwarzanego, natomiast następnymi opcje preprocesora języka C. W wyniku działania konwerter wypisze na standardowe wyjście dokument ViewC.

W konwerterze ViewC, zaimplementowanym w ramach projektu ViewCode można wydzielić następujące części:

Preprocesor wykonuje dyrektywy, włącza odpowiednie pliki oraz rozwija wszystkie makrowywołania w przetwarzanym dokumencie. Preprocesor języka C jest narzędziem zewnętrznym, nie zaimplementowanym w ramach projektu ViewCode. W konwerterze używam preprocesora języka C dostarczanego wraz ze środowiskiem programowania GNU.

Konwerter właściwy jest filtrem. Wczytuje ze standardowego wejścia strumień danych, jaki powstał po przetwarzaniu wstępnym przez preprocesor, i wypisuje tekst dokumentu w formacie ViewC na standardowe wyjście. Został on napisany w języku C, przy użyciu generatora analizatorów składniowych Bison i analizatora leksykalnego Lex. W zaimplementowanym konwerterze komunikacja pomiędzy Bisonem a Lexem nie jest jak zwykle jednostronna, lecz dwustronna ze względu na złożoność języka C i powody opisane w poprzednim rozdziale.

Konwerter ViewC działa w systemach Unix (w szczególności Linux) i Windows (NT/95/98), pod warunkiem, iż posiadają preprocesor języka C zgodny z GNU. Działanie konwertera na innych platformach systemowych, po spełnieniu powyższego warunku powinno być poprawne.

6.3. Program ViewC Viewer

Program ViewC Viewer służy do wizualizacji powiązań deklaracji struktur danych opisanych w dokumencie ViewC. Rysunek 8 przedstawia okno aplikacji w trakcie działania programu. Wizualizowany dokument ViewC może być parametrem wywołania. Zmiana aktualnie przetwarzanego dokumentu jest możliwa poprzez przycisk FILE z menu.

Okno główne aplikacji jest podzielone na cztery części:

Lista dostępnych struktur danych, posortowana według nazwy, położona jest w prawej części okna. Służy ona do wyboru wizualizowanej struktury. Listę tę można ukrywać (pokazywać) za pomocą przycisku LIST oraz filtrować używając przycisku FILTER.

Okno wizualizacji podzielone jest logicznie na trzy części. W części środkowej znajduje się wizualizowana struktura. Część górna zawiera wszystkie struktury odwołujące się do danej struktury. Ostatnia, trzecia część, składa się z elementów, do których istnieją odwołania ze struktury wizualizowanej. Dla każdej struktury pokazane są elementy reprezentujące jej pola.

Wyróżniłem następujące typy elementów:

Kolory poszczególnych typów elementów oraz rozmiar i rodzaj czcionki można ustawić w pliku konfiguracyjnym.

Wszystkie elementy, poza prostymi i tekstowymi są aktywne. Oznacza to, że po kliknięciu na dany element, program wyświetla strukturę, której nazwa jest zawarta w elemencie. Przyciski << i >> oznaczają odpowiednio cofnij i naprzód. Służą one do nawigacji między przeglądanymi strukturami.

W pasku podsumowań, znajdującym się w dolnej części ekranu, wyświetlana jest nazwa struktury wizualizowanej, nazwa pliku w którym została ona zadeklarowana oraz głębokość tego pliku w drzewie plików włączanych.

Aplikacja ViewC Viewer posiada zaawansowany filtr wyświetlanych struktur danych. Rysunek 9 przedstawia okno filtru. W dokumencie ViewC znajdują się deklaracje struktur danych z różnych plików źródłowych. W oknie jest wyświetlane drzewo plików włączanych. W drzewie można wybierać poszczególne pliki z deklaracjami struktur danych, które będą brane pod uwagę podczas przetwarzania. Opcja WITH TREE służy do zaznaczania całych poddrzew. Za pomocą pola DEPTH można odznaczyć wszystkie węzły w drzewie powyżej danej głębokości.

W programie ViewC Viewer zarówno plik konfiguracyjny, jak i pomocy są dokumentami XML.

Program ViewC Viewer został zaimplementowany w obiektowym, przenośnym języku programowania Java. Może być uruchamiany w każdym systemie wyposażonym w maszynę wirtualną tego języka.

Dzięki modelowaniu obiektowemu rozwój aplikacji jest bardzo łatwy. Rysunek 10 przedstawia zależności pomiędzy klasami reprezentującymi rodzaje struktur. W prostokątach na diagramie znajdują się nazwy klas w programie wraz z krótkim opisem. Dodanie nowego rodzaju struktury polega na dopisaniu odpowiedniej podklasy. Na przykład, jeżeli chcemy w różny sposób wizualizować struktury, unie i typ wyliczeniowy, to należy dopisać trzy podklasy klasy BoxSUE, jedną odpowiedzialną za wyświetlanie unii, drugą za struktury, trzecią za typ wyliczeniowy.

Struktury złożone składają się z elementów. Każda struktura posiada nagłówek i zbiór elementów stanowiący definicję struktury. Rysunek 11 przedstawia zależności pomiędzy klasami elementów w programie ViewC Viewer. Dodanie nowego typu elementu (na przykład pola struktury, które jest tablicą) w celu innej interpretacji przy wyświetlaniu jest łatwe.

Przy implementacji programu nie korzystałem z żadnych dodatkowych bibliotek. Do rozrysowania struktur wykorzystałem tylko standardową bibliotekę AWT [].

6.4 Możliwości rozwoju systemu

Architektura systemu ViewCode zapewnia możliwość łatwej jego rozbudowy. Rozwój tego systemu zależy od jego zastosowań. System ViewCode znajduje zastosowanie wszędzie tam gdzie istnieje potrzeba przeglądania deklaracji struktur danych. Oto kilka przykładowych zastosowań systemu ViewCode:

Rozwój systemu ViewCode polega na rozbudowie formatu ViewC i/lub programu wizualizującego powiązania struktur danych. W przypadku rozbudowy formatu ViewC, nowa wersja powinna być nadzbiorem starszej. Oto kilka przykładowych możliwości rozwoju systemu ViewCode:

Możliwości przeglądarek szybko się zwiększają. Trudno przewidzieć jakie udogodnienia prezentacji i jaki interfejs programowy będą oferować ich następne wersje - w dotychczasowych możliwości prezentacji graficznej są niewystarczające.

Rozwój systemu ViewCode o obsługę programów napisach w innych językach imperatywnych, na przykład takich jak C++ i Java. Zaimplementowany przeze mnie system ViewCode wizualizuje powiązania pomiędzy deklaracjami struktur danych programów napisanych w języku C.

Graficzne narzędzie do łączenia struktur danych. Z definicji struktury nie można wywnioskować co logicznie ona przedstawia, w jaki sposób łączy się ona z innymi. Przykładem może być deklaracja drzewa binarnego.

struct T{

struct Node n;

struct T *left;

struct T *right;}

Z powyższej deklaracji struktury nie można stwierdzić, czy naprawdę mamy do czynienia z drzewem binarnym, czy też listą dwukierunkową. Narzędzie takie pozwalałoby programistom łączyć odpowiednio zinterpretowane, zgodnie z użyciem, struktury danych. Następnie byłyby one zapisywane w odpowiednim formacie. Wyświetlanie raz połączonych struktur powinno być zgodne z ich logiczną interpretacją. Oznacza to, że struktura, która logicznie jest drzewem byłaby, wyświetlana jako drzewo, a lista podwójna jako lista.

 

 

7.Podsumowanie

W ramach niniejszej pracy zaprojektowano format dokumentu ViewC. Zaimplementowano konwerter, służący do konwersji plików źródłowych do formatu ViewC, oraz program ViewC Viewer wizualizujący powiązania w deklaracjach struktur danych.

Format dokumentu ViewC jest prosty i łatwy w użyciu. Problem złożoności języka C został przeniesiony na narzędzia dostosowujące pliki źródłowe do tego formatu.

Format ViewC można łatwo rozszerzyć o obsługę innych języków programowania.

Zastosowanie technologii XML ułatwia tworzenie aplikacji wykorzystujących dokumenty XML oraz wymianę danych z innymi systemami.

W trakcie pracy nad programem ViewC Viewer napotkałem poważne problemy z przenośnością aplikacji napisanych w języku Java. Przyczyną problemów była inna implementacja biblioteki graficznej AWT na różnych platformach systemowych.

Mam nadzieję, że stworzony przeze mnie system ViewCode będzie wykorzystywany do celów dydaktycznych na Uniwersytecie Warszawskim.

 

 

 

 

Załącznik A.
Fo
rmalny opis formatu ViewC

<!DOCTYPE VIEWC [

<!--

Definicja struktury dokumentu ViewC (DTD)

Autor: Dionizy Boruń

Wersja: 1.0.4

Data: 14-05-1999

dokument ViewC składa się z części informacyjnej, drzewa plików włączanych i deklaracji -->

<!ELEMENT VIEWC (info, tree?, decl) >

<!ELEMENT info (comment?) >

<!-- nazwa pliku źródłowego -->

<!ATTLIST info sourcefile CDATA #REQUIRED >

<!-- data generacji dokumentu -->

<!ATTLIST info generated CDATA #IMPLIED >

<!ELEMENT comment (#PCDATA) >

<!-- drzewo plików włączanych -->

<!ELEMENT tree (node)* >

<!ELEMENT node (node)* >

<!ATTLIST node file CDATA #REQUIRED >

<!-- deklaracje struktur danych -->

<!ELEMENT decl (enum | union | struct | typedef)* >

<!-- definicja typu wyliczeniowego -->

<!ELEMENT enum (textenum)* >

<!ATTLIST enum name CDATA #REQUIRED >

<!ATTLIST enum file CDATA #REQUIRED >

<!ATTLIST enum isnoname (YES| NO) “NO” >

<!-- element wyliczeniowy -->

<!ELEMENT textenum EMPTY >

<!ATTLIST textenum name CDATA #REQUIRED >

<!-- definicja unii -->

<!ELEMENT union (text | link)* >

<!ATTLIST union name CDATA #REQUIRED >

<!ATTLIST union file CDATA #REQUIRED >

<!ATTLIST union isnoname (YES| NO) “NO” >

<!-- definicja struktury -->

<!ELEMENT struct (text | link)* >

<!ATTLIST struct name CDATA #REQUIRED >

<!ATTLIST struct file CDATA #REQUIRED >

<!ATTLIST struct isnoname (YES| NO) “NO” >

<!-- definicja identyfikatora typu -->

<!ELEMENT typedef EMPTY >

<!ATTLIST typedef type (basic| sue| typedef) #REQUIRED >

<!ATTLIST typedef spec CDATA #REQUIRED >

<!ATTLIST typedef decl CDATA #REQUIRED >

<!ATTLIST typedef name CDATA #REQUIRED >

<!ATTLIST typedef file CDATA #REQUIRED >

<!-- pole struktury będące odnośnikiem -->

<!ELEMENT link EMPTY >

<!ATTLIST link type (basic| sue| typedef) #REQUIRED >

<!ATTLIST link spec CDATA #REQUIRED >

<!ATTLIST link decl CDATA #REQUIRED >

<!-- pole struktury nie będące odnośnikiem -->

<!ELEMENT text EMPTY >

<!ATTLIST text type (basic| sue| typedef) #REQUIRED >

<!ATTLIST text spec CDATA #REQUIRED >

<!ATTLIST text decl CDATA #REQUIRED >

] >