2013-07-12 19 views
15

Niedawno słyszałem o kompilowaniu kodu C++ do javascript przy użyciu emscripten i jak, jeśli zrobione są optymalizacje asmjs, ma to potencjał, aby uruchamiać aplikacje naprawdę szybko.Cała aplikacja internetowa w C++ z interakcją DOM

Przeczytałem kilka postów, samouczek, a nawet usłyszałem bardzo interesujące youtube videos. Z powodzeniem przeprowadziłem też przykład Witaj świecie.

Jednak nie znam wszystkich możliwości tego podejścia, zwłaszcza, jeśli cała aplikacja internetowa może być/powinna być napisana w C++ jako całość, bez kodu kleju.

Bardziej konkretnie chciałbym napisać coś podobnego do następującego C++ (jako odnośnik nie działający kod).

#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); 
} 

Mam nadzieję, że to wyjaśnia ideę, ale głównym celem jest osiągnięcie coś podobnego do:

  • funkcją statycznego, który inicjuje Moduł uruchamiania, gdy okno jest gotowy (to samo zachowanie, które daje jquery.ready()). Tak więc słuchacze mogą być dodawani do elementów DOM.

  • Sposób interakcji z DOM bezpośrednio z C/C++, stąd #include <window>, w zasadzie dostęp do DOM i innych elementów, takich jak JSON, Navigator i inne.

Wciąż myślę o Lua i jak gdy skrypt lua zawiera wspólny obiekt (dynamiczny połączony Library) to szukał funkcji initialize w tym pliku .so, i tam można by zarejestrować funkcje dostępne z zewnątrz moduł, dokładnie w jaki sposób działa powrót modułu funkcyjnego utworzonego w asmbie. Ale nie mogę wymyślić, jak emulować jquery.ready bezpośrednio w C++.

Jak widać, mam małą wiedzę na temat asmjs, ale nie znalazłem tutoriali lub podobnych do tego, czego szukam, przeczytałem odniesienia do standardowych bibliotek zawartych w czasie kompilacji dla stdlibc, stdlibC++ i SDL, ale brak odniesienia do sposobu manipulowania DOM ze źródła C++.

+1

Duetto jest przeznaczony do tego użytku: http://leaningtech.com/duetto/examples/ –

+1

@ Industrial-antidepressant, jeśli zamieścisz swój komentarz jako odpowiedź, zaakceptuję go. –

+0

@ Przemysłowy lek przeciwdepresyjny Jest zastrzeżony. –

Odpowiedz

0

Jak już ktoś zauważył, jeśli zaczynasz ze świeżą bazą wyłącznie dla sieci, to duetto może być rozwiązaniem. Ale moim zdaniem duetto ma wiele wad, takich jak brak przydziałów C, co prawdopodobnie utrudniłoby korzystanie z bibliotek zewnętrznych.

Jeśli używasz programu emscripten, zapewnia on interfejs API dla wszystkich rodzajów zdarzeń DOM, który ma dokładnie to, czego potrzebujesz.

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

nadzieję, że to pomaga

+2

Nie jestem pewien, co masz na myśli przez "nie przydziela C". Myślę, że możesz odwoływać się do faktu, że przy korzystaniu z Duetto nie możesz używać niestandardowych alokatorów, które manipulują pamięcią w niebezpieczny sposób. W tym przypadku uważam, że większość bibliotek stron trzecich, które używają niestandardowych alokatorów, można skonfigurować tak, aby używały standardowych (np. Zwykłe malloc/free). Chciałbym również poznać inne wady, o których wspomniałeś. Pełne ujawnienie: Jestem jedną z osób, które pracują nad Duetto. – alexp

2

co się dzieje. Wiem, że to stary temat, ale publikuję tutaj na wypadek, gdyby ktoś tu przyszedł, szukając odpowiedzi na to pytanie (tak jak ja).

Technicznie, tak to jest możliwe - ale z tonę tego, co nazywa się „Kod klej”, a także sporo JavaScript (jakiego rodzaju celowość IMO). Na przykład:

#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 
} 

Miałem to samo pytanie i wpadłem na to rozwiązanie, i skompilowałem je i działałem zgodnie z oczekiwaniami.Zasadniczo budujemy API C/C++, aby zrobić to, co JavaScript już robi "po wyjęciu z pudełka". Nie zrozumcie mnie źle - z punktu widzenia języka wziąłbym C++ ponad JavaScript każdego dnia - ale nie mogę pomóc, ale myślę, że nie jest to warte czasu rozwoju i ewentualnych problemów z wydajnością związanych z taką konfiguracją. Gdybym miał zrobić aplikację internetową w C++, zdecydowanie użyłbym Cheerp (nowa nazwa dla Duetto).