kostenloser Webspace werbefrei: lima-city


JavaScript-Simulator

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    PHP und JavaScript? Was haben die schon gemeinsam?
    Mehr als man glaubt, beim Durchstöbern diverser Codeschnipsel ist mir in letzter Zeit öfter vorgekommen, dass ich den ein oder anderen JavaScript-Fetzen viel sinnvoller für eine Implementation in PHP gehalten hätte. JavaScript darf meiner Meinung nach keine essenziellen Funktionalitäten bieten, sondern einfach nur die Dynamik einer Internetseite verbessern. Da jetzt aber viele JavaScripte in ihrer Länge auswuchern, hatte ich einfach keine Lust mehr, sie von JS in PHP zu übersetzen.

    Daher nun meine Idee:
    Es muss doch möglich sein, bereits nach einer automatisierten Parserphase, welche aus der JavaScript-Datei eine interpretierbare PHP-Datei macht (siehe unten), diese so in PHP ausführen zu können. Das Simulieren eines Browserfensters soll dabei nicht abgedeckt sein, denn es ergibt keinen Sinn, solche Funktionen in PHP zu übersetzen. Hingegen die grundlegenden JavaScript-Objekte müssten alle in PHP implementiert werden, ich habe bereits die Mühe investiert, das JS-Array in PHP zu implementieren:
    class jsArray {
    	private $feld;
    	public function __construct() {
    		$this->$feld = func_get_args();
    	}
    	public static $constructor = 'jsArray::__construct';
    	public function __set($name, $wert) {
    		if ($name == 'length') {
    			$diff = $wert - count($this->$feld);
    			for ($n = 0; $n < $diff; $n++) array_push($this->$feld, null);
    			for ($n = 0; $n > $diff; $n--) array_pop($this->$feld);
    		}
    	}
    	public function __get($name) {
    		if ($name == 'length') return count($this->$feld);
    	}
    	public function concat() {
    		$neu = clone $this;
    		foreach (func_get_args() as $hinzu) $neu->$feld = array_merge($neu->$feld, $hinzu);
    		return $neu;
    	}
    	public function indexOf($item, $start=0) {
    		$sub = $this->$feld;
    		for($n = $start; $n > 0; $n--) $sub = array_shift($sub);
    		$index = array_search($item, $sub);
    		return $index !== false ? $index : -1;
    	}
    	public function join($separator=',') {
    		return implode($seperator, $this->$feld);
    	}
    	public function lastIndexOf($item, $start=0) {
    		$neu = clone $this;
    		$neu->$feld = array_reverse($neu->$feld);
    		return $neu->indexOf($item, $start);
    	}
    	public function pop() {
    		return array_pop($this->$feld);
    	}
    	public function push() {
    		foreach (func_get_args() as $hinzu) $anz = array_push($this->$feld, $hinzu);
    		return $anz;
    	}
    	public function reverse() {
    		array_reverse($this->$feld);
    		return $this;
    	}
    	public function shift() {
    		return array_shift($this->$feld);
    	}
    	public function slice($start, $end=null) {
    		$neu = clone $this;
    		$neu->$feld = array_slice($neu->$feld, $start, $end);
    		return $neu;
    	}
    	public function sort($sortfunction=null) {
    		if ($sortfunction === null) sort($this->$feld)
    		else usort($this->$feld, $sortfunction);
    		return $this;
    	}
    	public function splice($index, $howmany) {
    		return array_splice($this->$feld, $index, $howmany, array_slice(func_get_args(), 2));
    	}
    	public function toString() {
    		$this = implode(',', $this->$feld);
    		return $this;
    	}
    	public function unshift() {
    		$parameter = array_reverse(func_get_args());
    		foreach ($parameter as $hinzu) $anz = array_unshift($this->$feld, $hinzu);
    		return $anz;
    	}
    	public function valueOf() {
    		return $this->$feld;
    	}
    }
    Neben allen grundlegenden Objekten müssten auch alle grundlegenden Operatoren überladen werden. Hier einmal ein Beispiel, wie der Parser arbeiten müsste:
    // Vorher
    var a = b + 6 + 8.MAX_VALUE,
    // Nachher
    $a = new jsObject($b->typ, $b->valueOf() + 6 + (new jsNumber(8))->$MAX_VALUE);
    - Also alle var entfernen und vor alle Variablen ein $ einfügen.
    - Um jeden Werteblock muss die Umwandlung in jsObject erfolgen, der Einfachheit halber mit dem Typ des ersten Literals.
    - Bei Attributaufrufen müssen direkt angegebene Zahlen, Strings und Arrays zunächst in jsNumber, jsString, bzw. jsArray umgewandelt werden. Alle anderen (über ihren Bezeichner referenzierten) Objekte sind bereits in JavaScript-Form.

    Das Problem:
    Programmieren von JavaScript-Objekten und Parser dauert alleine viel zu lange.

    Deshalb:
    Findet ihr einen JavaScript-Simulator sinnvoll? Und wenn ja, wollt ihr mir dabei helfen? Das Resultat würde übrigens gemeinfrei, für jeden änder- und nutzbar.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    toolz schrieb:
    Findet ihr einen JavaScript-Simulator sinnvoll?
    Nein. Du schreibst ja sowieso keinen »Simulator« sondern einen Compiler, der JS-Code nach PHP übersetzen soll. Wofür soll das aber gut sein? Du wirst dir übrigens bei einigen JS-Konstrukten erst mal überlegen müssen wie du die überhaupt nach PHP übersetzen kannst, Stichwort Objekte und deren Handhabung.

    Wenn du schon JavaScript am Server verwenden willst, dann richtig, aber nicht irgendwie mit PHP versuchen JavaScript auszuführen…
  4. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Aber das ist ja gerade der Witz! Ein Algorithmus, dummerweise in JavaScript verfasst, soll nun serverseitig laufen. JavaScript gehört aber nicht auf oder zum Server, das ist allen bekannt. Wenn du sagst, ich solle es richtig machen, weiß ich leider nicht was du meinst? Die Funktionen gehören nun mal nicht vom Client ausgeführt.
    Zu den Objekten kann ich nur sagen, dass PHP die ja mittlerweile zum Glück auch unterstützt. Siehe hierzu auch mein jsArray. Vererbung, Kapselung und co. gibt es zwar auch, aber das ist für den Simulator (bestehend aus Parser + JS-Klassen) sogar nicht mal nötig. Ich habe vielleicht vergessen zu erwähnen, dass ich nur Funktionen übersetzen können möchte.

    PS: Compiler habe ich es übrigens deshalb nicht genannt, weil eine semantische Analyse nur überaus beschränkt nötig ist. Es reichen schon ein paar Ersetzungsregeln, da die Syntax beider Sprachen bereits sehr ähnlich ist.

    Oder gehen wir mal anders heran:
    Wie würdest du eine ewig (!) lange JavaScript-Funktion in PHP übersetzen, wenn du genau weißt, dass du erst nach Jahren fertig bist? Und wenn du weißt, dass diese Funktion eben nicht auf die Seite des Clienten gehört.
  5. g****e

    Hm, ich versteh den Sinn immer noch nicht. Ich baue ALLE meine Server mitlerweile mit Javascript. Wenn ich einen Algorithmus also in Javascript habe freue ich mich sogar darüber^^
    Abgesehen davon hat HackYourLife recht, es ist ein Compiler, kein Simulator. Und wie man eine Funktion übersetzt: Von Grund auf selbst schreiben oder andere Lib nehmen.

    Probleme dürfte es aber ab dann geben, wenn es mit Subsets beginnt, alla ASMJS, NodeJS, QML/QtQuick, usw usf. Wie sieht es mit denen aus? Hier müsste man die API ebenfalls erfassen und funktional abbilden. Und das ist schon jedesmal ein bisschen was anderes. Das wären übrigens auch Dinge, die du mit deinem Parser wohl nicht erreichen kannst. Ebenso wie DOM Zugriffe und Zugriffe auf Eventverarbeitung von einzelnen Objekten oder der EventLoop von Javascript, der größten Stärke des ganzen.

    Liebe Grüße
  6. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Ich sehe ein, bei Abhängigkeiten wird es schwierig.
    Du sprichst von serverseitigem JavaScript. Ich habe davon aber noch nie gehört. Wie richtet man denn so etwas ein (hier auf Lima)? Also das Skript muss nur auf dem Server laufen, dass ist meine einzige Anforderung. Deshalb versuche ich ja auch mein Bestes, das Skript umzuschreiben :wink:.

    Eine andere Bibliothek kann ich mir nicht suchen, einfach weil es so etwas nicht in PHP gibt... Das hätte ich schon längst gemacht!
  7. g****e

    Auf Lima wird das nicht laufen, NodeJS ist das Zauberwort http://nodejs.org/ https://de.wikipedia.org/wiki/NodeJS
    Das ist ein eigener Interpret für Javascript auf Basis von V8, erweitert um spezielle Module für einen Server an sich, für Filesystemzugriff, Streams, Prozesse, usw usf.

    Liebe Grüße
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!