PB Interpreter

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

AND51 hat geschrieben:Solltest du einen noch besseren Server dein eigen nennen, dürfte sogar das funktionieren.
XServer
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ja hab sowas auch auf meiner virtuellen Maschine. Heißt "FVWM".
Trotzdem geht es damit nicht, denn das Teil wird nur aktiv, wenn ich mich per VNC daran einlogge.
Aus Sicht des Interpreters existiert (wenn ich das richtig verstehe) keine GUI, weil es von Apache über die Konsole aufgerufen wird.
Naja, wie dem auch sei, man kann ja die Rückgabewerte, z. B. von OpenWindow() prüfen, ob's geklappt hat.
Aber danke für deinen Link, werd ihn mir mal noch genauer angucken.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

AND51 hat geschrieben:Ja hab sowas auch auf meiner virtuellen Maschine. Heißt "FVWM".
Euh.. das kommt in meine Signatur.

FVWM -> WM steht für WindowManager. Das braucht schon einen XServer um zu funktionieren.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

FVWM heißt "... Virtual Window Manager", aber dass XServer sein Untersatz ist, wusste ich bisher nicht. :|
Wieder was gelernt.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Hallo zusammen,

Ich arbeite schon seit fast einem Monat an meinem PB Interpreter und ich habe es geschafft: Er ist fertig (im Sinne von serienreif)! :D

An dieser Stelle möchte ich noch einmal allen danken, die mir bei allem geholfen haben, was auch nur im geringsten mit Linux/Unix, Server, PB Linux, HTTP, Apache, etc. zu tun hat. :allright:
Ich habe mich durch zig Dokumentationen gekämpft, nächtelang Trial & Error durchgeführt (habe inklusiv heute bestimmt über 5 Nächte durchgemacht), einen Bug in ProgramRunning() aufgedeckt, und bin überhaupt schon recht 'geübt' im Umgang mit Linux.


Die Zeit ist gekommen, mich hiermit an euch zu richten, um zu fragen, ob noch jemand daran interessiert ist, PureBasic als Ersatz für andere (Skript-)Sprachen für seine Webseite einzusetzen.

Sollten sich wenigstens ein paar dafür interessieren, werde ich meinen gut kommentierten und anwenderfreundlichen Code veröffentlichen, damit ihr auch davon profitieren könnt; so wie ich von eurer Hilfe profitiert habe. Vielleicht mache ich mir die Mühe und schreibe sogar eine Anleitung, wie man PureBasic denn nun richtig auf seinen Webspace bugsiert und einsetzt. Das aber natürlich nur, wenn genügend Interessenten vorhanden sind.

