Dyrektywy kompilatora

Page 1

Temat:

Dyrektywy kompilatora. Obsługa urządzeń peryferyjnych i rejestry procesora. Wykonał

Data

Klasa/nr

Zadanie 1 Na podstawie podręcznika str. 91 odpowiedz na następujące pytania:

Kiedy stosujemy dyrektywy kompilatora?

W jaki sposób umieszczamy je w programie? Podaj przykład.

W jaki sposób dzielimy dyrektywy i jakie mają one zastosowanie?

Zadanie 2 Skomentuj poniższy kod 1.67 str. 92

Programowanie strukturalne i obiektowe Język Turbo Pascal

Strona 1


Zadanie 3 Przetestuj działanie kodu 1.68 i 1.69 str. 93. Dodaj komentarz.

Programowanie strukturalne i obiektowe Język Turbo Pascal

Strona 2


Dyrektywy kompilatora Turbo Pascal Pascal nie należy do najszybszych i programista nie ma całkowitej kontroli nad tym, co znajdzie się w kodzie wynikowym. Można oczywiście używać asemblera, ale ompilatory dają jeszcze jedną możliwość dokładniejszej kontroli generowanego kodu wynikowego. Dyrektywy kompilatora, bo o nich tu mowa nie dają może takich możliwości jak Asembler, ale zawsze łatwiej nauczyć się kilku dyrektyw, niż nowego języka programowania. Jednak należy pamiętać, że dyrektywy nie określają tego co znajdzie się w kodzie wynikowym, ale to, w jaki sposób kompilator utworzy ten kod. Tutaj jedna uwaga. Przytoczone przeze mnie tutaj dyrektywy dotyczą kompilatora TP w wersji 7. W innych dyrektywy mogą wyglądać zupełnie inaczej, bowiem nie należą one do języka programowania, ale do programu, którego używamy.

Dyrektywy przełącznikowe Dyrektywa

Domyślnie

{$A}

+

{$B}

-

{$D}

+

{$E}

+

{$F}

-

Opis

Word allign data - włączenie opcji powoduje, że zmienne i zadeklarowane stałe mają w pamięci adresy o parzystych wartościach bez względu na ich rozmiar. To przyspiesza nieznacznie wykonywanie programu, ale powoduje większe wykorzystanie pamięci. Complete boolean evaluation - włączenie tej opcji spowoduje, że wyrażenia logiczne z operatorami AND i OR będą obliczane aż do końca - nawet gdy będzie już przesądzony ich wynik. np. IF false AND (i=0) - wynik jest przesądzony już na początku. Debug Information - określa, czy w kodzie wynikowym mają znaleźć się informacje pomocne przy debugowaniu programu. Wyłączenie tej opcji jest wskazane, gdy chcemy udostępniać komuś nasz moduł bez kodów źródłowych, lub chcemy skompilować ostateczną wersję programu na dysk. Wyłączenie tej opcji uniemożliwi debugowanie programu przy pomocy debugera wbudowanego w TP, ale zmniejszy nieco rozmiary kodu wynikowego. Emulation - określa, czy do kodu wynikowego programu mają być dołączone biblioteki odpowiadające za emulację koprocesora arytmetycznego. Dzięki temu program będzie mógł być uruchomiony na maszynie nie posiadającej takiego koprocesora (bardzo rzadkie wypadki). Poza tym biblioteki nie działają równie szybko jak koprocesor. Przełącznik ma znaczenie tylko przy kompilacji programu (nie modułu). Force Far Calls - kod wynikowy procedur i funkcji zadeklarowanych np. części INTERFACE modułu mieści się gdzieś indziej (w innym segmencie) niż sama deklaracja. Dlatego

Programowanie strukturalne i obiektowe Język Turbo Pascal

Strona 3


{$G}

-

{$I}

+

{$L}

+

{$N}

-

{$O}

-

{$Q}

+

