Aktuelle Zeit: 03.04.2020 17:59

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: PreCompiler für OOP und Include-Libraries
BeitragVerfasst: 27.09.2017 21:32 
Offline

Registriert: 29.08.2004 13:18
Die bisherigen OOP-Lösungen hatten immer Nachteile. Beispielsweise konnte eine Methode völlig andere Parameter haben, als in Interface angegeben. Das kann zu ziemlich blöden Programmierfehlern führen, die man ewig sucht. Aus dieser Idee ist der PreCompiler entstanden, der mittlerweile "eskaliert" ist und ein paar Sachen mehr kann.

Was kann mein PreCompiler:
  • Unterstützung für OOP
  • Erstellung von Fake-Libraries
  • Bei der Erstellung von DLLs werden Import-Dateien erstellt
  • Erstellung eines PreProcess, der ohne PreCompiler weiterverarbeitet werden kann.
  • Original-Dateien werden nicht verändert
  • Fehlermeldungen werden von der IDE an der richtigen Stelle angezeigt
  • Läuft auf Mac und WIndows
Für eine Linux-Version fehlt mir eine Linux-Installation (und Geduld mich da auch einzuarbeiten). Prinzipiell ist der PreCompiler allerdings darauf vorbereitet. Es muss eigentlich nur an Anfang ein Block erstellt werden, der die Linux-Definitionen enthält.

Was sind Include-Libraries
Leider kann ich keine echten Libraries anbieten, das hier kommt am nächsten ran. Der prinzipielle Aufbau einer Include-Library entspricht einer DLL. Der PreCompiler erkennt automatisch in Quellcode, ob diese Library gebraucht wird und fügt automatisch hinzu.

Wie funktioniert OOP?
Ich geh davon aus, dass OOP prinzipiell bekannt ist. Eine Klasse wird so definiert:
Code:
Interface <Klassenname>  [extends <Parent>]
  <methode>
EndInterface
Structure s<Klassenname> [extends s<Parent>]
  <member>
EndStructure
DeclareClass(<Klassenname>[,<Parent[,AllowNull]])

DefineClass(<Klassenname>[,<Parent[,AllowNull]])
Procedure <Klassenname>_<Methode>(*Self.s<Klassenname> ...)
EndProcedure

DeclareClass ist optional. Wird bspw. benötigt, wenn man eine Klasse in einen Modul erstellen will. AllowNull kann #True oder #False sein. Damit wird erlaubt, Methoden nicht zu definieren. Ansonsten meckert der PreCompiler an, das Methoden fehlen. AllowNull wird nicht vererbt.

Neben den bekannten Methoden gibts eine Reihe von Spezialfällen:
Die Konstruktoren: Bei Erfolg muss ein #true zurückgeben werden.
Code:
_Constructor(*self)
_ConstructorEx(*self,*para)
<Klassenname>(*self)
<Klassenname>Ex(*self,*para)


Die Destruktoren:
Code:
_Destructor(*self)
De<Klassenname>(*self)


Der Copy-Constructor: Bei Erfolg muss ein #True zurückgegeben werden
Code:
_CopyConstructor(*self)


Die OOP-Funktionen des PreCompilers unterstützen ein Parameter für die Klassenerstellung.

Ein Object wird mit
Code:
<Klassenname>\new( [*para] )

erstellt. Entweder bekommt man das Objekt zurück oder #Null.

Freigeben geht mit
Code:
FreeObject( <Objekt> )


eine Kopie eines Objekts lässt sich mit
Code:
CopyObject( <Objekt> )

erstellt werden - falls unterstützt!

Weitere Funktionen
Code:
<Klassenname>\IsAccessable( <Objekt> )

Gibt #True zurück, wenn das Objekt mittels dieser Klasse angesprochen wird. Das Objekt muss nicht zwingend zur angegeben Klasse gehören!

Code:
<Klassenname>\IsClass( <Objekt> )

Gibt #True zurück, wenn das Objekt genau die angegebene Klasse entspricht.

Zusätzlich gibt es zwei Konstanten
Code:
#<Klassenname>_NameTable
#<Klassname>_ParaTable

Sie enthalten die Namen (getrennt durch ;) von jeder Methode der Klasse und die Parameter (ebenfalls mit ; getrennt).
Nicht benötigte Konstanten werden durch den PreCompiler entfernt, so dass diese eine fertige Exe nicht aufblähen.

Wie erstelle ich eine IncludeLibrary?
Prinzipiell schreibt man eine normale DLL mit ProcedureDLL etc. Der SourceCode für eine solche Library hat idealerweise eine Endung ".pbLib". Der PreCompiler zerlegt dann das ganze und speichert sie ab. Das muss für jede PureBasic-Version durchgeführt werden. Dabei gibt es folgende zusätzliche Befehle:
Code:
ResidentExport
...
EndResidentExport

