Delphis kompiler

Tags:    delphi
Skrevet af Bruger #58 @ 17.06.2001
Hvordan Delphi kompilerer

En vigtig note: Det meste af det her er gætteri. Jeg ved intet om Delphi's kompiler (eller hvordan kompilere fungerer generelt), så derfor kan jeg ikke sige noget med sikkerhed. Jeg har selv Delphi 4. Hvis du har en anden version kan det være at det hele ikke svarer til hvad jeg skriver (specielt linienumre).

System.pas

Hvis du har Professional eller Enterprise (Client/Server) versionen af Delphi har du også kildekoden til hele VCL (Visual Component Library) og RTL (Run Time Library), og dermed også System.pas filen. Hvis du har Delphi 4 eller nyere, vil du også ved at pege med musen på en type (f.eks. Integer) se hvor den bliver defineret. Mange af de grundlæggende typer i Delphi bliver (i Delphi 4) defineret i System.pas på linie 11. Sjovt nok er det eneste der sår på linie 11 i System.pas:
unit System;
Det vil dog give mere mening hvis du så læser kommentaren over. Der står:
{ Predefined constants, types, procedures, }
{ and functions (such as True, Integer, or }
{ Writeln) do not have actual declarations.}
{ Instead they are built into the compiler }
{ and are treated as if they were declared }
{ at the beginning of the System unit.     }
Hvis du så ruller ned til linie 499, så står der:

{ Procedures and functions that need compiler magic }
Og så kommer der en masse procedurer, alle sammen starter med en understregning (f.eks. _COS). Nu er det så mit første gæt på, hvordan kompileren fungerer kommer:
Når du bruger en af de funktioner, vil kompileren udvide din kode så det faktisk bliver hele den funktion der er defineret i System.pas. F.eks.:
// Du skriver
x := Cos(y);
// Delphi udvider det til
asm
  // Her står koden fra _COS proceduren i System.pas
  // men med dine variabler sat ind.
end;
En anden ting er:
// Du skriver
x := 2 + 2;
// Kompileren ændrer det til
x := 4;
Kompileren udregner altså så vidt muligt matematiske udsagn under kompileringen.

Objekter

Hvis du ikke ved hvad virtual og override er for noget, så skal du nok først læse min OOP i Delphi serie, specielt del 3.
Nu begynder det at blive sjovt. Nu vil jeg først sige lidt om hvordan properties bliver behandlet, og derefter noget om metoder. Som du nok ved, kan et property deklareres med enten en read funktion en write procedure eller begge dele. Se på dette eksempel:
// Først en objekttype
type
  TMinType = class(TObject)
  private
    function GetMitProperty: string;
    procedure SetMitProperty(Value: string);
  public
    property MitProperty: string
     read  GetMitProperty
     write SetMitProperty;
  end;

// Nu en procedure hvor det objekt bliver brugt.
// Som du skriver proceduren
procedure EtEllerAndet;
var
  obj: TMinType;
begin
  obj := TMinType.Create;
  obj.MitProperty := 'Hej!';
  ShowMessage(obj.MitProperty);
  obj.Free;
end;

// Kompileren ændrer det til:
procedure EtEllerAndet;
var
  obj: TMinType;
begin
  obj := TMinType.Create;
  obj.SetMitProperty('Hej!');
  ShowMessage(obj.GetMitProperty);
  obj.Free;
end;
Nu har jeg skrevet det lidt billedligt. F.eks. bliver koden ikke kompileret som et kald til en metode i objekttypen TMinType men som et kald til noget kode ved adresse et-eller-andet. Den adresse bliver fundet ud fra hvilken type objektet er deklareret som, ikke hvilken type det bliver oprettet som. Det er også forklaringen på, hvorfor ikke-virtuelle metoder opfører sig som de gør. (Se OOP del 3).
Nu bliver det også kompliceret: Når du kalder en virtuel metode i et objekt, ændrer kompileren kaldet til:
  1. Se hvilken type objekt der faktisk er tale om (hvilken type det er oprettet som)
  2. Led efter den pågældende metode i dette objekts Virtual Method Table (se hjælpen for en forklaring)
  3. Hvis ikke fundet, se i objektet lige under dette i hierarkiet og gentag fra punkt 2
  4. Kald den fundne metode
Det er en længere smøre at gå igennem, bare for at køre en metode. Men det er nødvendigt for at få den rigtige funktionalitet. Derfor er det også hurtigere at kalde ikke-virtuelle metoder end virtuelle.

Halt();

Det var det for denne gang. Hvis jeg finder ud af mere, skal jeg nok skrive en efterfølger. Desuden vil jeg meget gerne have kommentarer hvis der er nogen der ved noget mere om emnet.


Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (2)

User
Bruger #2796 @ 20.09.03 05:30
Hvad sker der lige for denne artikel? Hvordan kunne den komme igennem den "høje" standard der er her på udvikleren?
User
Bruger #2841 @ 20.09.03 05:31
BEEEP
Du skal være logget ind for at skrive en kommentar.
t