Userebbe le coroutine migliorando il mio codice?

2

Attualmente sto sviluppando il mio linguaggio di programmazione (scritto in Lua). L'analizzatore di testo è composto da due funzioni: lexer e parser .

lexer prende come input una stringa, scorre su ogni carattere di esso e lo divide in token, singole parole, numeri, stringhe o simboli. Quindi restituisce un array di essi.

parser prende anche una stringa, internamente chiama lexer su di essa, e quindi, con l'aiuto di alcune funzioni di aiuto ricorsive, costruisce una struttura ad albero sulla matrice restituita da lexer

Ora, questo sembra un buon esempio in cui l'uso delle coroutine di Lua si adatterebbe molto bene: parser , come funzione normale, alimenterebbe i caratteri alla coroutine di lexer , che attende finché non ha abbastanza caratteri da restituire un token. Quindi parser usa quel token per la sua struttura ad albero.

Ciò richiederebbe un po 'di lavoro extra per convertire il mio codice, ma la domanda è: ne vale la pena? Il codice probabilmente consumerebbe meno memoria, ma quali sono gli altri vantaggi? Sarebbe più veloce? Più leggibile (probabilmente no)? Dovrei farlo in generale?

    
posta user6245072 24.08.2016 - 12:01
fonte

1 risposta

0

This would require a bit of extra work to convert my code, but the question is: is it worth it? The code would probably consume less memory, but what are the other advantages? Would it be faster? More readable (probably not)? Should I overall do it?

L'ultima cosa che considererei l'utilizzo delle coroutine è l'efficienza computazionale. Hanno un sacco di spese generali in termini di acquisizione dello stato dello stack di chiamate e così via e ramificano istruzioni per riprendere da dove si era interrotto (è quasi sempre un superset dei dati e della memoria è necessario fare ciò che è necessario fare se si programmato assente coroutine che memorizzano / sversano tutto quello stato).

Per me sono tutti di produttività. A volte è un po 'dispendioso in termini di tempo implementare anche un iteratore in avanti a una complessa struttura di dati del grafico, mentre l'implementazione della coroutine ricorsiva potrebbe essere molto più semplice rendendo la struttura dei dati davvero facile da usare per i client. È quando raggiungo le coroutine. Quando sono preoccupato dell'efficienza computazionale, non raggiungo nemmeno Lua, nemmeno LuaJIT.

This would require a bit of extra work to convert my code, but the question is: is it worth it?

Non prenderei nemmeno in considerazione la possibilità di riscrivere codice funzionante e ben collaudato per usare le coroutine se va bene senza di esse. Ecco i dettagli di implementazione, e non mi interessa di quelli. Se verifica e funziona correttamente e si comporta in modo bello, allora non mi interessa se sta usando le coroutine o qualsiasi altra cosa, e non penso che nessuno dovrebbe farlo fino a quando non dovrebbero. Se non funziona bene e stai lottando per ottenere qualcosa di buono mentre inciampi sui bug di sinistra e di destra, perché è così difficile ottenere queste coroutine in modo corretto, allora forse usare le coroutine nell'implementazione potrebbe salvare il giorno, o no, ma non sono una caratteristica magica del genere che dovrebbe tentarti a riscrivere ciò che già funziona senza di loro.

The code would probably consume less memory [...]

Perché mai ci pensi? Coroutine richiedono quasi sempre un superset di memoria / dati alle alternative, poiché devono essere in grado di riprendere l'esecuzione da qualsiasi punto arbitrario nello stack di chiamate. I programmatori umani di solito hanno più informazioni su esattamente quali dati / memoria hanno bisogno in quei contesti, e non è che le coroutine siano ottimizzate dalla magia per quanto riguarda gli ottimizzatori. Quindi di solito è il contrario; le coroutine prendono più memoria, non meno, e sono generalmente meno efficienti, non di più, rispetto alle alternative. Ma possono essere un enorme aumento della produttività per gli sviluppatori in alcuni scenari per aiutarli a implementare il loro codice in modo più semplice e corretto.

    
risposta data 19.12.2018 - 01:15
fonte

Leggi altre domande sui tag