La gestione delle eccezioni appartiene al livello più basso del runtime?

1

Sto progettando un linguaggio di programmazione abbastanza semplice basato su stack e implementandolo in Python. (nessun collegamento, perché non è ancora completamente implementato.)

Il linguaggio stesso è essenzialmente inteso per essere il lovechild effettivamente utilizzabile di Forth e Joy , ma JIT-compilato (principalmente così posso imparare a scrivere un compilatore).

Essendo Python, non esiste una "macchina virtuale" di cui parlare nel senso normale, ma il runtime è una comunicazione tra uno stack machine (il valore di un modulo di classi che implementa varie funzionalità) e il parser "senza lexer" che in realtà trasforma i byte in chiamate di funzione in fase di runtime.

Il vero codice nativo non ha idea di eccezioni (ovviamente, essendo istruzioni fisiche, a loro non importa in alcun modo), ma il kernel può dire quando le cose sfuggono di mano, e così sia lui che il memmapper sono in un modo il gestore per errori nel codice nativo della piattaforma.

Per natura del linguaggio, una grande parte del flusso di controllo di Python viene implementata attraverso le eccezioni e gestendole. Tuttavia, lo stack machine ha lo scopo di assomigliare a una vera Stack Machine in quanto dare istruzioni sbagliate ti farà schiaffeggiare la faccia. Nella mia opinione mentre il codice disseminato con try; except; else potrebbe essere Pythonic, a volte diventa un po 'troppo, soprattutto se sono nidificati.

I gestori di eccezioni si avvicinano ai dati e alle funzioni grezzi, rendendoli forse più facili da eseguire il debug, oppure vanno insieme al (minimo) controllo dei tipi eseguito dal corridore, lasciando la macchina stack come una macchina stupida che restituisce None a volte ?

    
posta cat 30.01.2016 - 07:06
fonte

1 risposta

3

Hai scelto un'architettura insolita.

Ciò che chiamate una macchina stack non è in realtà ciò che chiamiamo in genere una macchina stack. Una macchina stack è un tipo di architettura del computer. Dal momento che le macchine stack non possono eseguire un programma, non sono un'istanza di architettura del computer, e quindi ciò che stai implementando non è propriamente uno stack machine.

Ma non sono nemmeno pile. Uno stack è una struttura di dati e in genere implementa solo le operazioni correlate a tale struttura. Quindi supporterà il pop, aggiungere, ruotare, ecc. Ma non aggiungere, mul, sub, ecc. Ma hai messo tutti i tipi di operazioni nelle tue macchine stack. In un'implementazione più tipica, quelli sarebbero parte del corridore.

La tua vera domanda è in arrivo solo a causa della tua architettura. Nella maggior parte dei casi, non ci sarebbe alcuna domanda, la gestione degli errori deve esistere nel runner perché lo stack è limitato alle operazioni sulla sua struttura dati.

Naturalmente, sei libero di esplorare architetture diverse dal tipico. Ma dal momento che stai facendo qualcosa di insolito, non posso proprio dirti quale modo di gestire gli errori si rivelerà essere migliore.

    
risposta data 30.01.2016 - 20:10
fonte

Leggi altre domande sui tag