asm.js

asm.js - Toda la aplicación web en C++ con interacción DOM



(2)

Recientemente he oído hablar de compilar código C ++ para javascript usando emscripten y cómo, si se realizan las optimizaciones de asmjs, tiene el potencial de ejecutar aplicaciones realmente rápido.

He leído varias publicaciones, tutoriales e incluso escuché algunos videos de YouTube muy interesantes. También he ejecutado el ejemplo hola mundo con éxito.

Sin embargo, no conozco todas las capacidades de este enfoque, especialmente si una nueva aplicación web completa puede / debería escribirse en C ++ en su totalidad, sin código de cola.

Más concretamente, me gustaría escribir algo similar al siguiente C ++ (como código de referencia que no funciona).

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

Espero que quede clara la idea, pero el objetivo es lograr algo similar a:

  • Una función estática que inicializa la ejecución del módulo cuando la ventana está lista (el mismo comportamiento que proporciona jquery.ready ()). Así que los oyentes se pueden agregar a los elementos DOM.

  • Una forma de interactuar con el DOM directamente desde C / C ++, por lo tanto, #include <window> , básicamente acceso al DOM y otros elementos como JSON, Navigator y demás.

Sigo pensando en Lua y cómo, cuando el script lua incluye un objeto compartido (biblioteca vinculada dinámica), buscó una función de inicialización en ese archivo .so, y allí se registrarán las funciones disponibles desde fuera del módulo, exactamente cómo se realiza el retorno. del modulo de funcion creado en asmjs. Pero no puedo averiguar cómo emular jquery.ready directamente con C ++.

Como puede ver, tengo poco conocimiento sobre asmjs, pero no he encontrado tutoriales o similares para lo que estoy buscando, he leído referencias a bibliotecas estándar incluidas en tiempo de compilación para stdlibc, stdlibc ++ y SDL, pero ninguna referencia en cómo manipular el DOM desde la fuente de C ++.


Como alguien ya ha señalado, si empiezas con un nuevo código base exclusivo para la web, entonces el duetto podría ser una solución. Pero en mi opinión, duetto tiene muchos inconvenientes, como ningún asignador de C, lo que probablemente lo haría muy difícil si desea utilizar bibliotecas de terceros.

Si está usando emscripten, proporciona una API para todo tipo de eventos DOM, que hace casi exactamente lo que quiere.

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

espero que esto ayude


que pasa. Sé que este es un tema antiguo, pero estoy publicando aquí en caso de que alguien más venga aquí buscando la respuesta a esta pregunta (como hice yo).

Técnicamente, sí, es posible , pero con una tonelada de lo que llamaste "código de pegamento", y también una buena cantidad de JavaScript (lo que supera el propósito de la OMI). Por ejemplo:

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

Tuve la misma pregunta y se me ocurrió esta solución, que compiló y funcionó como se esperaba. Pero básicamente estamos construyendo una API C / C ++ solo para hacer lo que JavaScript ya hace "fuera de la caja". No me malinterpretes, desde el punto de vista del idioma que tomaría C ++ sobre JavaScript cualquier día, pero no puedo evitar pensar que no vale la pena el tiempo de desarrollo y los posibles problemas de rendimiento involucrados en una configuración como esta. Si fuera a hacer una aplicación web en C ++, definitivamente usaría Cheerp (el nuevo nombre de Duetto).