Aus den Code-Segment zwischen den beiden Steuerwörtern wird eine .res - Datei für den Compiler erstellt. Es sind Macros, Structuren, Interfaces und Konstanten erlaubt. Alles andere führt zu einer Fehlermeldung. Durch die res - Datei wird das überall verfügbar, sogar in jeden Modul. Ist also mit Vorsicht zu genießen.

Code:
ExportClass( <Klassenname> )

Exportiert eine Klasse. Der Interface-EndInterface und Structure-EndStructure-Bereich wird in die Res-Datei gepackt. Eine exportierte Klasse kann als Parent nach Extends dienen. Wichtig: man muss eine "NEW"-Procedure schreiben, um ein Objekt erzeugen zu können!

WICHTIG!
In IncludeLibraries dürfen keine Module verwendet werden. Sie werden auch von PreCompiler entsprechend mit einer Fehlermeldung quittiert.
IncludeLibraries dürfen aber durchaus andere IncludeLibraries benutzen (inklusive deren exportieren Klassen). Wenn man eine Library ändert, sollte man alle davon abhängigen auch neu erstellen.

Was ist das automatische erstellen einer Importdatei bei DLL-Erstellung?
Wenn eine DLL erstellt wird, wird automatisch eine Datei mit einen Import-EndImport-Block erstellt. Der Name ist simpel <DLL-Name>.imp.pb.
Sie liegt da wo die .DLL,.LIB und .EXP (Windows) liegt.

Was muss man beachten
Durch die Art und Weise wie der PreCompiler arbeitet, darf in der ersten Zeile der Hauptdatei keine PreCompiler-Spezifischen Sachen oder IncludeLibraries benutzt werden. In der zweiten Zeile gibt es keine Probleme. Falls man das nicht beachtet, dann bekommt man einen Modul-Fehler.
IncludePath funktioniert mit relativen Angaben mehr in der Hauptdatei. Am besten vermeidet man diesen Befehl einfach komplett.
Der PreCompiler ist für 5.61 und höher geschrieben und geht davon aus, dass mit Unicode compiled wurde. Was anderes geht ja auch nicht.

Bei Libraries gibts die Einschränkung, dass sie nicht in einen Modul sein dürfen. Der PreCompiler verpackt sie dinger ja selbst in Module und Module in Module geht nicht.

Für beides wichtig: UNICODE ist Pflicht!

Wie richte ich den PreCompiler ein - Automatische Version
Einfach eine ausführbare Datei erstellen (ich empfehle einen leeren Ordner) und normal ausführen. Es sollte ein Quicksetup sich öffnen. Da auf Installieren klicken.

Wie richte ich den PreCompiler ein - Manuelle Version
Als erstes sollte man der IDE die Endung "pbLib" beibringen. Unter "File>Preferences..." in Bereich "Editor" "Code file extensions" die Endung "pbLib" hinzufügen.

Den SourceCode für den PreCompiler kompilieren und ihn in Tools-Menü eintragen. Es sind 4 Einträge nötig.
Eintrag 1:
Der erfüllt eine Doppelfunktion. Einmal wird hier der PreCompiler gestartet, wenn man Compile/Run ausführt. Zum anderen kann hiermit ein PreProcess erzeugt werden, wenn man ihn direkt aus den Menü aufruft. Es wird dann eine "<Dateiname>.PreProcess.pb" erstellt.
  • Commandline = <Precomiler.exe>
  • Arguments = "%FILE" "%COMPILEFILE" "%EXECUTABLE"
  • WorkingDirectory = <Verzeichnis wo die FakeLibraries gespeichert werden sollen>
  • Name = PreCompiler
  • Event to trigger the tool = Before Compile/Run
  • Wait until Tools end = Checked
Eintrag 2
  • Commandline = <Precomiler.exe>
  • Arguments = "%FILE" "%COMPILEFILE" "%EXECUTABLE"
  • WorkingDirectory = <Verzeichnis wo die FakeLibraries gespeichert werden sollen>
  • Name = PreCompiler Executable
  • Event to trigger the tool = Before Create Executable
  • Wait until Tools end = Checked
  • Hide Tool from Main Menu = Checked
Eintrag 3
  • Commandline = <Precomiler.exe>
  • Arguments = "%FILE" "%COMPILEFILE" "%EXECUTABLE" CreateLib
  • WorkingDirectory = <Verzeichnis wo die FakeLibraries gespeichert werden sollen>
  • Name = PreCompiler Create Lib
  • Event to trigger the tool = Menu or Shortcut
Eintrag 4
  • Commandline = <Precomiler.exe>
  • Arguments = "%FILE" "%COMPILEFILE" "%EXECUTABLE" DeleteLib
  • WorkingDirectory = <Verzeichnis wo die FakeLibraries gespeichert werden sollen>
  • Name = PreCompiler Create Lib
  • Event to trigger the tool = Menu or Shortcut

Der PreCompiler braucht für OOP unbedingt die libClass.pbLib. Den SourceCode unten einfach speichern und über den Menüeintrag in eine FakeLib umwandeln. Wenn die Source-Datei die Endung .pbLIB hat, reicht auch ein drücken auf F5 für Compile/Run.

