Fino ad ora ho sempre lavorato con linguaggi imperativi come Pascal, C, C ++, Java in un ambiente di produzione, quindi ho esperienza con i debugger per questi linguaggi (Turbo Pascal, Turbo C, GDB / DDD, Visual Studio, Eclipse ).
Un debugger per un linguaggio imperativo normalmente consente di
- Imposta i punti di interruzione sulle istruzioni ed esegui il programma fino al successivo punto di interruzione.
- Esegue il programma una dichiarazione alla volta, con l'opzione di immettere una chiamata funzione / metodo o saltare alla seguente istruzione.
Quando l'esecuzione del programma è in pausa, è possibile esaminare lo stato corrente del programma, cioè:
- Controlla il contenuto della pila per vedere l'annidamento corrente delle chiamate di funzione.
- Esamina le variabili locali, i parametri delle funzioni effettive, le variabili globali e così via.
Dato che non ho mai lavorato con un linguaggio di programmazione funzionale in un ambiente di produzione, stavo cercando di capire come sarebbe un debugger per un tale linguaggio. Ad esempio:
- In che modo il debugger percorre il programma se non ci sono affermazioni come in un linguaggio imperativo? Dove si impostano i punti di interruzione?
- In una lingua con valutazione lenta come Haskell, la sequenza delle chiamate alle funzioni può essere diversa da quella di un linguaggio desideroso: questo farà una grande differenza quando proverai a capire lo stack delle chiamate?
- E le variabili? Dato che non esiste uno stato, immagino che un debugger mostrerà solo i binding di variabili per l'attuale scope (?), Cioè non ci saranno variabili locali o globali che cambiano valore mentre passo attraverso il programma.
Riassumendo, ci sono caratteristiche generali e comuni dei debugger del linguaggio funzionale che li distinguono chiaramente dai debugger in linguaggio imperativo?