Wie wird (X)IncludeFile in der Exe umgesetzt

Anfängerfragen zum Programmieren mit PureBasic.
hoerbie
Beiträge: 37
Registriert: 06.12.2013 13:53

Wie wird (X)IncludeFile in der Exe umgesetzt

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

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

Beitrag 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.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

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

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
hoerbie
Beiträge: 37
Registriert: 06.12.2013 13:53

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

Beitrag 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.
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

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

Beitrag 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.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

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

Beitrag 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?
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

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

Beitrag von NicTheQuick »

Bei mir haben auch beide Dateien '15784' Bytes.
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

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

Beitrag 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.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
hoerbie
Beiträge: 37
Registriert: 06.12.2013 13:53

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

Beitrag 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
Antworten