Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Kurze Sicht in die Blackbox BDS - oder "Was geht ab

  Alt 13. Jan 2009, 16:54
Zitat von heri:
Ich habe schon so einiges programmiert und ich denke auch einiges an Grundkenntnissen zu besitzen, möchte aber gerne "kurz" einmal die für die Programmierung wichtigen Zusammenhänge der Computerkomponenten notieren.
Oh, umd das sinnvoll zu ergänzen müsste man ein Buch schreiben.
Mal ein paar wichtige (was nicht heißt, dass ich zu den anderen nix zu sagen hätte)

Zitat von heri:
2. der Linker...
Bastelt die deine einzelnen Units zu einer Exe zusammen und ergänz/korrigiert/etc. die Adressen der einzelnen Funktionen. Außerdem muss der Exe-Header geschrieben werden, naja, dass halt aus den einzelnen Codefetzen in den Units (kompiliert zu *.dcu) eine dem Betriebssystem genehme executable wird.

Zitat von heri:
- Betriebssystem (OS) mit CodeLibs wie kernel.dll etc.
Ist eine CodeLib jetzt für dich eine Delphi-Unit oder die Bibliotheken des Betriebsystems?


Zitat von heri:
2. Das OS lädt die ganze Datei in den Arbeitsspeicher...
Nicht zwingend alles auf einmal. Es gibt ja das Paging der Intel-Architektur. Dadurch hast du zwar alles in deinem virtuellen Speicher, aber unter Umständen kleben noch ein paar Seiten auf deiner Platte. Virtuell und damit für den Programmierer wichtig sieht es so aus, als wäre alles auf einmal im Speicher, mehr ist auch nicht wichtig.
Zitat von heri:
4. Application.Initalize
-> Alle Units werden initalisiert
Nein.
das von dir genannte "begin" wird (in einer EXE) zum Aufruf des Befehls StartExe (Procedure in Unit System) umgebaut. Diese wiederum ruft u.a die Procedure initUnits auf. Und wie der Name schon sagt, wird da der Initialization-Teil der Units abgearbeitet.
Bspw. wird in der Unit Controls im Initialization-Teil die globale Variable Application (aus der Unit Forms) mit "Application:=TApplication.Create(..)" initialisiert. Damit ist das globale Objekt Application da.
Application.Initialize ist eine kleine Methode und macht nahezu nix.
Zitat von heri:
(Frage: Wenn eine Unit Code im initalization hat, ansonsten aber gar nicht benötigt wird, ist der Kompiler so schlau diese Unit zu ignorieren?)
Nee, es kann ja auch sein, dass allein der Initialization-Teil wichtig für das Programm ist.

Zitat von heri:
5. Application.CreateForm(TForm1, Form1); -> Der für die Form nötige Speicher wird reserviert und
die Form1 wird created
Man könnte das genauso auch mit Form1:=TForm1.Create(...) machen. Was anderes mach CreateForm auch nicht, außer das es sich die erste Form die kommt als MainForm nimmt.


Zitat von heri:
6. Application.Run
Alle Messages von Windows werden in einer (Fast-)Endlosschleife abgearbeitet.

Zitat von heri:
Event: Der Button auf der Form wird gedrückt
10. Das OS erhält die Message WM_MouseClick und sendet diese an die Komponente weiter
Das OS erhält einen Interrupt von der Mouse und generiert eine Mouse-Message an das Formular, mit dem Hinweis: Button X wurde angeklicckt. Die VCL generiert ihrerseits eine interne Message an den Button.


Zitat von heri:
11.1 var... Es wird Arbeitsspeicher - an einer freien Stelle - für die Variablen reserviert
Der Stack ist großes Stück Speicher auf dem man sich "frei" austoben darf. Man sollte sich aber an gewisse Regeln halten und das macht Delphi auch. Prinzipiell wird für jede Funktion die aufgerufen wird ein Stackframe "angelegt". Das geht ganz einfach, man verschiebt einfach den StackPointer (ESP) nach unten und zwischen dem bisherigen Platz un dem neuen Platz von ESP kann man seine lokalen Variablen ablegen. Für Dynamische Variablen (Objekte, Strings, Arrays) muss noch außerhalb des Stacks (also auf dem Heap) Speicher reserviert werden. Das geschieht je nach Größe der Variablen und frei zur Laufzeit (deswegen ja dynamisch).


Edit: Falsche Tags
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat