14

So che:Qual è la differenza tra la valutazione parziale e la funzione di inlining in un linguaggio funzionale?

  1. Funzione inlining è quello di sostituire una chiamata di funzione con la definizione della funzione.
  2. La valutazione parziale consiste nel valutare le parti (statiche) note di un programma in fase di compilazione.

C'è una distinzione tra i due in linguaggi imperativi come C, in cui gli operatori sono distinti dalle funzioni. Tuttavia, c'è qualche differenza tra i due nei linguaggi funzionali come Haskell, dove gli operatori sono anche funzioni?

è l'unica differenza tra i due che funziona inlining può essere eseguita su selettivamente parti di un programma mentre la valutazione parziale viene eseguita su tutto il programma (cioè vs )?

Quali sono le differenze semantiche tra le due tecniche di ottimizzazione?

+5

Da un po 'di ricerca, mi sembra che la funzione di inlining stia essenzialmente sostituendo la definizione di funzione (nomi di variabili di modulo) nella sua chiamata sito, non viene eseguita alcuna valutazione, allo scopo di ridurre il sovraccarico della chiamata di funzione e di consentire opportunità per ulteriori ottimizzazioni nel sito di chiamata. Un esempio di valutazione parziale sarebbe la conversione di '60 * 1000' in' 60000', o la ricerca di un'espressione che può essere ridotta ad una equivalente ma più semplice. Non sono del tutto sicuro di questa posizione, quindi non ho intenzione di postarla come risposta, ma questa è la mia interpretazione. – bheklilr

+0

Forse avrei dovuto chiederlo prima di dare la mia risposta qui sotto: _perché_ pensi che in una lingua in cui gli operatori sono funzioni anche la distinzione tra allineamento e valutazione parziale sarebbe diversa? –

risposta

6

Esiste una differenza tra

  • valutare espressioni costanti su un dato insieme di operatori e funzioni note dal compilatore (o anche preprocessore), che avviene in fase di compilazione . Per esempio. il compilatore compila print(2*2) come print(4). Questo non deve essere limitato alle espressioni dell'operatore, come sembra implicare (ad esempio print(sqrt(2.0))
  • valutazione parziale, che è un concetto più ampio. Un compilatore potrebbe realizzare che print(myfunc(2)) potrebbe essere trasformato in print(c) dove c è il risultato della chiamata myfunc(2). Potrebbe quindi (al "tempo di specializzazione") chiamare myfunc(2) per determinare c. Naturalmente, questo andrà molto male se lo myfunc ha effetti collaterali, come pulire il proprio disco fisso invece del programma dell'utente. Quindi il compilatore bisogno di una sorta di annotazione o attributo per sapere quando ciò è consentito/desiderata (ad esempio C++ 11 del constexpr)

Inlining è un concetto estraneo. Inclinare una chiamata di funzione significa sostituire la chiamata dal corpo della funzione chiamata. Questo corpo non è valutato.

C'è una distinzione tra i due in linguaggi imperativi come C, in cui gli operatori sono distinti dalle funzioni. Tuttavia, c'è qualche differenza tra i due nei linguaggi funzionali come Haskell, dove gli operatori sono anche funzioni?

Questa distinzione (operatori vs funzioni) è puramente sintattico, ed è correlato alla differenza tra inlining e valutazione parziale:

Entrambe le chiamate di funzione e un'espressione con operatori possono essere inline e tempo di compilazione valutata C. La valutazione in compilazione è limitata alle espressioni su un insieme fisso di operatori e funzioni (principalmente operatori, ma questo è un incidente storico)

Entrambi i concetti hanno senso e sono distinti in Haskell.

  • Inlining: ghc ha {-# INLINE f #-}, dove f non può essere ricorsiva, per ovvie ragioni,
  • valutazione parziale: si tratta solitamente generalizzato a Supercompilation dove si trasformano non solo espressioni di tipo base, ma anche funzioni, ad esempio trasformando map f (map g xs) in map (f . g) xs). Può (ma non è necessario) fare anche l'inlining. Template Haskell è un altro modo per (esplicitamente) valutare parte di un programma in fase di compilazione.

La risposta alla domanda del tuo titolo è quindi: la differenza tra l'inlining e la valutazione parziale non ha nulla a che fare con la differenza tra funzioni e operatori, ed è praticamente la stessa nei linguaggi funzionali come in C. Valutazione parziale è probabilmente più difficile in C a causa degli effetti collaterali (vedere sopra l'hard disk cancellato)