Ich stelle euch meinen PB Interpreter mit seinen bisherigen Features kurz vor:
(nachfolgend wird ein 'interpretierter' PB-Programmcode "Skript" genannt)
  • Schreiben deiner Webseite in bewährter PureBasic-Syntax-Manier: Gästebücher, Upload/Download-Services, Counter, Browsergames, uvm. in PureBasic statt mit PHP oder Perl
  • Übergabe eigener und vordefinierter ProgramParameter() und Umgebungsvariablen an das Skript
  • Das Skript kann auch in den Error-Log des Webservers schreiben
  • Kompilation erfolgt standardmäßig nur, wenn das Skript sich seit der letzten Kompilation geändert hat (wichtigster Punkt, mehr dazu unten)
  • Mit dem Parameter -f (force) kann jedes Mal eine Neukompilation veranlasst werden
  • Mit -w (warn) werden Syntax- und Compiler-Fehler, sowie Fehler während des Interpretationsvorgangs zusätzlich im Browser ausgegen (und nicht wie üblich nur im Errorlog des Webservers) und sind somit einfacher zu verfolgen
  • Mit -c (compress) wird das Skript (also das Executable) mit UPX komprimiert, sodass es weniger Speicherplatz beansprucht
  • Der Interpreter stellt dem Skript folgende Infos zur Verfügung (erweiterbar): Aktuelle Zeit, Dauer der Generierung in Millisekunden, alle Umgebungsvariablen des Webservers (REMOTE_ADDR, QUERY_STRING, etc.), POST-Uploads (Dateien und Formulare, die per POST übertragen werden)
  • Der Interpreter setzt CurrentDirectory auf dasselbe Verzeichnis, in dem auch die .pb Datei liegt. Will man dann z. B. einen Counter mit OpenFile() bearbeiten, landet diese Textdatei im gleichen Verzeichnis wie die .pb Datei (das ist der zweite grundlegende Gedanke, warum ich diesen Interpreter schrieb)
  • Der Interpreter räumt seine 2 Temp-Dateien (exe und source-Code) auf und konfiguriert sich selbst: Es ist nicht notwendig, wie in der Linux-Install-Datei beschrieben, die Umgebungsvariablen PUREBASIC_HOME und PATH zu erstellen. Das macht er vor jeder Kompilation mit SetEnvironmentVariable() selbst, und er nimmt dank ProgramFilename() auch immer den richtigen Pfad
  • Keine externen Dateien, wie DLLs oder INIs nötig
  • Dürfte höchstwahrscheinlich breits mit der Demo-Version von PureBasic funktionieren
  • Der Sinn dieses Interpreters ist es, euch das Gefühl zu geben, eure Webseite bestünde nur aus .pb-Dateien. Er nimmt euch die ganze Arbeit mit dem Kompilieren und die Interaktion mit Apache ab. Vergesst das Rumgefrickel wie das hier oder das hier (@ verlinkte Threads: nicht böse gemeint!)
  • Mit kleinen Eingriffen in die Konfigurationsdatei von Apache kann man auch die Endung .pb für PB-Dateien benutzen; .cgi funktioniert standardmäßig schon
Warum sollte ich PureBasic verwenden?
  • Ganz einfach: Weil Hochsprachen wie PureBasic schneller als PHP, Perl oder sonstige Interpreter-Sprachen sind.

    Ein PHP-Skript liegt im Klartext vor und bis es fertig ist, muss der Interpreter jedes Mal die Syntax prüfen, Includes einbinden und kann dann erst das Skript ausführen. Bei PureBasic ist der entscheidende Vorteil: Durch die einmalige Komplation muss die Syntax nur einmal geprüft werden. Auch Includes werden nur einmal eingebunden. Ab dann hat man ein sogenanntes Executable (ausführbare Datei wie die *.exe unter Windows). Sollte ab jetzt jemand die Webseite aufrufen muss der Quellcode nicht erneut geprüft und vorbereitet werden, sondern das Executable wird sofort ausgeführt. Das Executable muss nur dann neu erstellt werden, wenn sich der Sourcecode seit der letzten Kompilation geändert hat. Dies dauert dann auch einmalig ein paar hundertstel Sekunden mehr als bei normalen Interpretern. Ein Nachteil ist, dass das Executable aufbewahrt werden muss. Es belegt also zusätzlich zum Quellcode Speicher. Daher habe ich die Parameter -c (Kompression mit UPX) und -f (erzwungene Neukompilation) eingebaut. -f erzwingt bei jedem Aufruf eine erneute Kompilation, löscht dafür aber auch das Executable nach der Ausführung wieder. Die Option -f eignet sich also auch für die, die es mit der Performance nicht ganz so genau nehmen und denen es einfach nur darauf ankommt, PureBasic nutzen zu können.
