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.