Units (Einheiten)

Eine Unit (Einheit) bündelt gemeinsam genutzte Typen-, Funktions-, Prozedur-, Konstanten- und Variablendeklarationen, die von anderen Units oder dem Hauptprogramm aufgerufen werden können. Das entspricht den Modulen / Paketen anderer Programmiersprachen.

Eine Unit erstellen

Jede Unit besteht aus zwei zentralen Bereichen:

interface-Schnittstellenbereich: Nach außen freigegebener Inhalt, der nach dem Einbinden durch andere Dateien direkt aufgerufen werden kann;

implementation-Implementierungsbereich: Interner privater Code, der nur innerhalb der aktuellen Unit sichtbar ist und von außen nicht aufgerufen werden kann.

Beispiel

Erstellen Sie eine Datei namens MyUnit.pas, um eine Unit zu implementieren.

unit MyUnit;

{$ifdef FPC}
{$mode objfpc}{$H+}{$J-}
{$endif}

// Schnittstellenbereich: Öffentliche Deklarationen
interface

procedure MyProcedure(const A: Integer);
function MyFunction(const S: string): string;

// Implementierungsbereich: Privater Code
implementation

procedure MyProcedure(const A: Integer);
begin
  WriteLn('A + 10 is: ', A + 10);
end;

function MyFunction(const S: string): string;
begin
  Result := S + 'strings are automatically managed';
end;

end.Code-Sprache: JavaScript (javascript)

Aufmerksame Leser bemerken, dass das abschließende end. kein passendes begin hat.

Die Syntaxstruktur einer Pascal-unit (Einheit) unterscheidet sich von der eines program (Programms)

program Hauptprogramm: Benötigt einen begin ... end.-Block als Ausführungseinstiegspunkt

unit Einheit: Kein globales begin erforderlich

Jede Unit endet mit end. (der Punkt markiert das Dateiende, es gibt kein zugehöriges globales begin)

  • Im interface-Bereich werden Funktions-/Prozedurprototypen, Typen, Konstanten und globale Variablen definiert; externe Dateien können diese nach uses-Einbindung aufrufen;
  • Im implementation-Bereich steht nur die vollständige Funktionsimplementierung. Lokale Prozeduren und private Variablen hier sind für andere Units unsichtbar;
  • Unit-Dateien beginnen mit unit Name; und enden mit end..

Einbinden von Units im Hauptprogramm

Unsere Hauptprogrammdatei lautet mydemo.pas

Laden Sie benutzerdefinierte Units mit dem Schlüsselwort uses

{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}

program MyProgram;

// Benutzerdefinierte Unit MyUnit einbinden
uses
  MyUnit;

begin
  WriteLn(MyFunction('Note: '));
  MyProcedure(5);
  ReadLn;
end.Code-Sprache: PHP (php)

Das MyUnit; unter uses bezeichnet den Unit-Namen, nicht den Namen der .pas-Datei.

Dieser Name stammt aus der ersten Zeile von MyUnit.pas: unit MyUnit;

Dateiname und Unit-Name können voneinander abweichen, es wird jedoch empfohlen, beide identisch zu benennen. Bei abweichenden Namen muss in uses stets der Unit-Name statt des Dateinamens verwendet werden.

Kompilieren und führen Sie das Programm nun aus; das Hauptprogramm ruft die Funktionen aus der Unit auf.

Kompilieren und ausführen

Nach der Kompilierung entstehen zwei neue Dateien im Projektordner

.ppu (Pascal Unit File, Kompilierungsmetadatei für Units)

Diese Datei wird nur beim Kompilieren von Unit-Dateien erzeugt, das Hauptprogramm program erstellt keine .ppu-Datei

  • Speichert kompilierte Metadaten des Unit-interface-Bereichs: Funktionsprototypen, Typen, Konstanten, exportierte Symbole;
  • Wenn andere Dateien uses MyUnit verwenden, parst der Compiler den gesamten Quellcode MyUnit.pas nicht erneut, sondern liest direkt die .ppu-Datei zur schnellen Schnittstellenprüfung;
  • Erhöht die Kompiliergeschwindigkeit großer Projekte drastisch; zentrale Datei für die inkrementelle Kompilierung von FPC.

MyUnit.o: Binäre Maschinenbefehle aus kompiliertem MyUnit.pas (vollständiger Code des Implementierungsbereichs)

mydemo.o: Binärer Maschinencode des Hauptprogramms mydemo.pas

Der Compiler wandelt jede .pas-Datei zunächst in separate binäre Objektdateien .o um; anschließend verbindet der Linker alle .o-Dateien zu einer ausführbaren .exe-Datei.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert