Mi sono imbattuto di recente nella parola chiave yield
in Python (così come in JavaScript) - Capisco che questo sia usato primariamente per il modello di generatore, ma il costrutto del linguaggio sembra essere usato anche nelle funzioni asincrone dove si trovano i miei interessi. Nelle funzioni asincrone può semplicemente agire come zucchero sintatico e so che esistono schemi alternativi per ottenere lo stesso effetto - Ma mi piace - MOLTO!È possibile implementare la funzionalità di rendimento di Python nella C libera?
Voglio sapere se riesco a fare qualcosa di simile in C (anche con il montaggio in linea). Mi sono imbattuto in un'implementazione Java usando i thread https://github.com/mherrmann/java-generator-functions che posso più o meno implementare in C. Tuttavia questa non sarà un'implementazione indipendente, e il mio interesse è puramente in un'implementazione indipendente.
Venendo a C co-routines (http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html), uno dei deficit è che gli oggetti dello stack non possono essere utilizzati. Tuttavia, sto ancora bene con questo poiché le attuali implementazioni di callback asincrone non possono nemmeno usare lo stack. Tuttavia, il problema si trova in un'implementazione indipendente - Non riesco a pensare a un modo per raccogliere tutte le variabili del registro e memorizzarle senza un ambiente ospitato.
Probabilmente c'è una soluzione che utilizza lo setjmp/longjmp
, tuttavia sono abbastanza sicuro che questi non possano essere implementati come indipendenti.
Quindi la domanda è: è possibile implementare la funzionalità di rendimento Python in Libera installazione C?
Personalmente penso di aver esaurito le possibilità, quindi ti chiederò questo: se potessi avere un'implementazione ospitata, come la implementeresti (preferibilmente con qualche magia magica)? Ho un'implementazione abbastanza brutta che posterò più avanti se non verrà fuori nulla di interessante.
Anche io non voglio implementazioni in C++ - A meno che non si possa avvolgere il C++ con pure funzioni C.
MODIFICA: Un requisito di base è che la funzione del generatore deve essere reinserente.
Dato che l'interprete Python è scritto in C ... sì? – chepner
Non penso. O hai bisogno della libreria standard (che implementa 'setjmp' e' longjmp'), o devi fare alcune operazioni specifiche dell'hardware, molto probabilmente coinvolgendo il montaggio. Quanto indipendente lo vuoi? – mtijanic
@mtijanic Le operazioni specifiche dell'hardware vanno bene. Quello che voglio è - Se potessi modificare un compilatore C e introdurre una sintassi di yield allora quella sintassi dovrebbe essere disponibile nella prima fase della compilazione di un compilatore (quando può compilare solo il codice indipendente). Non dovrebbe dipendere da funzioni specifiche del sistema operativo come quando si costruisce la seconda fase del compilatore. Non sono sicuro se quello che ho appena detto abbia senso per chiunque. – tinkerbeast