![]() |
Kurze Sicht in die Blackbox BDS - oder "Was geht ab...
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.
und es hat in diesem Forum bestimmt viele schlaue Köpfe sitzen, welche mir hierzu bei den Fragen und Ergänzungen zur Seite stehen, damit andere Einsteiger die Zusammenhänge einfacher und besser verstehen: ------------------------------------------------------------------------ Teil 1: Was geht ab... wenn ich ein Programm kompiliere? & Teil 2: Was geht ab... wenn ich ein Programm starte? ------------------------------------------------------------------------ Teil 1: Was geht ab... wenn ich ein Programm kompiliere? ------------------------------------------------------------------------ Nun, die Voraussetzungen zum Kompilieren sind ("Man nehme..."): Hardware: - einen funktionierenden PC ;.) ------------------------------------------------------------------------ Software: - Eine Entwicklungsumgebung zB die BDS!!! um Code zu verwalten: - Sourcecode (händisch programmiert) wie im Beispielcode:
Delphi-Quellcode:
- und/oder von der Entwicklungsumgebung generiert zB: Unit1.dfm
procedure TForm1.Button1Click(Sender: TObject);
var sValue1, sValue2: String; iValue1, iValue2: Integer; iSumValue: Integer; begin sValue1 := Edit1.Text; sValue2 := Edit2.Text; iValue1 := StrToInt( sValue1 ); iValue2 := StrToInt( sValue2 ); iSumValue := iValue1 + iValue2; showmessage( inttostr( iSumValue ) ); end; (diese hat einfach zwei Edits und einen Button)
Delphi-Quellcode:
- sowie CodeLibs der Entwicklungsumgebung wie die Units: Forms, SysUtils etc.
object Form1: TForm1
Left = 0 Top = 0 Caption = 'Form1' ClientHeight = 133 ClientWidth = 167 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Button1: TButton Left = 40 Top = 72 Width = 75 Height = 25 Caption = 'Button1' TabOrder = 0 OnClick = Button1Click end ....[gekürzt].... end welche bei Bedarf (d.h. wenn in uses) Code dem Programm beisteuern. ------------------------------------------------------------------------ so weit so gut... jetzt wird der Code kompiliert & gelinkt: Ablauf: 1. ein Kompiler zB: dcc32.exe wandelt den Code in Maschinencode um und 2. der Linker... (hmmmmm, in wikipedia ist der Linker erklärt...aber ich verstehs in meinem Beispiel trotzdem nicht) Wichtige Zusatzinfos: Für die Parameterisierung des Kompilers im BDS: siehe Projektoptionen -> Compiler ------------------------------------------------------------------------ und fertig ist die ausführbare Datei! war das wirklich schon das wichtigste in Kürze? ------------------------------------------------------------------------ Teil 2: Was geht ab... wenn ich ein Programm ausführe? ------------------------------------------------------------------------ das wird bestimmt etwas schwieriger... Nun, die Voraussetzungen zum Ausführen einer ausführbaren Datei sind: ------------------------------------------------------------------------ Hardware: - immer noch - ein funktionierender PC ;.) ------------------------------------------------------------------------ Software: - Betriebssystem (OS) mit CodeLibs wie kernel.dll etc. Ablauf: 1. Ich starte meine Datei 2. Das OS lädt die ganze Datei in den Arbeitsspeicher... (Frage: hmm stimmt das? abgesehen von zusätzlich dynamisch geladenen DLL's) 3. Das Programm wird an einem fix definierten Ausführungspunkt ausgeführt (siehe Project1.dpr -> begin) 4. Application.Initalize -> Alle Units werden initalisiert (Frage: Wenn eine Unit Code im initalization hat, ansonsten aber gar nicht benötigt wird, ist der Kompiler so schlau diese Unit zu ignorieren?) 5. Application.CreateForm(TForm1, Form1); -> Der für die Form nötige Speicher wird reserviert und die Form1 wird created (Frage: bedeutet "create" lediglich dass Speicher reserviert wird?) 6. Application.Run -> Die Form1 wird angezeigt... (Frage: einfach weils die erste erstellte Form ist? wie witzig...) -> und aktiviert Wichtige Zusatzinfos: - zum Erstellen und Anzeigen von Komponenten werden Messages zwischen der Applikation und dem OS hin- und hergeschickt (zB: WM_Create etc.), deshalb sieht eine Form jeweils passend zum ausgeführten OS aus (Frage: welche CodeLib des OS ist hauptsächlich für das Erstellen der Form zuständig?) - jede Komponente besitzt automatisch ein eindeutiges Handle - ... [ bitte um Erweiterung... ] 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 11. Der Code vom Button1.OnClick (siehe Beispielcode oben) wird ausgeführt: 11.1 var... Es wird Arbeitsspeicher - an einer freien Stelle - für die Variablen reserviert (Frage: Was ist der Stack...?) 11.2 Den Variablen wird ein Wert zugewiesen 11.3 iSumValue := iValue1 + iValue2; -> In eine weitere Variable wird die Summe der beiden ersten Variablen zugewiesen 11.4 showmessage (aus der Unit Dialogs) sendet den Befehl weiter ans OS und zeigt das Ergebnis an das wars - einfach gesagt? oder was gibts sonst noch wichtiges? hast du noch einen Input? PS: Vllcht weiss jemand ein gutes Buch welches diese Zusammenhänge gut erklären würde? |
Re: Kurze Sicht in die Blackbox BDS - oder "Was geht ab
Zitat:
Dieser erzeugt dann die Unterkomponenetn und lädt die Eistellungen des Formulars (dfm) Zitat:
Zitat:
Zitat:
|
Re: Kurze Sicht in die Blackbox BDS - oder "Was geht ab
Zitat:
Mal ein paar wichtige (was nicht heißt, dass ich zu den anderen nix zu sagen hätte) Zitat:
Zitat:
Zitat:
Zitat:
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:
Zitat:
Zitat:
Zitat:
Zitat:
Edit: Falsche Tags |
Re: Kurze Sicht in die Blackbox BDS - oder "Was geht ab
thx @mkinzler
Zitat:
Deshalb denke ich, es ist die Hauptform, weils die erste erstelle ist? thx @sirius Zitat:
Zitat:
- *.pas Pascal Code Dateien als Sourcecode vorhanden - *.dcu Pascal Code Dateien aber bereits kompiliert - *.dll als "fertige" Befehlsbibliotheken (welche natürlich auch vom OS zur Verfügung gestellt werden) entsprechend konkretisierte Frage: welche DLL des OS ist denn hauptsächlich für das Erstellen der Form zuständig? |
Re: Kurze Sicht in die Blackbox BDS - oder "Was geht ab
Zitat:
Zitat:
|
Re: Kurze Sicht in die Blackbox BDS - oder "Was geht ab
Zitat:
Zitat:
Für mich ist die VCL eh nur eine "Zwischenschicht" zwischen Applikation und dem OS? |
Re: Kurze Sicht in die Blackbox BDS - oder "Was geht ab
Zitat:
Delphi-Quellcode:
wieviel Platz wird dann wann im Arbeitsspeicher reserviert?
wenn ich folgendes programmiere:
var i: Integer; j: Int64; c: Char; s: String[10]; x: String; begin i := 1; j := 2; c := '1'; s := '0123456789'; x := '01234567890123456789'; end; ich behaupte: zu Begin der Procedure: i: 1 Byte j: 2 Byte c: 1 Byte s: 1 Byte x: 1 Byte und zur Laufzeit wenn die Werte gesetzt werden: i: 1 Byte j: 2 Byte c: 1 Byte s: 10 Byte x: 20 Byte bitte um Korrektur :duck: ich habe bis jetzt einfach immer nur programmiert, aber mir fehlen glaub noch ein paar Grundkenntnisse... und bitte gleich noch um Ergänzung - falls dies jemand weiss: auf einem SQL Server habe ich ein Feld varchar(255) mit dem Wert '0123456789' - wieviel Speicherplatz geht denn - bezogen auf dieses Feld - "verloren" es sollten eigentlich ja 10 Byte sein - oder? [edit=mkinzler]Delphi-Tags eingefügt Mfg, mkinzler[/edit] |
Re: Kurze Sicht in die Blackbox BDS - oder "Was geht ab
zu Begin der Procedure:
i: 4 Byte // 32 Bit Wert = 4 Byte j: 8 Byte // 64 Bit Wert = 8 Byte c: 1 Byte // 8 Bit Wert = 1 Byte (wenn nicht Unicode) s: 11 Byte // 1 Byte Längenangabe + 10 Byte Reserve x: 4 Byte // ein 32bit Pointer auf einen Speicherbereich im Heap = 4 Byte Dazu kommt dann noch der Overhead vom Speichermanager. und zur Laufzeit wenn die Werte gesetzt werden: i: 4 Byte j: 8 Byte c: 1 Byte s: 11 Byte x: 4 Byte Stack + 24 Byte Heap (4byte Längenangabe + 20 Byte String) Edit: Man sollte nichts schreiben wenn man nicht auf der Höhe ist. Sorry :pale: |
Re: Kurze Sicht in die Blackbox BDS - oder "Was geht ab
Zitat:
Auf dem Heap muss man Speicher vor dem Gebrauch reservieren. Das geschieht bei
Schau dazu mal in diese Präsentation: ![]() Was macht deine Funktion? Sie schnappt sich auf dem Stack einfach 4 (Integer) + 8 (Int64) + 4 (Char; weniger als 4 geht nicht) + 12 (11 für shortstring mit Längenangabe und 1 für Alignment auf 4) + 4 (dynamischer String = Pointer) = 28 Bytes Und kann dort problemlos alle Werte reinschreiben. Außer beim dynamsichen String, da müsste die Funktion Speicher vom Heap reservieren (was die Länge + 1 Nullbyte + 8 "stringHeader" sind). Hier würde aber nur der 4 Byte große Pointer auf dem Stack zu dem Konstentenstring umgebogen, der im Image der Exe im speicher rumliegt. Das hängt mit Referenzzählung etc. zusammen. Du siehst, es ist alles komplizierter als so ein kurzer Beitrag erklären kann. Bücher kenne ich darüber nicht. Zitat:
Zitat:
|
Re: Kurze Sicht in die Blackbox BDS - oder "Was geht ab
o Byte = (signed) 1 Byte 0..255 2^8
o Word = (signed) 2 Bytes 0..65535 2^16 o Cardinal = (signed) 4 Bytes 0..4294967295 2^32 o LongWord = Cardinal o ShortInt = (unsigned) 1 Byte -128..127 2^8 o SmallInt = (unsigned) 2 Bytes -32768..32767 2^16 o Integer = (unsigned) 4 Bytes -2147483648..2147483647 2^32 o Int64 = (unsigned) 8 Bytes -2^64..2^64-1 Also mehr fällt mir gerade nicht ein .. das sind so die gängisten typen .. Es gäbe noch Float-Typen .. Single & Double = 4 Byte ... --EDIT Was Strings angeht: Strings sind nur aneinander gereihte Chars, die jeweils (signed) 1 Byte groß sind (eigentlich nicht ganz .. siehe dazu ![]() --EDIT END Das müsste allerdings für den Anfang reichen. Falls du mehr wissen willst, wie Echsen innerlich ausschauen/funktionieren, empfehle ich dir: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz