7

tutti noi conosciamo corto circuito nelle espressioni logiche, vale a dire quandoEsiste una moltiplicazione del cortocircuito?

if (False AND myFunc(a)) then 
... 

non si preoccupa di eseguire myFunc() perché non c'è modo la condizione if può essere vero.

ero curioso di vedere se c'è un equivalente per l'equazione algebrica di tutti i giorni, dicono

result = C*x/y + z 

Se C=0 non v'è alcun punto nella valutazione del primo termine. Non sarebbe molto importante dal punto di vista delle prestazioni se x e fossero scalari, ma se pretendiamo che siano matrici di grandi dimensioni e le operazioni siano costose (e applicabili alle matrici) allora sicuramente farebbe la differenza. Ovviamente si potrebbe evitare un caso così estremo lanciando una dichiarazione if C!=0.

Quindi la mia domanda è se una tale funzione esiste e se è utile. Non sono un gran programmatore quindi probabilmente lo faccio sotto un nome che non ho incontrato; in tal caso, per favore, chiariscimi :)

+1

logico corto circuito è un concetto importante da un punto di vista la funzionalità, mentre "l'aritmetica corto circuito" è semplicemente un'ottimizzazione a livello di compilatore senza differenze funzionali. La tua lingua preferita potrebbe già essere dietro le quinte senza che tu te ne accorga. – deceze

+2

Qualcuno che ne sa più di me dovrebbe rispondere, ma immagino che si verifichino dei problemi se si interrompe la divisione. Cosa succederebbe, ad esempio, se y = 0? Se cortocircuitato, restituirebbe 0 quando la risposta è in realtà un errore. – Nate

+0

@deceze Il cortocircuito aritmetico avrebbe effettivamente differenze funzionali oltre l'ottimizzazione, proprio come avviene nel caso del cortocircuito logico. Si consideri 'result = C * myfunction()'. Se 'C == 0', causando un cortocircuito dell'espressione aritmetica, allora' myfunction' non viene mai invocato e qualsiasi effetto collaterale che potrebbe avere non si verifica (come nel caso del cortocircuito logico). –

risposta

6

Il concetto si sta parlando va sotto nomi diversi: valutazione pigra, non rigorosa valutazione, chiamata necessità, solo per citarne alcuni e in realtà è molto più potente di solo evitando una moltiplicazione qui e Là.

Esistono linguaggi di programmazione come Haskell o Frege il cui modello di valutazione non è rigido. Ci sarebbe abbastanza facile da scrivere il "corto circuito" operatore di moltiplicazione, ad esempio, si potrebbe scrivere qualcosa di simile:

infixl 7 `*?`  -- tell compiler that ?* is a left associative infix operator 
        -- with precedence 7 (like the normal *) 

0 *? x = 0   -- do not evaluate x 
y *? x = y * x  -- fall back to standard multiplication 
+0

Grazie! Accettato anche per rispondere ad alcune domande di follow-up. – Verge

1

Se i dati sono grandi e/o complessi e le operazioni sono costose, l'implementazione dell'operazione dovrebbe eseguire controlli di scelta rapida appropriati prima di eseguire l'operazione costosa. Si tratta di un dettaglio interno dell'implementazione dell'operatore (ad esempio, matrice *) ma in realtà non ha nulla a che fare con il concetto di "moltiplicazione" del linguaggio e dovrebbe avere un impatto minimo sul modo in cui si scrivono i calcoli.