PB Interpreter

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> Ich kann also WIN API anwenden auf dem Linux Server
Nein. Windows und Linux haben ihre eigenen APIs. Da oben meinte ich, du kannst auf einem Linux-Server auch Linux-APIs aufrufen.

> Ich könnte also auf einem Linux Server die Umgebungsvariablen vom Windows User rauskrigen
Du meinst, mein Linux-Server könnte die Windows-Umgebungsvairablen deines Computers herausbekommen, wenn du auf meine Seite gehst? Nein, das geht natürlich nicht. Die Sache mit Umgebungsvariablen funktioniert nur innerhalb eines Computersystems.
Dein PB-Programm auf dem Webserver kann also nur die Umgebungsvariablen bekommen, die es auf dem Linux-Server gibt. Schau dir mal meine Umgebungsvariablen an:
http://and51.de/cgi-bin/test/index.cgi

> Ich kann also ... In die Website einbauen und es würde mir meinen Namen anzeigen ?
Nein. Entschuldige, wenn ich dir da falsche Hoffnungen gemacht habe. Die Variable USERNAME, die es auf deinem PC gibt, kann der Server natürlich nicht aufrufen. Das wäre ja ein Sicherheitsrisiko, wenn jeder Webseitenbertreiber meine Umgebungsvariablen kennen würde.

> Das mit Cache hab ich dann wohl falsch verstanden.
Vermutlich ja. Und zwar benutzt der PB Interpreter einen Cache: In diesen Zwischenspeicher werden alle Executables gespeichert, die kompiliert wurden. Bevor ein Programm kompiliert wird, schaut der Interpreter zuerst im Cache nach, ob das Programm schon im kompilierter Form vorliegt, wenn ja, braucht natürlich kein zweites Mal kompiliert werden. Es wird nur dann erneut kompiliert, wenn sich der Sourcecode des Programms geändert hat, also wenn der Sourcecode neuer ist, als das Executable im Cache.

Und als Cache benutzt der Interpreter den Temp-Ordner, den man ja mit GetTemporaryDirectory() ermitteln kann. Deshalb ist es auch überhaupt nicht schlimm, wenn man den Temp-Ordner einfach leert, dann kompiliert der Interpreter jeden Sourcecode beim nächsten Mal einfach neu.

> Ich würde mich ja über ein richtiges Beispiel freuen für GET und Post freuen
Klar, gern. Vorab: POST habe ich mit meinem Programm bisher noch nicht ganz getestet, nur einmal ganz kurz. Da hat es auch geklappt. Deshalb liefere ich dir erst einmal dein GET-Beispiel.

Ich nehme deinen Code und schreibe ihn nach PureBasic um:

Code: Alles auswählen

