Warum eigentlich Declare?
Warum eigentlich Declare?
Hallo,
ich arbeite immer noch an einem größeren Projekt, und jedesmal, wenn ich eine neue Prozedur anlege, reg ich mich auf, weil ich immer noch zusätzlich irgendwo die entsprechende Declare-Anweisung einbauen muß. Hin und wieder vergißt man es auch (besonders, wenn man zwischen zwei Testläufen mehrere Prozeduren anlegt), und dann muß man das immer noch nachholen.
Mir persönlich erscheint das allerdings total sinnlos. Sozusagen 90% meiner Prozeduren rufen andere Prozeduren auf, und die können codemäßig natürlich nicht immer so eingereiht werden, daß sich das Declare erübrigt.
Warum gibt's also überhaupt die Sache mit dem Declare?
Ich hab mir schon oft überlegt, es wäre ein super Feature im jaPBe, wenn in einer separaten Include-Datei automatisch Declares eingefügt werden, sobald eine Prozedur irgendwo angelegt wird. Aber andererseits wäre es doch sinnvoller, wenn schon Purebasic da nicht so pingelig wäre. Hat es überhaupt einen tieferen Sinn, daß es so ist wie es ist? Hätte es vielleicht sogar Nachteile, wenn Purebasic von Haus aus sich beim Kompilieren einfach alle Prozeduren merkt? Falls ja, warum gibt es dann keine DeclareEverything()-Funktion?
ich arbeite immer noch an einem größeren Projekt, und jedesmal, wenn ich eine neue Prozedur anlege, reg ich mich auf, weil ich immer noch zusätzlich irgendwo die entsprechende Declare-Anweisung einbauen muß. Hin und wieder vergißt man es auch (besonders, wenn man zwischen zwei Testläufen mehrere Prozeduren anlegt), und dann muß man das immer noch nachholen.
Mir persönlich erscheint das allerdings total sinnlos. Sozusagen 90% meiner Prozeduren rufen andere Prozeduren auf, und die können codemäßig natürlich nicht immer so eingereiht werden, daß sich das Declare erübrigt.
Warum gibt's also überhaupt die Sache mit dem Declare?
Ich hab mir schon oft überlegt, es wäre ein super Feature im jaPBe, wenn in einer separaten Include-Datei automatisch Declares eingefügt werden, sobald eine Prozedur irgendwo angelegt wird. Aber andererseits wäre es doch sinnvoller, wenn schon Purebasic da nicht so pingelig wäre. Hat es überhaupt einen tieferen Sinn, daß es so ist wie es ist? Hätte es vielleicht sogar Nachteile, wenn Purebasic von Haus aus sich beim Kompilieren einfach alle Prozeduren merkt? Falls ja, warum gibt es dann keine DeclareEverything()-Funktion?
- 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
>> Warum gibt's also überhaupt die Sache mit dem Declare?
Damit der Compiler Speicherplatz reservieren kann. Da der PBCompiler ein Ein-Pass-Compiler ist (nehme ich jedenfalls an) ist dies nötig. Die Kompilierzeit ist hierdurch geringer. Dafür kann der Compiler seinen erzeugten Code leider auch nicht so gut optimieren.
>> Ich hab mir schon oft überlegt, es wäre ein super Feature im jaPBe, wenn in einer separaten Include-Datei automatisch Declares eingefügt werden, sobald eine Prozedur irgendwo angelegt wird
JaPBe bietet doch die Möglichkeit Declare-Dateien anzulegen. Wenn diese Funktion nicht deaktiviert ist, so werden diese Dateien automatisch angelegt.
>> Aber andererseits wäre es doch sinnvoller, wenn schon Purebasic da nicht so pingelig wäre.
Also ich habe schon mit vielen verschiedenen Programmiersprachen gearbeitet und würde also das Gegenteil behaupten. In vielen anderen Sprachen werden nicht nur Funktionen (Proceduren) deklariert sondern sämtliche Variablen müssen deklariert werden.
Damit der Compiler Speicherplatz reservieren kann. Da der PBCompiler ein Ein-Pass-Compiler ist (nehme ich jedenfalls an) ist dies nötig. Die Kompilierzeit ist hierdurch geringer. Dafür kann der Compiler seinen erzeugten Code leider auch nicht so gut optimieren.
>> Ich hab mir schon oft überlegt, es wäre ein super Feature im jaPBe, wenn in einer separaten Include-Datei automatisch Declares eingefügt werden, sobald eine Prozedur irgendwo angelegt wird
JaPBe bietet doch die Möglichkeit Declare-Dateien anzulegen. Wenn diese Funktion nicht deaktiviert ist, so werden diese Dateien automatisch angelegt.
>> Aber andererseits wäre es doch sinnvoller, wenn schon Purebasic da nicht so pingelig wäre.
Also ich habe schon mit vielen verschiedenen Programmiersprachen gearbeitet und würde also das Gegenteil behaupten. In vielen anderen Sprachen werden nicht nur Funktionen (Proceduren) deklariert sondern sämtliche Variablen müssen deklariert werden.
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Oh, es ist noch jemand wach 
Naja also die Funktion im jaPBe hab ich noch nirgends gefunden (hab aber bereits danach gesucht!
)
Aber in dem Fall werd ich nochmal etwas genauer danach schauen. Zur Not frag ich hier einfach nochmal nach
Zum Compiler selbst: Dann wäre es halt wenigstens praktisch, wenn man per Compiler-Direktive aus dem Ein-Pass-Compiler einen Zwei-Pass-Compiler machen könnte, denn wenn ich mir das als Programmierer aussuchen kann, hab ich es ja in der Hand, ob der Compiler länger brauchen darf (und mir wäre es das ehrlich gesagt auch wert, denn der Compiler ist ja sowieso schon schnell genug). ICH HOFFE MAL DASS DAS HIER EINER DER PB-ENTWICKLER LIEST!
Naja also die Funktion im jaPBe hab ich noch nirgends gefunden (hab aber bereits danach gesucht!
Aber in dem Fall werd ich nochmal etwas genauer danach schauen. Zur Not frag ich hier einfach nochmal nach
Zum Compiler selbst: Dann wäre es halt wenigstens praktisch, wenn man per Compiler-Direktive aus dem Ein-Pass-Compiler einen Zwei-Pass-Compiler machen könnte, denn wenn ich mir das als Programmierer aussuchen kann, hab ich es ja in der Hand, ob der Compiler länger brauchen darf (und mir wäre es das ehrlich gesagt auch wert, denn der Compiler ist ja sowieso schon schnell genug). ICH HOFFE MAL DASS DAS HIER EINER DER PB-ENTWICKLER LIEST!
- 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
jaPBe Projekteinstellungen / Grundeinstellungen / Erzeuge Declare-Dateien einen Haken setzen 
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Warum eigentlich Declare?
Ach ja, das gute alte QBasic konnte das. Es hat automatisch beim Speichern der bas Datei die DECLARE Anweisungen ganz an den Anfang der Datei geschrieben. Auch genial waren die separaten 'Seiten', wo die Prozeduren und Funktionen einzeln bearbeitet und angezeigt werden konnten und man auf umherscrollen oder falten nicht angewiesen war.ZeHa hat geschrieben:Ich hab mir schon oft überlegt, es wäre ein super Feature im jaPBe, wenn in einer separaten Include-Datei automatisch Declares eingefügt werden, sobald eine Prozedur irgendwo angelegt wird.
Damit der Compiler a) die Syntax checken kann und b) weiß, welche Variablentypen er in den erzeugten Code einbauen muss.ts-soft hat geschrieben:>> Warum gibt's also überhaupt die Sache mit dem Declare?
Damit der Compiler Speicherplatz reservieren kann.
Klar könnte der Compiler in einem ersten Lauf durch den Code gehen und schauen, was der Entwickler gemeint haben könnte. Aber das geht eben drastisch auf die Performance. Ok, Performance mag bei PB-Projekten im Hobbybereich egal sein. In einem professionellen Projekt kannst man sich das aber nicht leisten. Stell Dir vor, da wird an einem Programmodul eine Zeile geändert und das Modul neu kompiliert. Der Compiler müsste dafür aber vorsichtshalber ein paar hundert MB Quellcode parsen, um nach Funktionsdeklarationen zu suchen. Leider hat ein anderer Entwickler aber gerade eine Datei offen. Folge: der Compiler muss abbrechen, denn in der offenen Datei könnten ja gerade ein paar relevante Änderungen gemacht werden.
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."
Es gibt keine Vista-Witze. Es ist alles wahr!
Es gibt keine Vista-Witze. Es ist alles wahr!
- Didelphodon
- Beiträge: 360
- Registriert: 18.12.2004 13:03
- Wohnort: Wien
- Kontaktdaten:
Ihr habt da alle ein Thema angeschnitten, das noch viel weiterreichender ist, als dass es nur Prozeduren und ihre Declares beträfe. Ich hab mich mit diesem Thema zwangsweise hinsichtlich PBE auseinandersetzen müssen und folgendes ist hierzu erwähnenswert ...
Mal gleich vorweg, PBE wird auch in diesem (und in meinen nachfolgend geschilderten Fällen) Fall das Leben des Programmierers erheblich erleichtern.
Die Declares können automatisch vorgezogen werden, ich weiss jetzt zwar nicht genau wie jaP... das macht, aber ich schätze mal, dass es die Declares einfach "nur" vorschaltet. Es wäre dsbzgl. interessant, was jaP... macht, wenn als Parameter ein Strukturenpointer übergeben wird; wenn die Declares einfach nur vorgehängt werden, dann kann zwangsweise die Struktur zu diesem Strukturenpointer noch nicht bekannt sein => Fehler?
Wo wir gerade bei Strukturen sind: Das gleiche Problem wie Prozedur/Declare haben auch die Strukturen selbst. Verwendet mal eine nachfolgend deklarierte Struktur in einer zuvorgehend deklarierten Struktur => geht nicht.
Wie wird PBE die Automatisierung machen (übrigens, das Feature wird Auto-Definition-Positioning heißen)? PBE wird zuerst alle Konstanten gruppieren; dann kommen die Strukturen, wobei die Reihenfolge unter Berücksichtigung der (Sub-)Verwendung (Extends, Felder) dieser angepasst wird; dann kommen die Interfaces, wobei hier für die dasselbe, wie bei den Strukturen gilt; dann kommen globale Variablen; dann kommen die Declares der Prozeduren; und nun gehts erst mit beliebig angeordnetem Code weiter.
Hoffe, das war jetzt einigermaßen nachvollziehbar und es hilft Euch.
LG Didel.
Mal gleich vorweg, PBE wird auch in diesem (und in meinen nachfolgend geschilderten Fällen) Fall das Leben des Programmierers erheblich erleichtern.
Die Declares können automatisch vorgezogen werden, ich weiss jetzt zwar nicht genau wie jaP... das macht, aber ich schätze mal, dass es die Declares einfach "nur" vorschaltet. Es wäre dsbzgl. interessant, was jaP... macht, wenn als Parameter ein Strukturenpointer übergeben wird; wenn die Declares einfach nur vorgehängt werden, dann kann zwangsweise die Struktur zu diesem Strukturenpointer noch nicht bekannt sein => Fehler?
Wo wir gerade bei Strukturen sind: Das gleiche Problem wie Prozedur/Declare haben auch die Strukturen selbst. Verwendet mal eine nachfolgend deklarierte Struktur in einer zuvorgehend deklarierten Struktur => geht nicht.
Wie wird PBE die Automatisierung machen (übrigens, das Feature wird Auto-Definition-Positioning heißen)? PBE wird zuerst alle Konstanten gruppieren; dann kommen die Strukturen, wobei die Reihenfolge unter Berücksichtigung der (Sub-)Verwendung (Extends, Felder) dieser angepasst wird; dann kommen die Interfaces, wobei hier für die dasselbe, wie bei den Strukturen gilt; dann kommen globale Variablen; dann kommen die Declares der Prozeduren; und nun gehts erst mit beliebig angeordnetem Code weiter.
Hoffe, das war jetzt einigermaßen nachvollziehbar und es hilft Euch.
LG Didel.
Das Leben ist ein sch*** Spiel, aber die Grafik ist irre!
Fighting for peace is like fuc*ing for virginity!
Fighting for peace is like fuc*ing for virginity!
Ja und genau deshalb wäre es doch sinnvoll, in den Compiler eine Option einzubauen, die den Compiler einfach zweimal durchlaufen läßt. Dann liegt das im Ermessen des Programmierers. Wer dann unbedingt den extrem schnellen Kompiliervorgang braucht, kann programmieren wie bisher und kompilieren wie bisher. Bei kleineren Programmen, die nur 20 oder 30 Sekunden brauchen, bis sie kompiliert sind, könnte ich es mir allerdings dann aussuchen, daß der Compiler einfach nochmal 10 Sekunden länger braucht, weil er sich vorher über die Prozeduren informiert. Und ich hätte beim Programmieren meine Ruhe bzgl. dem Deklarierenstbi hat geschrieben:Damit der Compiler a) die Syntax checken kann und b) weiß, welche Variablentypen er in den erzeugten Code einbauen muss.ts-soft hat geschrieben:>> Warum gibt's also überhaupt die Sache mit dem Declare?
Damit der Compiler Speicherplatz reservieren kann.
Klar könnte der Compiler in einem ersten Lauf durch den Code gehen und schauen, was der Entwickler gemeint haben könnte. Aber das geht eben drastisch auf die Performance. Ok, Performance mag bei PB-Projekten im Hobbybereich egal sein. In einem professionellen Projekt kannst man sich das aber nicht leisten. Stell Dir vor, da wird an einem Programmodul eine Zeile geändert und das Modul neu kompiliert. Der Compiler müsste dafür aber vorsichtshalber ein paar hundert MB Quellcode parsen, um nach Funktionsdeklarationen zu suchen. Leider hat ein anderer Entwickler aber gerade eine Datei offen. Folge: der Compiler muss abbrechen, denn in der offenen Datei könnten ja gerade ein paar relevante Änderungen gemacht werden.
Das ganze dann noch als Compilerdirektive, dann wäre auch sichergestellt, daß das Programm sich immer in der richtigen Weise kompilieren läßt.
Also ich wollt ja jetzt mein Programm entsprechend umstellen, so daß ich es bequemer hab mit den Declares. Nur hab ich jetzt noch folgendes Problemchen: ich muß bei jeder EINZELNEN Source-Datei in die Projekteinstellungen und sagen, daß die Declares gespeichert werden soll. Ist das korrekt so? Bzw. warum erkennt der jaPBe nicht, daß die ganzen Sources zu einem gemeinsamen Projekt gehören? Schließlich sind ja alle in der gleichen Filelist.