Gut gut, aber wie lange dauert denn so eine einmalige Kompilation?
  • Auf meinem Server dauert dieser Vorgang für eine gewöhnliche HTML-Seite zwischen 150 und 280 Millisekunden (aber ich hab ja auch noch andere große Dinge darauf laufen).

    Dies aber nur einmalig! Alle weiteren Aufrufe dauern 0 Millisekunden, weil der Interpreter ab dann immer nur das bereits fertige Executable aufrufen muss.

    Möchte man das Executable zusätzlich komprimieren (die Option -c), dann dauert die gleiche HTML-Seite mit zustätzlich noch InitNetwork() eingebunden zwischen 350 und 500 Millisekunden. Man muss aber dazu sagen, dass ich bisher nur die Standardeinstellungen von UPX nehme und keinen Wert auf schnelle Kompression lege (da im Regelfall ja nur ein einziges Mal komprimiert werden muss).

    Fazit: Angesichts der Tatsache, dass nur einmal und dann nie wieder kompiliert werden muss (es sei denn, der Sourcecode ändert sich), halte ich diese 280 Millisekunden für vertretbar, auch für häufiger frequentierte Seiten. Ich will mit diesem Projekt ja keinesfalls PHP oder Perl den Rang ablaufen, es wird immer ein kleines Nischenprodukt bleiben, ganz klar.
Noch was?
  • Wie oben schon erwähnt, veröffentliche ich meinen PB Interpreter nur, wenn genügend Interesse da ist. Ich habe aus meiner Sicht als Linux-Neuling sehr viel Arbeit reingesteckt und mir genügend Nächte um die Ohren gehauen. Ich möchte nicht, dass mein Werk mit Füßen getreten wird, bin dennoch für ernsthafte Kritik und Ideen dankbar. Der Aufwand der Veröffentlichung, der auch das Bieten von Hilfestellungen beim Hochladen, Einrichten und Integrieren von PureBasic in den Server mit einschließt, soll sich auch rentieren, wenn ich schon kein Geld dafür kriege.

    Was ich so gut wie noch nicht getestet habe, ist die POST-Funktion, also das Durchreichen von POST-Formularen an das Executable. Einmal habe ich es ganz kurz mit einem "Hallo Welt" erfolgreich getestet, das war's aber. Dies muss noch berücksichtigt werden.

    Dann wäre noch die Sache mit ProgramRunning(). Wie oben verlinkt, gibt dieser Befehl unter Linux fälschlicherweise immer 1 zurück, auch wenn das Programm nicht mehr läuft. Habe aber glücklicherweise einen einfachen Workaround gefunden (ist im Code ersichtlich).

    Ach ja und ich habe beschlossen, den Namen PB Interpreter beizubehalten, auch wenn es im eigentlichen Sinne kein Interpreter ist. Einfach, weil mir die Idee gefällt und weil sonst Mehraufwand entsteht, wenn man z. B. die PB_Interpreter_* Umgebungsvariablen auch noch ändern müsste.

    Zu guter letzt sei noch einmal euer Nutzen erwähnt: Ihr dürft im Falle der Veröffentlichung den PB Interpreter frei nutzen, verändern, wie auch immer. Kenne mich da nicht aus mit GNU und GPL und sowas, aber es sollte selbstverständlich sein, den Code nicht weiterzuverkaufen, et cetera bla bla.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag von DrShrek »

AND51 hat geschrieben:Noch was?
  • Wie oben schon erwähnt, veröffentliche ich meinen PB Interpreter nur, wenn genügend Interesse da ist.
@AND51,
Wie willst Du sicher feststellen das genugen Interesse besteht?

Mein Vorschlag:
Du solltest es veröffentlichen unabhängig von der Menge der Interessebekundungen.
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Beitrag von Kukulkan »

Hi AND51,

Erstmal grossen Respekt vor deiner Arbeit. Das klingt wirklich sehr gut. Ich habe einige Projekte die stark PHP Lastig sind und die Idee dafür PB zu nehmen gefällt mir ausgesprochen gut. Vor allem liefere ich dann an den Kunden einige Executables und nicht den Source, richtig? Wenn nicht, wie kann man das realisieren?

Ich bin die nächsten Wochen leider Zeitlich stark limitiert und werde das nicht ausführlich testen können. Aber eine Frage beschäftigt mich schon sehr:

Wie ist das mit inline-html?

In PHP sieht man Oft solche Konstrukte:

Code: Alles auswählen

