Grösse der exe FPC vs. C / externe libs
-
- Beiträge: 6955
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Grösse der exe FPC vs. C / externe libs
Dies wurde schon vielfach erwähnt, das die erzeugten EXE von FPC recht gross sind.
Ein HelloWorld ist in C gut den Faktor 10 kleiner als bei FPC.
Ich vermute mal ein Grund dafür wird sein, bei C wird für jedes kleinste Ding eine externe lib angesprochen. Schon ein einfaches puts() braucht eine lib. Und FPC macht fast alles selbst, auch das einfachste Writeln braucht einiges.
Bei dem Inlude System bei C sind die Include-Dateien *.h nur ein Verweiss auf externe libs und beihalten ein paar Konstanten und Type-Definitionen, evtl . noch ein paar Macros.
Beim Unit-System von Pascal, kann man in jeder Unit zwischen dem "begin" und "end." noch ein paar Befehle ausführen, Und dieses Zeugs landet am Ende auch in der EXE. Und ich vermute die Unit-System welche zwingen erfordrlich ist macht schon einige Initialisierungen.
Habe ich dies richtig verstanden ?
Ein HelloWorld ist in C gut den Faktor 10 kleiner als bei FPC.
Ich vermute mal ein Grund dafür wird sein, bei C wird für jedes kleinste Ding eine externe lib angesprochen. Schon ein einfaches puts() braucht eine lib. Und FPC macht fast alles selbst, auch das einfachste Writeln braucht einiges.
Bei dem Inlude System bei C sind die Include-Dateien *.h nur ein Verweiss auf externe libs und beihalten ein paar Konstanten und Type-Definitionen, evtl . noch ein paar Macros.
Beim Unit-System von Pascal, kann man in jeder Unit zwischen dem "begin" und "end." noch ein paar Befehle ausführen, Und dieses Zeugs landet am Ende auch in der EXE. Und ich vermute die Unit-System welche zwingen erfordrlich ist macht schon einige Initialisierungen.
Habe ich dies richtig verstanden ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 2141
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Grösse der exe FPC vs. C / externe libs
Ja das liegt daran das C die "native" Sprache für Unix Systeme ist. Die Unix spec definiert die system APIs als C Funktionen und die libC ist neben anderen Bibliotheken (z.b. pthreads) ein Teil der Unix spec.
Das hat neben Standardisierung und Größeneinsparung noch einen weiteren Vorteil, die Systeme bringen normalerweise LibC Versionen die auf die Prozessorarchitektur optimiert sind mit, d.h. Code in der LibC wie z.B. memcpy ist für gewöhnlich ein Vielfaches schneller als das entsprechende Pascal equivalent (move)
Pascal hingegen hat seine eigene runtime, die RTL, die eine Eigenentwicklung ist. Da also jedes Unix system die LibC umfasst aber nicht die RTL, können C Programme einfach gegen die System LibC binden, während Pascal Programme ihre RTL selbst mitbringen müssen.
Das hat neben Standardisierung und Größeneinsparung noch einen weiteren Vorteil, die Systeme bringen normalerweise LibC Versionen die auf die Prozessorarchitektur optimiert sind mit, d.h. Code in der LibC wie z.B. memcpy ist für gewöhnlich ein Vielfaches schneller als das entsprechende Pascal equivalent (move)
Pascal hingegen hat seine eigene runtime, die RTL, die eine Eigenentwicklung ist. Da also jedes Unix system die LibC umfasst aber nicht die RTL, können C Programme einfach gegen die System LibC binden, während Pascal Programme ihre RTL selbst mitbringen müssen.
- Jorg3000
- Lazarusforum e. V.
- Beiträge: 385
- Registriert: So 10. Okt 2021, 10:24
- OS, Lazarus, FPC: Win64
- Wohnort: NRW
Re: Grösse der exe FPC vs. C / externe libs
Hi!
Um Missverständnisse zu vermeiden, sollten wir mal mit konkreten Zahlen arbeiten.
Vergleichbar ist es nur, wenn man in den Projekteinstellung > Debuggen "Use external debug symbols file (-Xg)" einstellt.
Dann ist z.B. die kleinste visuelle Windows-Anwendung rund 2,5 MB groß (meine ich mich zu erinnern, habe es gerade nicht getestet).
Ich trauere noch etwas den kleinen Größen aus der früheren Delphi-Zeit nach. Unter Delphi 7 konnte man ein nicht-visuelles Programm mit rund 50 kb und eine visuelle Anwendung ab 300 kb Größe erstellen (meine ich mich zu erinnern).
Ob das wirklich viel größer war, als es mit C möglich ist? Ich glaube der Unterschied war schon damals nicht relevant. Dafür erhielt man mit Delphi eine unabhängige, monolithische Anwendung, was ich sehr mag.
Mich würde aber schon interessieren, woher die krassen Unterschiede zwischen (altem) Delphi und derzeitigem Lazarus herkommen, denn es ist mindestens der Faktor 8.
Grüße, Jörg
Um Missverständnisse zu vermeiden, sollten wir mal mit konkreten Zahlen arbeiten.
Vergleichbar ist es nur, wenn man in den Projekteinstellung > Debuggen "Use external debug symbols file (-Xg)" einstellt.
Dann ist z.B. die kleinste visuelle Windows-Anwendung rund 2,5 MB groß (meine ich mich zu erinnern, habe es gerade nicht getestet).
Ich trauere noch etwas den kleinen Größen aus der früheren Delphi-Zeit nach. Unter Delphi 7 konnte man ein nicht-visuelles Programm mit rund 50 kb und eine visuelle Anwendung ab 300 kb Größe erstellen (meine ich mich zu erinnern).
Ob das wirklich viel größer war, als es mit C möglich ist? Ich glaube der Unterschied war schon damals nicht relevant. Dafür erhielt man mit Delphi eine unabhängige, monolithische Anwendung, was ich sehr mag.
Mich würde aber schon interessieren, woher die krassen Unterschiede zwischen (altem) Delphi und derzeitigem Lazarus herkommen, denn es ist mindestens der Faktor 8.
Grüße, Jörg
- KoBraSoft
- Beiträge: 125
- Registriert: So 6. Jun 2021, 09:57
- OS, Lazarus, FPC: die zu Zeit aktuellen Versionen, überwiegend Linux
- CPU-Target: 64Bit 32 Bit
- Kontaktdaten:
Re: Grösse der exe FPC vs. C / externe libs
Die Größe der ausführbaren Dateien von Lazarus zu Delphi wurde schon ausführlich diskutiert, ebenso wie die Größe der exe von Delphi zu Turbo Pascal für Windows, welche ebenfalls um den Faktor 10 (wenn ich mich recht erinnere) gewachsen sind.
Die Größe der ausführbaren Dateien von Lazarus war damals für mich ein echtes Problem, da das Programm nicht mehr auf eine Diskette passte. Das Problem hat sich erledigt.
Das Größenwachstum hat sich, meiner subjektiven Wahrnehmung nach, bei Lazarus verlangsamt.
OT
Ich sehe aber ein neues, größeres Problem, die Größe meines Lieblingsbetriebssystems ist über Nacht gigantisch gewachsen.
Ich habe das Problem hier: https://forum.ubuntuusers.de/topic/waru ... u-so-fett/ angesprochen.
Die Größe der ausführbaren Dateien von Lazarus war damals für mich ein echtes Problem, da das Programm nicht mehr auf eine Diskette passte. Das Problem hat sich erledigt.
Das Größenwachstum hat sich, meiner subjektiven Wahrnehmung nach, bei Lazarus verlangsamt.
OT
Ich sehe aber ein neues, größeres Problem, die Größe meines Lieblingsbetriebssystems ist über Nacht gigantisch gewachsen.
Ich habe das Problem hier: https://forum.ubuntuusers.de/topic/waru ... u-so-fett/ angesprochen.
Konrad
www.KoBraSoft.de
www.KoBraSoft.de
-
- Beiträge: 6955
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Grösse der exe FPC vs. C / externe libs
Meine Feststellung war bei einem einfachen Konsolen-HelloWorld. Da ist kein LCL und co. dabei.Dann ist z.B. die kleinste visuelle Windows-Anwendung rund 2,5 MB groß (meine ich mich zu erinnern, habe es gerade nicht getestet).
FPC = 212KB
C = 18KB
ASM = 9KB
Alles Linux Varianten.
Am schlimmsten ist dies Effekt bei 8088 EXE. Turbo-Pascal war da sehr kompakt, der FPC 8088 Cross-Complier ist das schon recht aufgebläht. TB hatte gerade mal 2.9KB.Die Größe der ausführbaren Dateien von Lazarus war damals für mich ein echtes Problem, da das Programm nicht mehr auf eine Diskette passte. Das Problem hat sich erledigt.
Ich vermute mal in der Unit-System gibt es gegenwärtig viel mehr Initialisierungen, wie zu TP-Zeiten.
Man denkt nur an das ganze Zeugs für die dynamischen Arrays. Oder die Classen.
In C muss man für die Arrays schon einen extra-Header verwenden.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: Grösse der exe FPC vs. C / externe libs
Bei mir (Windows) wird das folgende Projekt 34 kB groß (FPC 3.2.2, ohne Debug-Informationen):
Code: Alles auswählen
program Project1;
begin
WriteLn('Hello world');
end.
Zuletzt geändert von wp_xyz am Di 7. Mai 2024, 14:14, insgesamt 1-mal geändert.
-
- Beiträge: 6955
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Grösse der exe FPC vs. C / externe libs
Ich habe auch alles abgestellt, was Debugging anbelangt. Auch Bereichsprüfung. etc.Bei mir (Windows) wird das folgende Projekt 53 kB groß (FPC 3.2.2, ohne Debug-Symbole):
Verwendet die Windows Version von FPC evtl. Win-Api Funktionen ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 962
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: Grösse der exe FPC vs. C / externe libs
Das liegt an der Struktur der LCL. Die VCL ist ein ziemlich dünne Schicht um die Windows API, weswegen die VCL selbst auch nie direkt auf eine andere Plattform portiert wurde (Kylix hatte eine eigene Abart auf Qt basierend).Jorg3000 hat geschrieben: Di 7. Mai 2024, 06:45 Mich würde aber schon interessieren, woher die krassen Unterschiede zwischen (altem) Delphi und derzeitigem Lazarus herkommen, denn es ist mindestens der Faktor 8.
Die LCL wiederum hat entsprechende Abstraktionsschichten drin, die es ermöglicht andere Backends anzubinden und es damit überhaupt erst möglich und für ein vergleichsweise kleines Team wartbar macht die LCL (und die IDE) auf so vielen Plattformen bereitzustellen. Durch die Struktur dieser Schicht kann der Compiler bzw. Linker allerdings auch nicht entsprechend leicht Code rauslassen, der nicht verwendet wird.
Hast du mit aktiviertem Smartlinking kompiliert? Compiler Option -XX. Unter nicht-Windows ist das standardmäßig deaktiviert, da es sonst Probleme mit dem Debuginformationen gibt (im Gegensatz zu Windows, wo das standardmäßig aktiviert ist).Mathias hat geschrieben: Di 7. Mai 2024, 13:23Meine Feststellung war bei einem einfachen Konsolen-HelloWorld. Da ist kein LCL und co. dabei.Dann ist z.B. die kleinste visuelle Windows-Anwendung rund 2,5 MB groß (meine ich mich zu erinnern, habe es gerade nicht getestet).
FPC = 212KB
C = 18KB
ASM = 9KB
Alles Linux Varianten.
Bei mir kommt für ein einfaches HelloWorld dann ein Unterschied von 187 KB (ohne Smartlinking) zu 35 KB (mit Smartlinking) raus.
Und wenn man noch dazu mit der experimentellen Unterstützung für Runtime Packages baut, dann ist die Executable nur noch 16 KB groß (und die librtl.so hat dann 3,7 MB, weil sie auch die ganze (Kern-)RTL enthalten muss, da dann keinerlei Smartlinking - außer innerhalb der Bibliothek - möglich ist).
Unter Windows wird beim Win32/Win64 Ziel immer die Windows API verwendet, das ist die niedrigste, allgemein verfügbare Schnittstelle, die allgemein genutzt werden kann (theoretisch könnte man zwar auch die NT API verwenden, aber da die um ein vielfaches niedriger ist, muss man da viel zu Fuß machen und ist damit für allgemeine Anwendungsentwicklung nicht sinnvoll).Mathias hat geschrieben: Di 7. Mai 2024, 14:12 Verwendet die Windows Version von FPC evtl. Win-Api Funktionen ?
Prinzipiell könnte FPC auch noch kleinere Anwendungen für die großen Plattformen erstellen, allerdings können ein paar der Abstraktionsschichten (ähnlich zu dem was Lazarus hat) nicht gut genug wegoptimiert werden, was sich dann in der Größe niederschlägt. Ich habe ein paar Ideen, wie ich da den Optimizer verbessern kann, aber ich muss da erstmal die Zeit finden, dass ich mit den Ideen experimentieren kann...
FPC Compiler Entwickler
-
- Beiträge: 6955
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Grösse der exe FPC vs. C / externe libs
Mal eine andere Frage, kann man bei FPC irgendwie umgehen, das die unit System nicht geladen wird ?
Wen dies gehen würde, würde es auch die ganze RTL umgehen und die bin müsste etwa gleich sein wie unter C.
Ein HelloWorld würde dann so aussehen.
Wen dies gehen würde, würde es auch die ganze RTL umgehen und die bin müsste etwa gleich sein wie unter C.
Ein HelloWorld würde dann so aussehen.
Code: Alles auswählen
function printf(str: PChar): Integer; varargs cdecl; external 'c';
begin
printf('Hello World'#10);
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 2141
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Grösse der exe FPC vs. C / externe libs
Es gibt einen komandozeilen Parameter mit limitierten Typen zu kompilieren, dann wird ohne RTL kompiliert. Das wird z.b. benutzt um die system unit selbst zu kompilieren.
Das gesagt, dann kannst du halt den größten Teil der Sprache nicht nutzen (Klassen, Objekte, arrays, strings, etc)
Das gesagt, dann kannst du halt den größten Teil der Sprache nicht nutzen (Klassen, Objekte, arrays, strings, etc)
-
- Beiträge: 962
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: Grösse der exe FPC vs. C / externe libs
Was durch die System-Unit bereit gestellt wird ist ein integraler Bestandteil der Sprache Pascal und die System-Unit ist genauso integraler Bestandteil der Compiler/RTL Kombination. Deswegen stellt der Compiler auch keine Mechanismen dazu zu Verfügung, weil der Compiler davon ausgehen muss, dass die System-Unit verfügbar ist.Mathias hat geschrieben: Di 4. Jun 2024, 17:37 Mal eine andere Frage, kann man bei FPC irgendwie umgehen, das die unit System nicht geladen wird ?
FPC Compiler Entwickler
-
- Beiträge: 6955
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Grösse der exe FPC vs. C / externe libs
Ich habe gerade einen neunen Befehl von Linux entdeckt "strings".
Den habe ich mal auf einem einfachen HelloWorld ohne DebugInfos ausprobiert.
Dies gibt eine Text Datei mit 141Kb und 5994 Zeilen.
Da frage ich mich, ob der Compiler da nicht noch ein wenig optimieren könnte ?
Den habe ich mal auf einem einfachen HelloWorld ohne DebugInfos ausprobiert.
Code: Alles auswählen
strings project1>test.txt
Da frage ich mich, ob der Compiler da nicht noch ein wenig optimieren könnte ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 962
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: Grösse der exe FPC vs. C / externe libs
Es würde helfen, wenn du noch sagen würdest, was denn dein project1 genau ist?
FPC Compiler Entwickler
-
- Beiträge: 6955
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Grösse der exe FPC vs. C / externe libs
Ein einfaches HelloWorld. Ohne Debug Infos.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 2141
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Grösse der exe FPC vs. C / externe libs
Bei mir ist das ganze ein gutes Stück kleiner:
Code: Alles auswählen
$> cat test.pas
program Test;
begin
WriteLn('Hello World');
end.
$> fpc ./test.pas
Free Pascal Compiler version 3.2.2 [2023/10/09] for x86_64
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling ./test.pas
Linking test
5 lines compiled, 0.3 sec
$> strings test | wc -l
1877
$> strings test | sort -u | wc -l
809