Intendi creare un traduttore automatico Javascript to C generico (ovvero un compilatore da Javascript a C)?
Questo è piuttosto impegnativo e richiederà molti anni di lavoro, in particolare se si vuole creare un efficace compilatore Javascript to C (qualcosa che non sarà molto più lento della maggior parte delle attuali implementazioni di Javascript)
Si noti che Javascript semanticamente ha molte caratteristiche comuni con Scheme (digitazione dinamica, garbage collection, chiusure, e forse valutazione run-time), anche se la sintassi è molto diversa . Il suo modello di oggetto prototipo non si trova in Scheme, ma è possibile trovare alcune implementazioni di prototipi di modelli di oggetti in Scheme abbastanza simili al modello di Javascript. Quindi consiglio vivamente di studiare Scheme e la sua semantica formale, e di guardare dentro diversi traduttori Scheme to C ( Bigloo , Pollo , Stalin, ...). A differenza di Scheme, Javascript era inizialmente mal definito (la sua prima implementazione era un paio di settimane di hack!) E ha alcune spiacevoli peculiarità (risultato di [] + {}
, ecc ...) che sono dolorose da gestire in un Javascript to C translator .
Quindi raccomando vivamente di leggere C.Queinnec Lisp In Small Pieces libro. Leggi anche il linguaggio di programmazione pragmatico di Scott libro.
L'aspetto asincrono di Javascript è simile a coroutine ea continuation passing style (noto anche come CPS). Esamina Continuation Passing C , sta traducendo un programma in CPC (un dialetto esteso di C, con rendimento , spawn , wait , ... primitive utilizzabili per calcoli asincroni) in plain C usando tecniche di stile a passaggio continuo.
Se il tuo obiettivo non è un traduttore generico di Javascript in C, ma semplicemente manualmente riscrivi uno specifico programma Javascript in C, coroutine , callback , chiusure e CPS sono ancora concetti utili da valutare.
E potresti persino generare o scrivere codice per CPC, quindi utilizzare il compilatore CPC per ottenere C ordinario
Potresti anche implementare i tuoi calcoli asincroni usando deprecato setcontext ( 3) routine, ma non è consigliabile utilizzarlo poiché è deprecato, livello molto basso (in pratica è l'impostazione di tutti i registri della macchina), in qualche modo specifico della macchina e difficile da eseguire il debug.
Naturalmente potresti anche considerare il multi-threading, ad es. POSIX pthreads o C11 discussioni .