Seite 1 von 2

Wie wird (X)IncludeFile in der Exe umgesetzt

Verfasst: 07.02.2014 14:48
von hoerbie
Hallo,

bei der Portierung einiger Programme auf PB würde ich gerne auf (X)IncludeFile zurückgreifen, um Teile des Quellcodes, die in mehreren aber nicht unbedingt allen Programmen genutzt werden, in Libraries zu sammeln, z.B.:

-Library 1 mit diversen Funktionen: 200KB Sourcecode
-Library 2 mit diversen Funktionen: andere 200KB Sourcecode
-Programm 1 mit 100KB Sourcecode und benötigt ca. 50KB aus der Library 1 und 100KB aus der Library 2
-Programm 2 mit 100KB Sourcecode und benötigt ca. 150 KB aus der Library 1 und nur 50 KB aus der Library 2
-Weitere Programme, die auch nur Teile aus den Librarys 1 und 2 benötigen

Landet nur das in der .exe, was auch wirklich gebraucht wird, oder werden immer alle Prozeduren/Funktionen aus den Librarys mitkompiliert, die das einzelne Programm unter Umständen gar nicht alle braucht?

Danke und Gruß,
Hoerbie

Re: Wie wird (X)IncludeFile in der Exe umgesetzt

Verfasst: 07.02.2014 15:02
von ts-soft
hoerbie hat geschrieben:Landet nur das in der .exe, was auch wirklich gebraucht wird,
Es landet fast alles in der Exe. In seltenen Fällen, wo eine Procedure keinerlei Abhängigkeiten zu
anderen Proceduren hat, wird diese nicht mitkompiliert. Abhängigkeiten zwischen ungenutzen
Proceduren reichen, damit diese in der Exe landen!

Gruß
Thomas

Re: Wie wird (X)IncludeFile in der Exe umgesetzt

Verfasst: 07.02.2014 15:03
von NicTheQuick
Der Compiler von PureBasic erkennt automatisch, wenn bestimmte Procedures nicht aufgerufen werden und kompiliert sie deshalb nicht mit.

Aaaaaaaber:

Code: Alles auswählen

Procedure func1()
	;Ich werde nur von func2 benutzt
EndProcedure

Procedure func2()
	;Ich nutze zwar func1, aber werde selbst nie aufgerufen
	func1()
EndProcedure
Meines Wissens nach wird hier 'func1()' in die EXE-Datei mit einkompiliert, weil sie nun mal an einer Stelle - nämlich in 'func2()' - aufgerufen wird. Da aber 'func2()' nirgendwo aufgerufen wird, bräuchte man 'func1()' auch nicht mitkompilieren. Es wird trotzdem getan.

Edit:
ts-soft hat mich gerade darin bestätigt.

Re: Wie wird (X)IncludeFile in der Exe umgesetzt

Verfasst: 07.02.2014 20:41
von Danilo
Habe ein Tool gemacht um Prozeduren zu entfernen, die PB noch drin lässt, obwohl nicht benötigt:
- DeadProcedureRemover_IDE.zip

Der Thread im englischen Forum wo das entwickelt wurde:
- Code optimization

Den Source gibts hier:
- DeadProcedureRemover_IDE_SRC.zip

Code: Alles auswählen

Found 1047 procedure macros.
Removed 396 out of 1010 used procedure macros.

Re: Wie wird (X)IncludeFile in der Exe umgesetzt

Verfasst: 12.02.2014 14:49
von hoerbie
Habt vielen Dank für die ausführliche Auskunft. Es ging mir in erster Linie nur um nicht ineinander verschachtelte Prozeduren/Funktionen, wenn die rausfallen im Compilat, reicht mir das, um nicht zuviele verschiedene Libs bauen zu müssen.

Re: Wie wird (X)IncludeFile in der Exe umgesetzt

Verfasst: 12.02.2014 18:24
von Sicro
Habt ihr ein Beispiel-Code mit dem man dieses Verhalten nachprüfen kann?

Mit meinem kleinem Test-Code erhalte ich unter Linux zwei in der Größe identische Dateien:

Code: Alles auswählen

Procedure.s Test()
  Protected a.s = "##########################################################" +
                  "##########################################################" +
                  "##########################################################" +
                  "##########################################################" +
                  "##########################################################" +
                  "##########################################################" +
                  "##########################################################" +
                  "##########################################################" +
                  "##########################################################" +
                  "##########################################################" +
                  "##########################################################"
  
  ProcedureReturn a
EndProcedure

Test() ; beim zweitem Kompilieren auskommentieren

Code: Alles auswählen

wc -c mit_test ohne_test 
15784 mit_test
15784 ohne_test
Die Testdateien habe ich mit Unicode-Unterstützung kompliert.

Re: Wie wird (X)IncludeFile in der Exe umgesetzt

Verfasst: 12.02.2014 20:26
von Christian+
Auf Windows funktioniert dein Testcode ohne Probleme ich habe 6.656 Bytes mit dem Test() Aufruf und 5.120 Bytes ohne.

Sollte auf Linux eigentlich ähnlich aussehen bist du sicher, dass du dich nicht irgendwo vertan hast?

Re: Wie wird (X)IncludeFile in der Exe umgesetzt

Verfasst: 12.02.2014 21:52
von NicTheQuick
Bei mir haben auch beide Dateien '15784' Bytes.

Re: Wie wird (X)IncludeFile in der Exe umgesetzt

Verfasst: 12.02.2014 23:53
von Sicro
Christian+ hat geschrieben:Sollte auf Linux eigentlich ähnlich aussehen bist du sicher, dass du dich nicht irgendwo vertan hast?
Ich habe es mehrmals überprüft.
Christian+ hat geschrieben:Auf Windows funktioniert dein Testcode ohne Probleme ich habe 6.656 Bytes mit dem Test() Aufruf und 5.120 Bytes ohne.
NicTheQuick hat geschrieben:Bei mir haben auch beide Dateien '15784' Bytes.
Dann funktioniert das automatische entfernen von unbenutzten Procedures anscheinend nur unter Windows.

Re: Wie wird (X)IncludeFile in der Exe umgesetzt

Verfasst: 13.02.2014 10:03
von hoerbie
Hallo,

kann das noch jemand auf dem Mac mal ausprobieren?

Ein Grund, warum ich auf PB umsteige, ist die Multiplattform-Unterstützung. Wobei mich nach Windows an sich Linux mehr interessiert als Mac-OS.

Danke und Gruß, Hoerbie