Implementazione della chiamata di funzione asincrona in C

5

Recentemente ho iniziato a lavorare per creare un traduttore generico per tradurre automaticamente i programmi js in C, ma mi sono bloccato quando pensavo al comportamento asincrono. Usando ANSI / POSIX C e consentendo solo a te stesso di utilizzare una libreria per un'implementazione del threadpool, come andresti sull'implementazione delle chiamate a funzioni asincrone in C. La metodologia deve essere thread-safe. Quando sono arrivato al mio approccio, mi sono ispirato all'uso di questa fonte di ciò che chiamano il modello Asynchronous Dispatcher : link

    
posta Francesco Gramano 26.04.2015 - 23:34
fonte

1 risposta

9

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 .

    
risposta data 27.04.2015 - 10:50
fonte

Leggi altre domande sui tag