2013-07-12 10 views
15

Ich habe kürzlich von der Kompilierung von C++ - Code zu Javascript mit emscripten gehört und wie, wenn asmjs Optimierungen durchgeführt werden, hat es das Potenzial, Anwendungen wirklich schnell zu laufen.Ganze Web-App in C++ mit DOM-Interaktion

Ich habe mehrere Post gelesen, Tutorial und hörte sogar einige sehr interessante youtube videos. Ich habe auch das Beispiel Hallo Welt erfolgreich ausgeführt.

Allerdings kenne ich nicht die vollen Möglichkeiten dieses Ansatzes, speziell wenn eine ganze neue Webapp in C++ als Ganzes geschrieben werden kann/sollte, ohne Leimcode.

Konkreter würde ich gerne etwas ähnlich dem folgenden C++ schreiben (als Referenz funktioniert nicht Code).

#include <window> 
class ApplicationLogic : public DOMListener{ 
private: 
    int num; 
public: 
    ApplicationLogic():num(0); 
    virtual void onClickEvent(DOMEventData event){ 
     num++; 
    } 
    virtual ~ApplicationLogic(){} 
} 

int main(){ 
    DOMElement but = Window.getElementById("foo"); 
    ApplicationLogic app(); 
    but.setOnclick(app); 
} 

Ich hoffe, dass es klar, die Idee macht, aber das Ziel ist etwas ähnliches zu erreichen:

  • eine statische Funktion, die den Modul Lauf initialisiert, wenn das Fenster bereit ist (die gleiche Verhalten, das gibt jquery.ready()). So können Listener zu DOM-Elementen hinzugefügt werden.

  • Ein Weg zur Interaktion mit dem DOM direkt aus C/C++, daher die #include <window>, im Grunde Zugriff auf das DOM und andere Elemente wie JSON, Navigator und so.

Ich denke an Lua halten und wie, wenn der lua-Skript enthält ein gemeinsam genutztes Objekt (dynamisch verknüpfte Bibliothek) es für eine Initialisierungsfunktion in dieser .so Datei gesucht, und es würde man die Funktionen von außerhalb der verfügbare registrieren Modul, genau wie die Rückgabe des in asmjs angelegten Funktionsbausteins wirkt. Aber ich kann nicht herausfinden, wie man jquery.ready direkt mit C++ emuliert.

Wie Sie sehen, habe ich wenig Wissen über asmjs, aber ich habe keine Tutorials oder ähnliches gefunden, wonach ich gesucht habe. Ich habe Verweise auf Standardbibliotheken gelesen, die zur Kompilierzeit für stdlibc, stdlibC++ und SDL enthalten sind. aber keine Referenz, wie man das DOM von der C++ Quelle manipuliert.

+1

Duetto ist für diese Verwendung konzipiert: http://leaningtech.com/duetto/examples/ –

+1

@ Industrial-Antidepressivum Wenn Sie Ihren Kommentar als Antwort posten, werde ich es akzeptieren. –

+0

@ Industrial-Antidepressivum Es ist proprietär. –

Antwort

0

Wie bereits erwähnt, wenn Sie mit einer neuen Codebasis ausschließlich für das Web beginnen, dann könnte duetto eine Lösung sein. Aber meiner Meinung nach hat duetto viele Nachteile, wie keine C-Allokatoren, die es wahrscheinlich sehr schwer machen würden, wenn man Bibliotheken von Drittanbietern verwenden möchte.

Wenn Sie emscripten verwenden, bietet es eine API für alle Arten von DOM-Ereignissen, die ziemlich genau das tut, was Sie wollen.

emscripten_set_click_callback(const char *target, void *userData, int useCapture, int (*func)(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData)); 

hoffe, das hilft

+2

Ich bin nicht sicher, was Sie mit "keine C-Zuweiser" meinen. Ich denke, Sie beziehen sich vielleicht auf die Tatsache, dass Sie bei der Verwendung von Duetto keine benutzerdefinierten Allokatoren verwenden können, die Speicher manipulieren, ist eine Art unsichere Art und Weise. In diesem Fall glaube ich, dass die meisten Bibliotheken von Drittanbietern, die benutzerdefinierte Zuordner verwenden, so konfiguriert werden können, dass sie Standard-Bibliotheken verwenden (d. H. Einfach malloc/free). Ich würde auch gerne über die anderen Nachteile, die Sie erwähnt haben, wissen. Volle Enthüllung: Ich bin einer der Leute, die an Duetto arbeiten. – alexp

2

was los ist. Ich weiß, das ist ein altes Thema, aber ich poste hier für den Fall, dass jemand anders hier nach der Antwort auf diese Frage sucht (wie ich).

Technisch ja, es ist möglich - aber mit einem Tonne von dem, was man „Glue Code“, und auch ein gutes Stück von JavaScript (die Art von Niederlagen der Zweck IMO) genannt. Zum Beispiel:

#include <emscripten.h> 
#include <string> 

#define DIV 0 
#define SPAN 1 
#define INPUT 2 
// etc. etc. etc. for every element you want to use 

// Creates an element of the given type (see #defines above) 
// and returns the element's ID 
int RegisterElement(int type) 
{ 
    return EM_ASM_INT({ 
     var i = 0; 
     while (document.getElementById(i)) 
      i++; 
     var t; 
     if ($0 == 0) t = "div"; 
     else if ($0 == 1) t = "span"; 
     else if ($0 == 2) t = "input"; 
     else 
      t = "span"; 
     var test = document.createElement(t); 
     test.id = i; 
     document.body.appendChild(test); 
     return i; 
    }, type); 
} 

// Calls document.getElementById(ID).innerHTML = text 
void SetText(int ID, const char * text) 
{ 
    char str[500]; 
    strcpy(str, "document.getElementById('"); 
    char id[1]; 
    sprintf(id, "%d", ID); 
    strcat(str, id); 
    strcat(str, "').innerHTML = '"); 
    strcat(str, text); 
    strcat(str, "';"); 
    emscripten_run_script(str); 
} 

// And finally we get to our main entry point... 
int main() 
{ 
    RegisterElement(DIV); // Creates an empty div, just as an example 
    int test = RegisterElement(SPAN); Creates an empty SPAN, test = its ID 
    SetText(test, "Testing, 1-2-3"); Set the span's inner HTML 
    return 0; And we're done 
} 

hatte ich die gleiche Frage und kam mit dieser Lösung, und es kompiliert und arbeitete wie erwartet.Aber wir bauen im Grunde genommen eine C/C++ - API auf, um das zu tun, was JavaScript bereits "out of the box" macht. Verstehen Sie mich nicht falsch - aus sprachlicher Sicht würde ich jeden Tag C++ über JavaScript verwenden - aber ich kann nicht anders, als zu denken, dass es die Entwicklungszeit und mögliche Leistungsprobleme nicht wert ist, die mit einem solchen Setup verbunden sind. Wenn ich eine Web-App in C++ machen würde, würde ich definitiv Cheerp (den neuen Namen für Duetto) verwenden.