PROGRAM

Nagłówek program nie jest wymagany, jest dostarczany tylko w celu zapewnienia kompatybilności wstecznej z Turbo Pascal.

   program name [(parameters, ...)] [: address];

Możliwe jest określenie adresu kompilacji po znaku dwukropka :, jest to odpowiednik przełącznika z linii komend -code address.

program test;

uses // List of unit dependencies goes here...

// Implementation of procedures, and functions goes here...

end.

UNIT

Moduły UNIT występują tylko w postaci źródłowych plików .pas, nie można ich skompilować oddzielnie.

Moduły UNIT składają się z sekcji:

  • INTERFACE wymagana
  • IMPLEMENTATION wymagana
  • INITIALIZATION opcjonalna.
{
  Example UNIT
}
unit Unit1;

interface

uses // List of unit dependencies goes here...

// Interface section goes here

implementation

uses // List of unit dependencies goes here...

// Implementation of procedures, and functions goes here...

initialization

// Unit initialization code goes here...

end.

Przykład:

unit test;

interface

type  TUInt24 =
  record
    byte0: byte;
    byte1: byte;
    byte2: byte;
  end;

const
  LoRes = 1;
  MedRes = 2;
  HiRes = 3;

  procedure Print(a: string);

implementation

uses test2;

procedure Print(a: string);
begin

  writeln(a);

end;

end.

LIBRARY

Nagłówek library jest wymagany.

   library name [: address];

Możliwe jest określenie adresu kompilacji po znaku dwukropka :, jest to odpowiednik przełącznika z linii komend -code address.

Budowa biblioteki jest podobna do modułu unit, programu program.

{
  Example LIBRARY
}
library lib1;

uses // List of unit dependencies goes here...

// Implementation of procedures, and functions goes here...


// exported subroutine(s), variable(s)

exports

idents, ... ;

// optional library initialization code goes here...

begin

end.

Domyślnie funkcje i procedury zadeklarowane i zaimplementowane w bibliotece nie są dostępne dla programisty, który chce korzystać z tej biblioteki.

Aby udostępnić funkcje lub procedury z biblioteki, należy je wyeksportować w klauzuli exports.

Funkcje, procedury i inne identyfikatory są eksportowane z dokładnymi nazwami określonymi w klauzuli exports.

Aby móc korzystać z bibliotek w modułach UNIT lub programie PROGRAM, należy je najpierw skompilować i zasemblować, przełącznik Mad Assembler-a -hm musi być aktywny.

mads.exe library.pas -hm -xi:<Mad_Pascal_path>\base

Plików .pas z kodem źródłowym bibliotek nie możemy umieszczać w klauzuli uses.

Aby skorzystać z identyfikatorów wyeksportowanych w LIBRARY korzystamy z modyfikatora EXTERNAL.

USES

Klauzula uses importuje identyfikatory z modułów unit.

Każda jednostka MPprogram, unit, lub library – może mieć maksymalnie jedną klauzulę uses na sekcję, która musi pojawić się zaraz po nagłówkach sekcji.

Nagłówki sekcji to interface, implementation w modułach unit. W program i library nie ma żadnych wyraźnych nagłówków sekcji, dlatego klauzula uses pojawia się bezpośrednio po nagłówku program, library.

    uses crt, sysutils, atari;

Moduł SYSTEM nie może znajdować się na tej liście, ponieważ jest on domyślnie zawsze ładowany przez kompilator.

Kolejność, w jakiej pojawiają się moduły, jest istotna, ponieważ określa, w jakiej kolejności są one inicjowane. Moduły są inicjowane w tej samej kolejności, w jakiej pojawiają się w klauzuli uses.

Identyfikatory są wyszukiwane w odwrotnej kolejności, tzn. gdy kompilator szuka identyfikatora, szuka go najpierw w ostatnim module w klauzuli uses, następnie w przedostatniej itd. Jest to ważne w przypadku, gdy dwa lub więcej modułów w klauzuli uses deklaruje ten sam identyfikator.

uses graph, vbxe;

W obu modułach GRAPH i VBXE występuje procedura SetColor oraz Line, dla w/w przykładu odwołania do tych procedur będą realizowane przez moduł VBXE,

uses vbxe, graph;

odwołania do tych procedur będą realizowane przez moduł GRAPH.

Możemy też bezpośrednio odwołać się do identyfikatora z konkretnego modułu, np.:

    vbxe.Line
    graph.Line
    vbxe.SetColor
    graph.SetColor

Kompilator będzie szukał wersji źródłowych wszystkich modułów wyszczególnionych w klauzuli uses na podstawie ścieżki z której został uruchomiony kompilator mp.exe\lib\.

Przy pomocy słowa kluczowego IN możemy zastąpić mechanizm automatycznego wyszukiwania modułu.

    uses unita in '..\unita.pas';

Moduł unita jest wyszukiwany w katalogu nadrzędnym bieżącego katalogu roboczego kompilatora. Można dodać dyrektywę {$UNITPATH ..}, aby upewnić się, że moduł zostanie znaleziony bez względu na to, gdzie znajduje się bieżący katalog roboczy kompilatora.

Gdy kompilator szuka plików modułów, dodaje rozszerzenie .pas do nazwy modułu.

$LIBRARYPATH

{$LIBRARYPATH path1; path2; ...}

Dyrektywa $LIBRARYPATH pozwala wskazać dodatkowe ścieżki poszukiwań modułów UNIT zadeklarowanych przez uses.

$UNITPATH

{$UNITPATH path1; path2; ...}

Dyrektywa $UNITPATH pozwala wskazać dodatkowe ścieżki poszukiwań modułów UNIT zadeklarowanych przez uses.