Sign in Join
Wiki copytemporary

Size Matters/de: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11(Dieser Artikel wird zur Zeit übersetzt...)
22
33## Einleitung
44
55Auf dieser Seite geht es um die Größe von Binärdateien. Die Größe der von Lazarus und dem FPC erstellten Binärdateien sorgten in der Vergangenheit für einige Verwirrung. Dieser Artikel soll hier Klarheit schaffen. Insbesondere soll gezeigt werden, wie die Größe der Binärdateien ohne großen Aufwand vermindert werden kann.
66
77### Realistische Größen der von Lazarus/FPC erstellten Binärdateien
88
9-- <b>Dateigrößen unter 1MB sollten kein Problem darstellen!</b>.
9+- Dateigrößen unter 1MB sollten kein Problem darstellen!.
1010 - Stellen Sie sicher, dass Ihre Binärdateien mit der Smartlinking-Option erstellt wurden, und anschließend mit dem Befehl strip sämtliche Debuggerinformationen entfernt wurden. Stellen Sie insbesondere sicher, dass ALLE Bibliotheken mit der Smartlinking-Option erstellt wurden.
11- - <b>Komprimieren Sie NICHT standardmäßig Ihre Dateien mit UPX!</b>: Durch die UPX-Kompression werden die Dateien zwar kleiner - sie verbrauchen bei der Ausführung aber mehr Arbeitsspeicher. Bevor Sie Ihre Binärdateien mit UPX komprimieren, sollten Sie sicherstellen, dass auf den Zielsystemen ausreichend RAM zur Verfügung steht!
11+ - Komprimieren Sie NICHT standardmäßig Ihre Dateien mit UPX!: Durch die UPX-Kompression werden die Dateien zwar kleiner - sie verbrauchen bei der Ausführung aber mehr Arbeitsspeicher. Bevor Sie Ihre Binärdateien mit UPX komprimieren, sollten Sie sicherstellen, dass auf den Zielsystemen ausreichend RAM zur Verfügung steht!
1212- Bei kleinen Anwendungen spielt die systemabhängige Größe der RTL eine gewichtigere Rolle. Standalone binaries, die etwas (sinnvolles) machen, können in einer Größenordnung von 50–100 k erzeugt werden.
1313 - Unter Windows ist es kein Problem, die Windows API benutzende Binärdateien zu erstellen, die nur 20 Kb groß sind.
1414 - Die Unit Sysutils beinhaltet Internationalisierungen, Texte zur Fehlerbenachrichtigung, Routinen zum Abfangen von Ausnahmefehlern und viele andere Dinge, die stets in das zu erstellende Programm gelinkt werden, wenn die entsprechende Unit benutzt wird. Dadurch kann die Größe des erstellten Programms schätzungsweise um 40 bis 100 Kb anwachsen.
1515- Windows-Lazarus-Anwendungen sind ungefähr 500 Kb groß. Je nachdem, wie viele Komponenten der Benutzeroberfläche (widgets) verwendet werden, kann ihre Größe jedoch schnell anwachsen (\>1.5MB)
1616 - Summa summarum sind Lazarus-Anwendungen etwas größer als entsprechende Delphi-Anwendungen. Dies ist der Preis, der für die große Plattforumunabhängigkeit bezahlt wird und die Wartbarkeit des Lazarus-Projektes garantiert.
1717 - Das Wachstum der Binärdateien mit dem Zufügen neuer Komponenten/Units stagniert, wenn mit jedem zusätzlich verwendeten Code kein weiterer zusätzlicher Code aus der LCL verlinkt werden muss.
1818 - Die Größe der Binärdateien hängt entscheidend von der Komplexität der Benutzeroberfläche Ihrer Programme ab.
1919 - In Lazarusanwendungen (wie in Delphianwendungen auch) besteht die Binärdatei zu einem gewissen Prozentsatz aus Zeichenketten und Tabellen. Diese zu komprimieren hat keinen Sinn (wie bei UPX).
2020- Einfache Lazarus-Binärdateien sind unter Linux/FreeBSD größer als entsprechende GCC-Binärdateien, da sie keine gemeinsamen Bibliotheken (shared libraries) verwenden. (Die Bibliotheken können Sie über die Konsole mit dem Befehl "ldd ./Programmname" einsehen)
2121- 64-Bit-Binärdateien sind stets größer als X86-Dateien. Genauso ist der für RISC-Plattformen erstellte Code größer als der für CISC erstellte.
2222
2323### Weshalb sind die Binärdateien derart groß?
2424
25-Antwort: Bei <b>richtigen Einstellungen</b> sind die mit Lazarus kompilierten Binärdateien nicht außergewöhnlich groß. (Bemerkung: Der Begriff "groß" soll hier bedeuten: Größer als im vorhergegangenen Abschnitt geschildert)
25+Antwort: Bei richtigen Einstellungen sind die mit Lazarus kompilierten Binärdateien nicht außergewöhnlich groß. (Bemerkung: Der Begriff "groß" soll hier bedeuten: Größer als im vorhergegangenen Abschnitt geschildert)
2626
2727Sollten Sie nach dem Kompilieren "große" Binärdateien erhalten, so können die Gründe dafür also
2828
2929- in einer falschen Konfiguration des FreePascal-Compilers,
3030- in einer unrealistischen Vorstellung von der Größe von Binärdateien ;)
3131- oder daran liegen, dass Sie den FPC für Zwecke benutzen, für die er nicht konzipiert wurde.
3232
3333Der letzte Punkt ist der unwahrscheinlichste - der FPC ist hochflexibel. In den folgenden Paragraphen wird den möglichen Ursachen einer zu großen Binärdatei genauer nachgegangen.
3434
3535### Über Framework
3636
3737Eine Framework vermindert die mit der Entwicklung einer Anwendung verbundene Arbeit im hohen Maße.
3838
3939Dies kommt aber auf seine Kosten, da ein Framework keine reine Bibliothek ist, sondern ein ganzes Subystem, dass damit handelt mit der aussenstehenden Welt angekoppelt zu sein/werden. Ein Framework ist für Applikationen enworfen, die eine Menge Funktionalität bedürfen, und der Bedarf an Applikationen die keine große Funktionalität bedürfen, sind kein oder ein sehr unwichtiges Gebiet für die Gestalter eines Frameworks
4040
4141Dies heißt aber nun das eine leere Applikation in einem Framework relativ groß sein kann.
4242
4343Die größe einer leeren Apllikation entsteht nicht von Compiler Ineffizienz, sondern das Framework Overhead. Der Compiler wird unbenützen Code automatisch entfernen, aber nicht alles kann automatisch entnommen werden. Die Ausgestaltung des Frameworks bestimmt welchen Code der Compiler zur Compilierzeit entfernen kann.
4444
4545Einige Frameworks verursachen sehr wenig Overhead, einige verursachen eine Menge Overhead. Erwartete Binary-Größen für leere Applikationen bei bekannten Frameworks:
4646
4747- Kein Framework: +/- 25KB
4848- MSEGUI: +/- 600KB
4949- Lazarus LCL: +/- 1000KB
5050- Free Vision: +/- 100KB
5151- Key Objects Library: +/- 50KB
5252
5353Kurz gefasst, wählen sie ihr Framework sorgfältig. Ein leistungsstarkes Framework kann ihnen eine Menge Zeit sparen, aber, wenn der Speicher knapp ist, mag ein kleineres Framework die bessere Wahl sein. Aber seien sie sicher das sie wirklich weniger Platz benötigen. Viele Amateure wählen routinemäßig das kleinste Framework, und landen bei nicht wartbaren Anwendungen und geben auf.
5454
5555### Sind große Binärdateien schlecht?
5656
5757Das kommt ganz auf den Standpunkt an, von dem aus man die Sache betrachtet. Zunächst gilt es, den Begriff "groß" festzulegen. Im Vorhergegangenen Abschnitt haben wir einen kleinen Überblick über mögliche Größen von lazaruserstellte Binärdateien gegeben. Wir nennen nun eine Binärdatei groß, wenn sie deutlich über den angegebenen Werten liegt.
5858
5959Obwohl kleine Binärdateien sicherlich überall wünschenswert sind, so ist es ein oft zitiertes Missverständnis, größere binäre Dateien seien langsamer in der Ausführung. Diese Behauptung ist schlichtweg falsch.
6060
6161Es gibt allerdings einige Bereiche, in denen Binärdateien klein sein *müssen*:
6262
63631. In der Welt der Kleincomputer (PDAs, Handhelds, u.s.w.), wo der Speicherplatz begrenzt ist.
64642. Wenn die Zielgruppe keine schnelle Anbindung ans Internet besitzt (z.B. im Fall von Modems)
65653. Bei Benchmarks und Vergleiche der Leistungsfähigkeit diverser Compiler und diverser Programmiersprachen.
6666
6767#### Eingebettete Systeme
6868
6969Free Pascal kann auch für eingebettete Systeme produktiv eingesetzt werden. Die Entwicklung von Free Pascal orientiert sich jedoch sehr viel stärker an allgemeinen Anwendungen (auf Desktop-PCs). Für hoch spezialisierte Anwendungsgebiete, kann ein Schattenprojekt eingerichtet werden, welches sich genau auf diesen Fall beschränkt -- ähnlich wie es verschiedene Linux Distributionen für verschiedene Anwendungsgebiete gibt. Das FPC-Team mit dieser zusätzlichen Aufgabe zu belasten wäre keine gute Idee, besonders deshalb, weil die Hälfte der ernsthaft interessierten Benutzer ihren eigenen Weg gehen werden.
7070
7171#### Verbreitung über Modems
7272
7373Sollte Ihre Zielgruppe hauptsächlich über langsame Modems verfügen, lohnt sich natürlich der Gedanke, die Binärdateien so klein wie möglich zur Verfügung zu stellen. Jedoch wird das Argument Modem häufig überschätzt:
7474
75751\. Durch den zunehmenden Ausbau des Internets stehe immer größere Bandbreiten zur Verfügung. So benutzt ein immer kleiner werdender Anteil der Internetbenutzer ein Modem oder ISDN.\
76762\. Die Downloadzeiten mit einem 56k-Modem werden häufig unterschätzt. Einige MB lassen sich in weniger als einer halben Stunde herunterladen.
7777
7878#### Wettbewerbe
7979
8080Ein anderer Vorteil kleiner Binärdateien ist das gute Abschneiden der Größe der Binärdateien der betrachteten Programmiersprache im Vergleich mit der Größe der Binärdateien anderer Programmiersprachen(like the Language Shootout). Wieauchimmer ist das mehr wie das lösen eines Puzzles, und nicht wirklich zusammenhängend mit vernünftiger Programmierung
8181
8282### Mangelhafte Kompilerkonfiguration
8383
8484Dieser Abschnitt ist dazu da, Ihnen einen kleinen Überblick über für Binärdateien günstige Konfigurationen und Einstellungen des Compilers zu geben. Wenn Sie mehr Hintergrundinformationen benötigen, klicken Sie auf die folgenden Links: [manuals](http://www.freepascal.org/docs.html) [buildfaq](http://www.stack.nl/~marcov/buildfaq.pdf)
8585
8686Hinsichtlich der Kompilereinstellungen kann es mehrere Gründe für große Binärdateien geben. Im Einzelnen, mit abnehmender Wahrscheinlichkeit:
8787
88881. Die Binärdatei beinhaltet Debuginformationen.
89892. Die Binärdatei wurde nicht vollständig mit Smartlinking erstellt.
90903. In die Binärdatei wurden units eingebunden, deren Initialisierungsabschnitte sehr viel Programmcode beinhalten.
91914. Sie linken alle (externen) Bibliotheken (libraries) statisch.
92925. Die Codeoptimierung des Compilers ist nicht (vollständig) eingeschalten.
93936. Die Lazarus Projektdatei (lpr) bindet im uses-Bereich nicht benötigte units ein.
9494
9595Für zukünftige Versionen des FreePascal-Compilers ist die Funktion des "shared linking" eingeplant. Damit wird es möglich sein, noch wesentlich kleinere Binärdateien zu erstellen, als dies heute möglich ist. (Diese Methode birgt allerdings den Nachteil, dass diverse DLLs zusammen mit dem Programm übertragen werden müssen)
9696
9797#### Debuginformationen
9898
9999FreePascal hat keinen hauseigenen Debugger oder Linker. Stattdessen verwendet es für die entsprechenden Zwecke den GNU-Debugger (GDB) bzw. den LD. Diese Programme speichern die Debuginformationen innerhalb der Binärdateien ab und blähen diese dadurch auf. So kann ein 6 MB großes Programm MIT den Debuginformationen gut 40 MB groß sein.
100100
101101Sie können die überflüssigen Debuginformationen mit einem kleinen Programm namens "strip" entfernen. Bitte beachten Sie, dass Windows von Hause aus ein Programm "strip" mitliefert, welches jedoch nur zur Entfernung eines Teils der Debuginformationen in der Lage ist. Benutzen Sie daher die Version des genannten Programms, die ab 2006 mit dem FPC mitgeliefert wird. Unter Windows befindet es sich im Lazarus-Ordner "lazarus\fpc\fpcversion\bin\i386-win32\\", unter Linux lässt es sich direkt von der Konsole aus ausführen. (Unter Linux im Ordner "/usr/bin/"). Gehen Sie wie folgt vor:
102102
103103Geben Sie folgendes an der Konsole ein:
104104
105105```DOS
106106strip --strip-all Dateiname
107107```
108108
109109Dabei steht "Dateiname" für Pfad + Name der Binärdatei.
110110
111111Versuchen Sie stets, die Debuginformationen auf diese manuelle Weise zu entfernen. Verwenden Sie stets die mit FPC/Lazarus mitgelieferte Version von strip - verwenden Sie niemals Versionen unbekannten oder unsicheren Ursprungs.
112112
113113#### Smartlinking
114114
115115Das Grundprinzip des Smartlinkings ist leicht einzusehen: Es wird nur genau der Code in die Binärdatei gelinkt, der auch vom Programm gebraucht wird. Dies beeinflusst die Größe der Datei außerordentlich positiv.
116116
117117Der Compiler ist leider nicht in der Lage, herauszufinden, welcher Code nun wirklich für das zu kompilierende Programm verwendet wird. Vielmehr teilt er den Code in Codebereiche auf, und es ist dann Aufgabe des Linkers, zu entscheiden, welcher Bereich letzten Endes in die Binärdatei gelangt. Wenn *kein* Teil des Programms einen Codebereich benötigt oder auf ihn weist, wird dieser Bereich entfernt.
118118
119119Diese Vorgehensweise bringt einige Probleme mit sich:
120120
121-- Virtuelle Methoden können über die <abbr title="Virtual Method Table">VMT</abbr> implizit aufgerufen werden. Der GNU Linker kann Funktionsaufrufe nicht durch die <abbr title="Virtual Method Table">VMT</abbr> hindurch verfolgen. Also müssen alle virtuellen Methoden in das Programm gelinkt werden;
121+- Virtuelle Methoden können über die VMT implizit aufgerufen werden. Der GNU Linker kann Funktionsaufrufe nicht durch die VMT hindurch verfolgen. Also müssen alle virtuellen Methoden in das Programm gelinkt werden;
122122- Die Tabellen für resource strings referenzieren jede einzelne String-Konstante. Daher werden alle String-Konstanten hinein gelinkt (ein Grund, warum die Unit SysUtils so groß ist).
123123- Symbole, die von außerhalb der Binärdatei erreichbar sind (dies ist auch für nicht Bibliotheks-ELF-Binärdateien möglich), müssen erhalten bleiben. Diese Einschränkung ist nötig um zu verhindern, dass exportierte Funktionen aus Bibliotheken entfernt werden.
124124- Eigenschaften (Properties) und Funktionen, die als published deklariert sind, können zur Laufzeit durch String-Operationen referenziert werden. Sie müssen daher mit eingelinkt werden. Diese Methoden können von sich aus anderen Code aufrufen, der als private/protected oder public deklariert ist und daher ebenfalls eingebunden werden muss.
125125
126126Ein weiterer wichtiger Seiteneffekt, der zwar logisch ist, aber oft vergessen wird, ist dass dieser Algorithmus alles verlinken wird, das in dem initialization- oder finalization-Abschnitt einer Unit genutzt wird – selbst wenn nichts aus dieser Unit genutzt wird. Achten Sie also darauf, was sie alles in dem uses-Abschnitt angeben.
127127
128128Smartlinkting kann am effektivsten durchgeführt werden, wenn **jede Unit, einschließlich der RTL** smartlinked kompiliert wurde.
129129
130130Der Grund dafür ist einfach: LD konnte (bis vor kurzem) nur solche Units "smart" linken, die aus einem einzigen Object-File (.o) bestehen. Für jedes Symbol muss also ein eigenes Object-File erstellt werden. Alle Object-Files einer Unit (bis zu einigen Tausend) werden dann in einer Archiv-Datei (.a) zusammengefasst. Dieser ganze Prozess benötigt viel Zeit (und Speicher), und ist daher optional und nur für Release-Versionen (und nicht für Snapshots) eingeschaltet. **Oft gibt es Probleme beim smartlinking in Verbindung mit einem Snapshot, der Units der RTL/FCL enthält, die nicht mit smartlinked kompiliert wurden.** Die einzige Lösung ist, diese Units mit smartlinking (-CX) selbst neu zu übersetzen. Siehe buildfaq für weiter Informationen.
131131
132132In the future this will be improved when the compiler will emit smartlinking code by default, at least for the main targets. This is made possible by two distinct developments. First, the GNU linker LD now can smartlink more finely grained (at least on Unix) using --gc-sections, second the arrival of the FPC internal linker (in the 2.1.1 branch) for all working Windows platforms (wince/win32/win64). The smartlinking using LD --gc-sections still has a lot of problems because the exact assembler layout and numerous details with respect to tables must be researched, we often run into the typical problem with GNU development software here, the tools are barely tested (or sometimes not even implemented, see DWARF standard) outside what GCC uses/stresses.
133133
134134The internal linker can now smartlink Lazarus (17 seconds for a full smartlink on my Athlon64 3700+ using about 250MB memory) which is quite well, but is windows only and 2.1.1 for now. The internal linker also opens the door to more advanced smartlinking that requires Pascal specific knowledge, like leaving out unused virtual methods (20% code size on Lazarus examples, 5% on the Lazarus IDE as a rough first estimate), and being smarter about unused resourcestrings. This is all still in alpha, and above numbers are probably too optimistic, since Lazarus is not working with these optimizations yet.
135135
136136#### Initialization and finalization sections
137137
138138If you include a unit in *USES* section, even when USES'd indirectly via a different unit, then IF the unit contains initialization or finalization sections, that code and its dependancies is always linked in.
139139
140140A unit for which this is important is sysutils. As per Delphi compatibility, sysutils converts runtime errors to exceptions with a textual message. All the strings in sysutils together are a bit bulky. There is nothing that can be done about this, except removing a lot of initialisation from sysutils that would make it delphi incompatible. So this is more something for a embedded release, if such a team would ever volunteer.
141141
142142#### Static binaries
143143
144144One can also make fully static binaries on any OS, incorporating all libraries into the binary. This is usually done to ease deployment, but has as tradeoff huge binaries. Since this is wizard territory I only mention this for the sake of completeness. People that can do this, hopefully know what they are doing.
145145
146146#### Optimierung
147147
148148Optimization can also shave off a bit of code size. Optimized code is usually tighter. (but only tenths of a percent) Make sure you use -O3.
149149
150150#### Lazarus lpr Dateien
151151
152152In Lazarus, if you add a package to your project/form you get it's registration unit added to the lpr file. The lpr file is not normally opened, if you want to edit it, first open it (via project -\> view source). Then remove all the unnecessary units (Interfaces, Forms, and YOUR FORM units are only required, anything else is useless there, but make sure you don't delete units that only need to register things, such as image readers (jpeg) or testcases).
153153
154154You can save up to megabytes AND some linking dependencies too if you use big packages (such as glscene).
155155
156156This kind of behaviour is typical for libraries that do a lot in the initialisation sections of units. Note that it doesn't matter where they are used (.lpr or a normal unit). Of course smartlinking tries to minimalize this effect
157157
158158### 2.2.0 Probleme
159159
160160I routinely crack down on size discussions, to keep some sanity in them. This faq was meant for that.
161161
162162However lately I've seen some size problems that were not of the routine kind. I suspect FPC changed behavior due to the internal linker in 2.2.0+. Since I want to try to be fair, I'll list my suspicions here. Note that these remarks hold for the default setup with internal linker enabled.
163163
164164- It seems that FPC 2.2.0 doesn't strip if any -g option is used to compile the main program. This contrary to earlier versions where -Xs had priority over -g
165165- It seems that FPC 2.2.0 doesn't always smartlink when crosscompiling. This can be problematic when compiling for windows, not only because of size, but also because dependencies are created to functions that might not exist.
166166
167167### UPX
168168
169169[UPX](http://upx.sourceforge.net/) ist ein Programm, dass die Größe von Binärdateien durch Kompression erheblich vermindert. Dabei ist zu beachten, dass UPX neben Vorteilen auch Nachteile besitzt.
170170
171171Die Vorteile sind:
172172
1731731. Zur Ausführung UPX-komprimierter Binärdateien sind keine Dekompressionsprogramme notwendig, da UPX alle nötigen Algorithmen in die Binärdatei integriert.
1741742. UPX verkleinert die Größe Ihrer *unkomprimierten* Binärdateien erheblich. (Bitte beachten Sie, dass Sie noch kleinere Dateien erhalten, wenn Sie für die Komression von Binärdateien externe Programme verwenden)
1751753. Durch die Kompression benötigt die unkomprimierte Binärdatei weniger Platz auf Speichermedien.
1761764. Durch die mit UPX erreichten Dateigrößen können Sie diejenigen Benutzer zufriedenstellen, die eine Anwendung nach Ihrem Platzverbrauch werten.
177177
178178Die Nachteile sind:
179179
1801801. Da jede UPX-komprimierte Binärdatei den Dekompressionsalgorithmus enthält, sind die Kompressionsraten nicht so groß, wie sie mit Hilfe externer Programme erreicht werden könnten.
1811812. Mit jedem Aufruf einer UPX-komprimierten Binärdatei wird zunächst der komprimierte Teil der Anwendung entpackt, bevor er ausgeführt wird.
1821823. Seit dem viele Betriebssysteme ZIP-Dateien integriert und ohne Zusatzsoftware entpacken können, verliert die UPX-Kompression an Gewicht.
1831834. Da die windowsinterne Speicherverwaltung nicht optimal mit solchen intern komprimierten Binärdateien umgehen kann, wird bei der Ausführung die gesamte Binärdatei in den Speicher geladen. Dies kann eine zusätzliche Speicherbelastung des Arbeitsspeichers bedeuten.
184184
185185Um den letzten Punkt näher zu erläutern: Bei geringem freien Arbeitsspeicher werden nur diejenigen Teile einer unkomprimierten Binärdatei in den Arbeitsspeicher geladen, die wirklich von der Anwendung gebraucht werden. Bei UPX-komprimierten Binärdateien muss sich stets die gesamte Binärdatei im Arbeitsspeicher befinden.
186186
187187Wenn hohe Kompressionsraten erreicht werden sollen, muss die gesamte Binärdatei vor ihrer Ausführung in den Arbeitsspeicher hinein entpackt werden. Nicht benötigte Bereiche des Programms gelangen nach einiger Zeit in die Swap, und belegen hier unnötig Speicherplatz.
188188
189189## Unrealistische Erwartungen
190190
191191A lot of people simply look at the size of a binary and scream **bloat!**. When you try to argue with them, they hide behind comparisons (but TP only produces...), they never really say 'why' they need the binary to be smaller at all costs. Some of them don't even realise that 32-bit code is ALWAYS bigger than 16-bit code, or that OS independance comes at a price, or ...,or ..., or...
192192
193193As said earlier, with the current HD sizes, there is not that much reason to keep binaries extremely small. FPC binaries being 10, 50 or even 100% larger than compilers of the previous millenium shouldn't matter much. A good indicator that these views are pretty emotional and wellfounded is the overuse of UPX (see above), which is a typical sign of binary-size madness, since technically it doesn't make much sense.
194194
195195So where is this emotion coming from them? Is it just resisting change, or being control-freaks? I never saw much justified cause, except that sometimes some of them were pushing their own inferior libraries, and tried to gain ground against well established libs based on size arguments. But this doesn't explain all cases, so I think the binary size thing is really the last "640k should be enough for anybody" artefact. Even though not real, but just mental.
196196
197197A dead giveway for that is that the number of realistic patches in this field is near zero, if not zero. It's all maillist discussion only, and trivial RTL mods that hardly gain everything, and seriously hamper making real applications and compability. (and I'm not a compability freak to begin with). There are no cut down RTLs externally maintained, no patch sets etc, while it would be extremely easy. Somehow people are only after the last byte if it is easy to achieve, or if they have something "less bloated" to promote.
198198
199199Anyway, the few embedded people I know that use FPC intensively all have their own customized cut back libraries. For one person internationalisation matters (because he talks a language with accents), and exceptions do not, for somebody else requirements are different again. Each one has its own tradeoffs and choices, and if space is 'really' tight, you don't compromise to use the general release distro.
200200
201201And yes, FPC could use some improvements here and there. But those shouldn't hurt the "general programming", the multiplatform nature of FPC, the ease of use and be realistic in manpower requirements. Complex things take time. Global optimizers don't fall from the sky readily made.
202202
203203### Vergleiche mit GCC
204204
205205Somewhat less unrealistic are comparisons with GCC. Even the developers mirror themselves (and FPC) routinely against gcc. Of course gcc is a corporate sponsored behemoth, who is also the Open Source's world favorite. Not all comparisons are reasonable or fair. Even compilers that base themselves on GCC don't support all heavily sponsored "c" gcc's functionality.
206206
207207Nevertheless, considering the differences in project size, FPC does a surprisingly good job. Speed is ok, except maybe for some cases of heavily scientific calculating, binary sizes and memory use are sufficient or even better in general, the number of platforms doesn't disappoint (though it is a pity that 'real' embedded targets are missing).
208208
209209Another issue here is that freepascal generally statically links (because it is not abi stable and would be unlikely to be on the target system already even if it was) its own rtl. GCC dynamically links against system libraries. This makes very small (in terms of source size) programs made with fpc have significantly larger binaries than those made with gcc. It's worth mentioning here, that the binary size has nothing to do with the memory footprint of the program. FPC is usually much better in this regard than gcc.
210210
211211Still, I think that considering the resources, FPC is doing extraordinary well.
212212
213213### Vergleiche mit Delphi
214214
215215In comparisons with Delphi one should keep in mind that 32-bit Delphi's design originates in the period that a lot of people DIDN'T even have pentium-I's, and the developer that had 32MB RAM was a lucky one. Moreover Delphi was not designed to be portable.
216216
217217Considering this, Delphi scaled pretty well, though there is always room for improvement, and readjustments that correct historical problems and tradeoffs. (it is a pretty well known fact that a lot of assembler routines in newer Delphi's were slower than their Pascal equivalents, because they were never updated for newer processors. Only the recent D2006 is said to have corrected this).
218218
219219Still, slowly on the compiler front, FPC isn't Delphi's poor cousin anymore. The comparisons are head-on, and FPC 2.1.1 winning over Delphi is slowly getting the rule, and not the exception anymore.
220220
221221Of course that is only the base compiler. In other fields there is still enough work to do, though the internal linker helps a lot. The debugger won't be fun though :-) Also in the language interoperability (C++, Obj C, JNI) and shared libraries is lots of work to do, even within the base system.
222222
223223### Vergleiche mit .NET/Java
224224
225225Be very carefull with comparisons to these JIT compiled systems, JITed programs have different benchmark characteristics and also extrapolating results from benchmarks to full programs is different.
226226
227227While a JIT can do a great job sometimes (specially in small programs that mostly consist out of a single tight loop), but this good result often doesn't scale. Overall my experience is that statically compiled code is usually faster in most code that is not mainly bound by some highly optimizable tight loop, despite the numerous claims on the net otherwise.
228228
229229A fairly interesting quantitative source for this is this[Shootout faq](http://shootout.alioth.debian.org/gp4sandbox/faq.php#fullcpu) entry. Another interesting one is [memory allocation in JVM/.NET](http://www.folding-hyperspace.com/program_tip_11.htm)\
230-\
231230
232231---
233232*From the Free Pascal wiki, page "Size Matters/de", as it stood on 2014-11-22 after a change by Olaf, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
234233Category: Deutsch

Back to history