...
<div class="someframe">
  <p class="Header">
    <?php echo $Header; // output the header ?>
  </p>
  <p class="TextStandard">
    <?php echo $Caption; // output the caption ?>
  </p>
</div>
...
Wie ist das nun mit deinem Teil? So?

Code: Alles auswählen

...
<div class="someframe">
  <p class="Header">
    <?pb PrintN(Header.s); output the header ?>
  </p>
  <p class="TextStandard">
    <?pb PrintN(Caption.s); output the caption ?>
  </p>
</div>
...
Korrekt?

Volker
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> Wie willst Du sicher feststellen das genugen Interesse besteht?
Indem ich hier frage. Jeder ist herzlich eingeladen, so wie volker Schmid sein Interesse zu bekunden.

> Du solltest es veröffentlichen unabhängig von der Menge der Interessebekundungen
Hatte ich zuerst auch gedacht, aber wie gesagt, da es eben (für mich) harte Arbeit war, möchte ich auch sichergehen, dass es sich lohnt. Außerdem habe ich ja die Version 1.0 schon in diesem Thread veröffentlicht. Diese sieht im Gegensatz zu meiner jetzigen Version 1.1 zwar aus, wie ein Demoprodukt, aber sie verrichtet ihren Dienst ordnungsgemäß. Die kann man unter Linux kompilieren und dann zum Testen auf seinem eigenem Server benutzen. Dann wird man ja wissen, ob man "Appetit auf mehr" hat.

> Vor allem liefere ich dann an den Kunden einige Executables und nicht den Source, richtig?
Nein.
Du lieferst nur den Source. Um eine Browseranfrage nach einer .pb-Datei zu erfüllen, wird bei jeder Anfrage die .pb-Datei on the fly kompiliert. Dein Source fungiert deshalb als eine Art Skript, weil mein PB Interpreter dein Programm mit ReadProgramData() ausliest. Dafür muss deine .pb-Datei allerdings eine Konsole mit OpenConsole() öffnen und darauf seine Ausgabe schreiben. Diese Konsole ist das gleiche wie in PHP der Kanal 'stdout'. In PHP benutzt du einfach print oder echo, in PureBasic benutzt du halt Print(), PrintN() oder WriteConsoleData().

Es gibt keinen anderen Weg, den stdout-Kanal deines Sources (welches ja zur Laufzeit bei jedem Aufruf kompiliert wird) abzufangen und an Apache weiterzuleiten. Aber hinter genau dieser Idee steht ja CGI (Common Gateway Interface). CGI ist die Schnittstelle zwischen Apache und Dritthersteller-Programmen. Über CGI können fremde Programme und Sprachen dynamische Inhalte generieren, die an Apache weitergegeben werden. Auch PHP und Perl nutzen CGI, um den dynamisch generierten Content an Apache weiterzuleiten, genau so wie mein PB Interpreter.

Genau so, wie bei jeder Apache-Distribution ein PHP- und Perl-Interpreter gehört, genauso muss auch PureBasic nachträglich zu jedem Apache/zu jedem Webspace hinzuinstalliert werden, damit der Kompiler von PB als Interpreter 'missbraucht' werden kann. Das hört sich komplizierter an, als es ist: Es genügt, die PB-Installation zu entpacken, 'wie sie ist' auf den Server hochzuladen und den PB Interpreter (welcher eine Standalone-EXE ist) in das PB-Verzeichnis zu packen. Der Interpreter kümmert sich schon selbst um den richten Aufruf des Kompilers, das löschen des Executables hinterher, usw. Wie schon oft erwähnt, nutzt die neue Version 1.1 die Strategie, das Executable nach Ausführung zu behalten, damit man nicht immer neu kompilieren muss (was die größe Performance-Schwachstelle von Version 1.0 ist; zum Testen reicht 1.0 aber dennoch).