kompilator oznacza je jako FAR-dalekie, aby umożliwić ich wywołanie przez inne moduły lub programy. Domyślne ustawienie oznacza jako dalekie tylko te podprogramy, które tego wymagają. Natomiast włączenie tej opcji spowoduje potraktowanie wszystkich występujących po tej dyrektywie procedur funkcji jako dalekie. Jest to konieczne, gdy używamy w programie zmiennych proceduralnych (VAR sproc: PROCEDURE;). 286 Code - włączenie tej opcji umożliwi wykorzystanie w programie kilku dodatkowych instrukcji procesorów 286 i nowszych (jak np. SHL w asemblerze). Jednakże wówczas uruchomienie programu na starszych maszynach (8086) nie będzie możliwe :-). IO Checking - przy włączonym przełączniku kompilator generuje kod sprawdzający, czy nie napotkano błędu podczas operacji I/O. Jeśli będzie błąd, to program zostanie zakończony z błędem wykonania (komunikat RunTime Error xx at xxxx:xxxx). Wyłączenie tej opcji umożliwi kontynuowanie działana programu np. aby wydać bardziej przyjazny błąd typu "Nie ma takiego pliku". Najbardziej charakterystyczna konstrukcja wygląda tak: {$I-} reset(f) {<--otwieranie pliku} IF IOResult<>0 then writeln(komunikat_bledu); {$I+} Local Symbols - opcja umożliwia podglądanie wartości zmiennych lokalnych (w podprogramach, lub sekcji IMPLEMENTATION modułu) w czasie debugowania programu. Jeśli opcja {$D} jest wyłączona, wówczas stan opcji {$L} nie ma znaczenia. 80x87 Code - włączenie tej opcji spowoduje, że kompilator wygeneruje kod wykorzystujący bezpośrednio koprocesor arytmetyczny. Włączenie tej opcji jest konieczne przy wykorzystaniu w programe pewnych typów liczb zmiennoprzecinkowych (Single, Double, Extended). Overlay Code Generaton - włączenie tego przełącznika powoduje, że moduł może być wykorzystany jako nakładka (różnica pomiędzy nakładkami, a zwykłymi modułami ujawnia się przy przesyłaniu łańcuchów i ustalonych stałych parametrów z jednego podprogramu jednego modułu do innego podprogramu drugiego modułu). Standardowa opcja {$O-} uniemożliwia wykorzystanie modułu jako nakładki, ale powoduje szybsze wykonanie programu. Overflow Checking - przełącznik oznaczający, czy podczas działania programu będą kontrolowane wyniki działań arytmetycznych, takich jak dodawanie, odejmowanie i mnożenie, pod względem zgodności wyniku działania z zakresem zmiennej, w której zapamiętywany jest ten wynik. W przypadku wyjścia wyniku poza zakres zostanie wygenerowany komunikat o błędzie. Jednak włączenie tej opcji powoduje znaczne spowolnienie działania aplikacji i jest to zalecane jedynie przy debugowaniu programu.

Programowanie strukturalne i obiektowe Język Turbo Pascal

Strona 4


{$R}

+

{$S}

+

{$T}

-

{$V}

+

{$X}

+

Range Checking - opcja umożliwiająca zadecydowanie, czy w czasie działania programu ma być sprawdzane, czy zmienne tablicowe są prawidłowo indeksowane (czy podawany indeks komórki nie jest za duży, albo za mały), oraz czy przypisywane zmiennym występującym w programie wartości nie wychodzą poza zakres typów tych zmiennych. W przypadku wykrycia błędu zostanie wygenerowany komunikat (Runtime Error ...) i program zostanie zakończony. Jednak kod sprawdzający błędy spowalnia nieco program i zaleca się wyłączenie tej dyrektywy, gdy wiemy, że w programie nie występują błędy. Stack Checking - przełącznik oznaczający, czy przy wywoływaniu procedury będzie sprawdzane, czy na stosie znajduje się wystarczająca ilość miejsca, aby pomieścić na nim wszystkie zmienne lokalne zadeklarowane w podprogramie. Jeśli opcja jest włączona, wówczas w przypadku niewystarczającej ilości miejsca program zostanie zakończony z błędem, a jeśli opcja jest wyłączona, to może dojść nawet do zawieszenia systemu. Type-Checked Pointers - przy wyłączonej opcji wskaźnik do obiektu (chodzi tu o wszystko co może być w pamięci, a nie o typ obiektowy) uzyskany za pomocą operatora @ jest wskaźnikiem do wszystkiego (typ POINTER). Gdy opcja jest włączona, wówczas tak wskaźnik jest wskaźnikiem o określonym typie (tak jak ^typ). Strict/Relaxed Var-String Checking - włączenie przełącznika spowoduje, że parametry łańcuchowe przekazywane do podprogramów będą dokładnie kontrolowane pod względem zgodności ich maksymalnych długości. Wyłączenie opcji umożliwi przekazywanie jako parametry łańcuchowe dowolnych zmiennych typu STRING, ale może spowodować zagadkowe przypadki utraty danych w programach. Extended Syntax - przełącznik definiujący, czy przy procesie kompilacji mają być uwzględniane rozszerzenia języka Pascal wprowadzone w 7 wersji TP. Opcja włączona umożliwi np. wywoływanie funkcji tak jak procedur - bez żadnego przypisywania wartości (np.ReadKey; ).

Programowanie strukturalne i obiektowe Język Turbo Pascal

Strona 5


Dyrektywy parametryczne Dyrektywa

Opis

Tą dyrektywą można dołączyć do programu kody źródłowe zawarte w innym pliku. Zawartość tego kodu przy procesie kompilacji jest kompilowana i dołączana do pliku głównego w miejscu wystąpienie dyrektywy. Jeśli przy nazwie pliku nie podamy rozszerzenia, to kompilator automatycznie będzie dodawał rozszerzenie .pas. Gdy nie podamy katalogu to plik będzie szukany w katalogu ustawionym w opcjach TP. {$L filename} Dzięki tej dyrektywie można dołączyć do pliku wykonywalnego kod binarny utworzony np. przy pomocy innego kompilatora. Dzięki temu możliwe jest wywoływanie w programie Pascalowym podprogramów skompilowanych wcześniej w Asemblerze, lub C. Za domyślne rozszerzenie kompilator przyjmuje .OBJ, a katalog można zdefiniować w opcjach kompilatora. Po dołączeniu pliku binarnego należy wstawić deklaracje PROCEDURE Nazwa_Procedury;EXTERNAL;, która zawiadomi kompilator, że procedury tej ma on szukać w pliku OBJ. Ważne jest, aby nazwa procedury zapisana w pliku binarnym była identyczna, jak w kodzie w Pascalu. {$M Dyrektywa umożliwiająca zdefiniowanie rozmiarów stosu i sterty w SSize,HMin,HMax} aplikacji. Pierwszy parametr (wielkość stosu) musi mieć wartość od 1024 do 65520. Drugi parametr (minimalna wielkość sterty) musi się znajdować między 0, a 655360. Natomiast ostatni z parametrów musi być nie mniejszy od drugiego, ale nie większy niż 655360. Chociaż w większości przypadków warto pozostawić wartości domyślne, to jednak przy korzystaniu z procedury exec należy jak najbardziej zredukować rozmiary pamięci programu (ale tak, aby program nadal działał poprawnie). Dlaczego? Po prostu uruchamiana przez procedurę exec aplikacja również potrzebuje trochę pamięci, a należy pamiętać że w czasie działania tej drugiej aplikacji nasz program jest nadal gdzieś w RAMie komputera. Dyrektywa ta nie ma znaczenia przy kompilacji modułu. {$O UnitName} Przy używaniu nakładek, dyrektywa ta określa które spośród modułów mają być dołączone do pliku nakładki (tego z rozszerzeniem OVR), a nie do pliku wykonywalnego. Dyrektywę należy umieścić bezpośrednio za nazwami modułów używanych przez program (po klauzuli USES). Jest ona zupełnie ignorowana przy kompilacji modułu. Wszystkie moduły, których nazwy zostały podane w dyrektywie, muszą być podane po słowie kluczowym USES i skompilowane wcześniej z dyrektywą {$O+}. {$I filename}

Programowanie strukturalne i obiektowe Język Turbo Pascal

Strona 6


Kompilacja warunkowa. Kompilacja warunkowa umożliwia napisanie programu, który będzie kompilowany w różny sposób w zależności od kompilatora, który używamy, bądź od stanu dyrektyw przełącznikowych. Dzięki temu można napisać kilka wersji programu w jednym pliku źródłowym, które będą kompilowane w zależności od systemu operacyjnego - tak, aby program zawsze działał wyśmienicie :-). Dyrektywy warunkowe: Dyrektywa

Opis

Kompiluje kod źródłowy do dyrektywy {$ELSE} lub {$ENDIF}, gdy symbol jest zdefiniowany. Kompiluje kod źródłowy do dyrektywy {$ELSE} lub {$ENDIF}, gdy symbol NIE jest zdefiniowany. Stawia warunek kompilacji warunkowej w zależności od stanu opcji kompilatora. np. {$IFOPT N+} oznacza fragment kompilowany, gdy jest ustawiona opcja {$N} (dotycząca koprocesora arytmetycznego). Kompiluje kod źródłowy (aż do dyrektywy {$ENDIF}), gdy ostatni postawiony (za pomocą dyrektyw {$IFDEF}, {$IFNDEF}, {$IFOPT}) warunek kompilacji jest nieprawdziwy. {$ENDIF} Kończy definiowanie kompilacji warunkowej. Po tej dyrektywie kod będzie już kompilowany normalnie. {$DEFINE Defniuje symbol, który można użyć potem użyć w dyrektywie {$IFDEF} symbol} {$UNDEF Sprawia, że symbol przestaje być zdefiniowany. symbol} {$IFDEF symbol} {$IFNDEF symbol} {$IFOPT switch +/} {$ELSE}

Programowanie strukturalne i obiektowe Język Turbo Pascal

Strona 7


Najważniejsze symbole kompilacji warunkowej: Symbol CPU86 CPU87 DPMI

Znaczenie Procesor należy do rodziny 80x86 Koprocesor arytmetyczny jest zainstalowany w komputerze. Systemem operacyjnym jest DOS w trybie chronionym (tylko Borland Pascal) MSDOS Systemem operacyjnym jest MS-DOS w trybie rzeczywistym. VER70 Wersja kompilatora 7.0 WINDOWS Kompilator w wersji do Windows (32bit) Należy jednak pamiętać, że owe symbole dotyczą komputera, na którym jest kompilowany program, a nie tego na którym program jest uruchamiany. Oto przykład programu z warunkową kompilacją:

Źródło:

http://www.trecio.cba.pl/kurs_pas/10/dyrkomp.htm

Programowanie strukturalne i obiektowe Język Turbo Pascal

Strona 8


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.