#!/pb/interpreter -w
OpenConsole()
PrintN("Content-Type: text/html"+#LF$)

seite$=GetEnvironmentVariable("QUERY_STRING")
seite$=StringField(seite$, 2, "=")

If seite$ = "index"
	Print("Indexseite")
EndIf

If seite$ = "start"
	Print("Startseite")
EndIf
Erklärung: Die ersten 3 Zeilen müssen so da stehen, um den Interpreter korrekt ans laufen zu kriegen.
Der Rest ist dein PHP, wa sich nach PB konvertiert habe. Ich habe die QUERY_STRING-Variable genommen, und dann mit StringField() den Teil nach dem Gleichheitszeichen rausgeschnitten. Es gibt sicherlich elegantere Wege, das zu erreichen. Ich könnte dir das auch in einem Einzeiler machen, aber so ist es erst mal verständlicher.
Die beiden If-Abfragen dürftest du ja leicht wieder erkennen.


Bitte teste dein Beispiel einmal selbst, ich habe den eben gezeigten Code hochgeladen:
http://and51.de/cgi-bin/test/x360andy.pb?seite=start
http://and51.de/cgi-bin/test/x360andy.pb?seite=index
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

@X360 Andy: Es gibt da einen wesentlichen Unterschied bei sowas, der PureBasic Interpreter ist auch wie PHP rein Serverseitig, d.h. der Client der ein HTML Dokument vom Server anfordert kriegt nur etwas vom HTML Dokument mit. Das berührt den Benutzer gar nicht erst, was womit wie eine HTML Seite zusammenbaut.
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Hallo,

Ich habe nun Version 1.1 veröffentlicht.
Kann hier heruntergeladen werden: http://www.and51.de/pbinterpreter.zip

Der Sourcecode steht zusammen mit dem Changelog im englischen Forum zur Ansicht bereit:
http://www.purebasic.fr/english/viewtopic.php?t=37397

// Edit:
Hab den Sourcecode 1.1 nun auch auf die erste Seite dieses Threads gesetzt.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Wäre das ganze eigntlich auch auf Localhost möglich ?

VM - Xampp ?
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Selbstverständlich.

Um den Interpreter auf deinem Computer laufen zu lassen, installierst du einfach Xampp. Darin enthalten ist Apache. Apache für Windows zu konfigurieren funktioniert genauso wie für Linux:
Von Hause aus müssten glaube ich *.cgi-Dateien funktionieren. Willst du aber auch Dateien mit der Endung *.pb ausführbar machen, musst du diese Zeile deiner httpd.conf (Apaches Konfigurationsdatei) hinzufügen:

Code: Alles auswählen

AddHandler cgi-script .cgi .pb
Eventuell findest du diese Zeile schon in der *.conf-Datei, in dem Fall einfach ".pb" dranhängen.

Nun nimmst du den Sourcecode vom PB Interpreter und kompilierst ihn auf Windows. Du musst einige kleinere Änderungen vornehmen: Benutzte Pfadangaben anpassen und die Parameter für den Kompileraufruf ändern. Der Parameter QUIET lautet auf Linux "--quiet", auf Windows hingegen "/quiet".

Die Interpreter-EXE steckst du nun in ein PureBasic-Verzeichnis. Kannst deine vorhandene Installation, aber auch eine neue Installation nehmen. auf jeden Fall musst du dir den Pfad merken. Denn der gehört in die Shebang-Zeile der PB-Skripte. Auf Linux schreibe ich immer

Code: Alles auswählen

#!/pb/interpreter
Auf Windows müsste ich schreiben

Code: Alles auswählen

#!S:\PureBasic430\interpreter.exe
Aus dem Kopf heraus müsste dies alles sein, was du beachten musst. Wenn etwas unklar ist, einfach fragen. Generell sollte das aber kein Problem sein, da nur Apache benötigt wird. Klappt's mit Apache, klappt's auch mit dem Vorhaben.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Naja ich meinte jetzt eigentlich nur ob ich das auch über VM und dann über Xampp ausführen kann, mehr wollte ich gar nicht wissen :lol:
So kann ich das ganze schon mal "Offline" testen auf Debian ...

Mit dem ganzen anderen Text hast du mir jetzt eigentlich nur noch mehr Angst gemacht das ganze zu "installieren" :roll:
Naja muss mich bald dazu durchringen :)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Oh... Äh... Öhm... Ja dann... :lol: :oops:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Beitrag von Blackskyliner »

Um auf die Sache mit dem HTML zurück zu kommen... Warum nicht eigentlich einfach einen kleinen Parser basteln? Um Code und Design trennen zu können, was bei Webprojekten größeren ausmaßes sehr wichtig ist. Ich würe mir das so vorstellen, das man im Programm alle seine Wichtigen Variablen in einem Array oder einer StructureList implementiert, dieses dann durchgeht und diverse Platzhalter anhand von RegEx oder StringReplace ersetzt... Wäre wie gesagt in größeren Projekten sinnvoller,auch wenn da ein bisschen Leistung verloren geht. Bei interesse biete ich mich gerne an ein solches System zu schreiben =)

Das wäre dann alla

Code: Alles auswählen

AddElement(MeineListe)
MeineListe\Platzhalter.s = "variable1"
MeineListe\Ersetzung.s = "Dies ist eine Template Variable"
[...]
ParseHTML("index.tpl", MeineListe)
und das Template wäre dann (Platzhalter könnten ja dann auch anders aussehen, einstellbar oder so...)

Code: Alles auswählen

<html>
<head>
   <title>Test Template</title>
</head>


<body>
    {variable1}
</body>

</html>

Des weiteren könnte man dann noch um komplexere Dinge zuzulassen diverse verschiedene Parser einbauen die dann Funktionen ausführen, die zuvor regestriert wurden

z.B.

Code: Alles auswählen

Procedure testFunc()
   ; Hier jetzt Print() oder ein ParseTemplate oder eine Verarbeitung, was weiß ich ^.^
EndProcedure

RegisterTemplateFunction("zeigeMenue",@testFunc()) 
;weiß grade nicht genau den Syntax ne Funktion zu übergeben müsste aber so gewesen sein 

und dann im Template

Code: Alles auswählen

<html>
<head>
   <title>Test Template</title>
</head>


<body>
    {f:zeigeMenue}
</body>

</html>
solche Dinge halt...



Wenn man ein Buchstabe fehlt in einem Wort, liegts an meiner Tastatur, sorry :(

Ansonsten sag was ihr von dieser Idee haltet, wenn es viele gibt die sowas gerne sehen würden und für sinnvoll halten, dann würde ich das Projekt anfangen, als Erweiterung, bzw. eigenständiger Part... Als DLL oder auch nicht, wie ihr wollt. Erstmal abwarten ob es eine gewisse Resonanz findet ;)


MFG
Blackskyliner
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Die Idee ist zwar gut, aber es mangelt an der Umsetzung.

Den PB Interpreter in einen Parser zu verwandeln würde PureBasic zu einer 'gewöhnlichen' Skriptsprache machen, das heißt, leistungsmäßig läge PB dann mit PHP oder Perl gleichauf (vielleicht sogar etwas darunter).
Parsen bedeutet, bei jedem Request, die Dateien neu auszulesen und zu evaluieren.

Außerdem gibt es das von dir beschriebene Prinzip bereits, das habe ich hier im Thread auch schon erwähnt: SSI (Server Side Includes).
Dein HTML-Template würde so aussehen:

Code: Alles auswählen

<html>
<head>
   <title>Test Template</title>
</head>

<body>
   <!--#exec cgi="myProgram.pb">
</body>

</html>
Als *.shtml-Datei abgespeichert und aufgerufen, bewirkt dies, dass der gesamte Output des Programms "myProgram.pb", an der entsprechenden Stelle (hier: im Body) eingefügt wird. Sogar Shellbefehle können so ausgeführt werden. Es ist auch kein Problem, mehere PB-Programme in einer SHTML-Datei aufzurufen, denn wenn diese bereits durch den PB Interpreter kompiliert wurden, gibt es keine Performanceverluste. Als ich das festgestellt habe, habe ich den Entschluss gefasst, die Webseite für einen Kunden nun neu mit SSI/SHTML aufzubauen.


Zurück zu deinem Projekt:
Sei dir im klaren darüber, dass es das quasi schon gibt, aber dennoch kann ich dich nur dazu ermutigen, deinen eigenen PB-Parser zu schreiben. Im Grunde habe ich das Rad ja auch neu Erfunden, denn ich hätte ja auch bei Perl oder PHP bleiben können. Nun denn. Soll dein Parser dann auch in Zusammenhang mit meinem PB-Interpreter arbeiten? Schreib mir doch mal bitte deine Programmkette auf, wie du sie dir vorstellst.
Bei meinem PB Interpreter sieht die Kette so aus:

Code: Alles auswählen

Apache
   -> PB Interpreter
      -> Kompiler
      -> Ausführung des Programms
   <- <- Rückgabe des Outputs an Apache
Soll da dein Parser mit rein oder überlegst du dir eine komplett neue Kette?


Naja, so lernst du nebenbei übrigens auch noch was über HTTP-Webserver, schaden kann dein Projekt also nicht. Ich könnte dir ja auch helfen, effiziente Parsing-Techniken zu entwickeln.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Beitrag von Blackskyliner »

Um darau zu kommen, dass man ja jedes mal neu Compillieren müsste... theoretisch ist es ja möglich nur beim allerersten Aufruf das in PB mit den ganzen Print() umzuparsen das dann zu kompillieren und das wiederum dann aufrufen und an den User senden... damit wäre die Geschwindigkeitseinbuße ja auch nur beim ersten Aufruf... Weiste wie ich meine? Es soll ja nur in der Entwicklung helfen das besser trennen zu können, den User interessiert eh nicht wie das zustande kommt was er sieht =).

Ich werd die Tage mal bisschen was basteln, aber eher als "Erweiterung" an dein System, da ich auch nicht soviel Zeit habe, aufgrund anderer Projekte, mich in Apache und dessen Verarbeitung etc. Einzulesen :D


EDIT:
Hier noch die Kette

Code: Alles auswählen

Apache
   -> PB Interpreter 
       -> parsen aller DesignCodes
       -> kompillieren der gesamten Page
       -> ausführen der Page
   <-- Rückgabe des Kompillats
MFG
Blackskyliner
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Antworten