Der Eigentliche Installationsaufwand liegt eher darin, dem PB-Verzeichnis und dem Interpreter die nötigen CHMOD-Rechte zu geben, denn bei mir ist es so, dass mein Webspace nicht von Haus aus das Recht hatte, auf das hochgeladene PB-Verzeichnis zuzugreifen. Mittlerweile weiß ich warum (mod_suexec von Apache). Außerdem musste ich auf meinem Server für Linux noch einige Libs installieren, auf die PB zugreift. Da hatte ich meine erste Schützenhilfe, wovon ich euch natürlich auch profitieren lasse.

> Wie ist das mit inline-html?
Nein, so nicht. Eine HTML-Seite wird komplett in PureBasic-Syntax geschrieben. Alle Ausgaben werden in eine geöffnete Konsole geschrieben. Diese Datei sieht aus, wie jedes andere Programm, dass du in deine PB IDE schreibst.

Eine Hallo-Welt-Seite sähe so aus:

Code: Alles auswählen

#!/pb/interpreter -w

OpenConsole()
PrintN("Content-Type: text/html")
PrintN("")

Print("<html>")
Print("<head>")
Print("<title>Meine PureBasic-Seite</title>")
Print("</head>")
Print("<body>")
Print("<h1>Hallo Welt!</h1>")

For n=1 To 5
	Print("<br>") ; ein paar Zeilenumbrüche
Next

Print("Ich wurde mit PureBasic erstellt.")
Print("</body>")
Print("</html>")
Dies wird, so wie es hier steht, als .pb-Datei gespeichert. Ruft jemand diese Seite auf, so sieht er genau das gleiche, wie du, wenn du diesen Code manuell in deine PB IDE kopierst und ausführst (in dem Fall geht die Konsole automatisch wieder zu, um etwas zu sehen stelle ein Input() ans Ende des Codes, wenn du es manuell in der IDE testest).


Alles bis auf die erste Zeile ist reine PB-Syntax. Die erste Zeile ist allerdings für Apache reserviert, denn dort steht ja der Pfad zum PB-Interpreter. Damit diese Zeile keinen Syntax-Error beim Kompilieren erzeugt, ist es die Aufgabe meines Interpreters, diese Zeile vor dem Kompilieren zu entfernen. Deswegen kopiert der PB Interpreter jede .pb-Datei intern noch einmal und kompiliert dann diese Kopie. Diese Kopie wird, wie schon erwähnt, automatisch wieder gelöscht.

Sie dir vielleicht auch mal meine Startseite an: www.and51.de
Vergleiche den Quelltext mit dem eigentlichen PB-Code, der hinter dieser Seite steckt:

Code: Alles auswählen

#!/pb/interpreter -w

OpenConsole()
PrintN("Content-Type: text/html")
PrintN("")
Print("<tt><center>AND51")
For n=1 To 10
	Print("<br>")
Next
Print("<small>generated by PureBasic in "+GetEnvironmentVariable("PB_Interpreter_CreationTime")+" ms</small></center>")


Noch ein kleiner Hinweis: Die Vollversion von PB darfst du nur auf Server kopieren, die dir auch gehören (Lizenz). Nur du darfst diese PB Distribution benutzen.
Möchtest einen Kunden beglücken, dessen Server dir nicht gehört, darfst du laut Lizenz die Vollversion dort nicht installieren. Allerdings ist die Demoversion frei für jeden, also kannst du auch die Demoversion benutzen.
Das ist jedenfalls mein persönliches Verständnis der PB Lizenz. Bei Risiken und Nebenwirkungen fragen Sie freak oder lesen Sie die Anwenderlizenz. :)
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 »

Aber bei aufwändigeren Dokumenten wird es mühselig die Anführungszeichen immer durch

Code: Alles auswählen

" + Chr(34) + "
zu ersetzen. Müsste man auch escapen können...
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag von TomS »

Vermilion hat geschrieben:Aber bei aufwändigeren Dokumenten wird es mühselig die Anführungszeichen immer durch

Code: Alles auswählen

" + Chr(34) + "
zu ersetzen. Müsste man auch escapen können...
Dann isses aber kein PB mehr ;)
Antworten