Jetzt muss man nur in Compiler-Menü den Compiler neu starten.

Wichtig zu wissen: Der PreCompiler kann sowohl 32Bit als auch 64Bit sein. Er kann dann beides behandeln. Man muss als nicht für jeder Bit-Version eine eigene Exe erstellen werden. Genauso das Verzeichnis für die FakeLibraries kann für alle gleich sein. Die Namen werden anhand des Betriebsystems und der Compilerversion gewählt und überschneiden sich nicht.

Jetzt gehts weiter mit den Quelldateien.

_________________
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!


Zuletzt geändert von GPI am 15.10.2017 18:43, insgesamt 3-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PreCompiler für OOP und "Fakelibs"
BeitragVerfasst: 27.09.2017 21:33 
Offline

Registriert: 29.08.2004 13:18
Downloadlink: http://game.gpihome.eu/PureBasic/PreCompiler/

_________________
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!


Zuletzt geändert von GPI am 15.10.2017 18:43, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PreCompiler für OOP und "Fakelibs"
BeitragVerfasst: 27.09.2017 21:34 
Offline

Registriert: 29.08.2004 13:18
<reserviert>

_________________
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!


Zuletzt geändert von GPI am 15.10.2017 18:43, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PreCompiler für OOP und "Fakelibs"
BeitragVerfasst: 27.09.2017 21:36 
Offline

Registriert: 29.08.2004 13:18
<reserviert>

_________________
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!


Zuletzt geändert von GPI am 15.10.2017 18:44, insgesamt 3-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PreCompiler für OOP und "Fakelibs"
BeitragVerfasst: 27.09.2017 21:39 
Offline

Registriert: 29.08.2004 13:18
<reserviert>

_________________
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!


Zuletzt geändert von GPI am 15.10.2017 18:44, insgesamt 3-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PreCompiler für OOP und "Fakelibs"
BeitragVerfasst: 27.09.2017 21:45 
Offline

Registriert: 29.08.2004 13:18
<reserviert>

_________________
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!


Zuletzt geändert von GPI am 15.10.2017 18:44, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PreCompiler für OOP und "Fakelibs"
BeitragVerfasst: 28.09.2017 08:33 
Offline
Admin
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Danke für die vielen Beispielcodes. Sieht sehr interessant aus. :allright:

_________________
BildBildBildBild BildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PreCompiler für OOP und "Fakelibs"
BeitragVerfasst: 28.09.2017 12:45 
Offline

Registriert: 29.08.2004 13:18
RSBasic hat geschrieben:
Danke für die vielen Beispielcodes. Sieht sehr interessant aus. :allright:


Wenn du fragen hast, meld dich ruhig. Ich bin nicht so gut beim erklären...

Der Code ist leider nicht der sauberste, das Ding ist ziemlich wild gewachsen und 10x umgeschrieben worden (früher arbeitete er mit DLLs).

_________________
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PreCompiler für OOP und "Fakelibs"
BeitragVerfasst: 03.10.2017 16:28 
Offline

Registriert: 29.08.2004 13:18
So 1.1 ist draußen. Ich hab *alles* überarbeitet. Der Quellcode ist jetzt deutlich sauberer. Die Option "Datasection" wurde entfernt, da diese eh durch einen PB-Bug nicht optimal nutzbar ist und beim Mac in dylibs Probleme macht.
Die Dokumentation oben hab ich auch überarbeitet. Ich hatte bspw. die beiden Konstanten #<Klassenname>_NameTable und #<Klassname>_ParaTable vergessen. Braucht man vermutlich zu 99% nie, aber in den 1% der Fälle sind sie sehr wertvoll.
Die Libs werden jetzt auch in einen anderen Format gespeichert. Müssen also alle neu erstellt werden. Die Libs wurden auch alle überarbeitet.

Ich hoffe das ganze ist jetzt deutlich klarer.

_________________
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PreCompiler für OOP und Include-Libraries
BeitragVerfasst: 15.10.2017 18:47 
Offline

Registriert: 29.08.2004 13:18
So, ich hab die Dateien in eine handliche 7z gepackt:
http://game.gpihome.eu/PureBasic/PreCompiler/

;changelog
; 1.2
; - Installation-Script
; - Removed DataSection/EndDataSection
; - Declares of the methodes are now in DefineClass. DefineClass should be now before all methods.
; - Comments in Preprocess aren't removed anymore

Wenn wer schon IncludeLibraries erstellt hat, muss sie erneut durch den PreCompiler jagen. Das interne Format hat sich geändert.

Wenn wer in Linux arbeitet - mich würde es freuen, wenn es wer anpassen würde. Normalerweise in PreCompiler.pb an Anfang einen Block Linux hinzufügen. Zum größten Teil kann man wohl einfach den Mac-Bereich kopieren.

_________________
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye