I "normali ordini" e "call-by-name" sono la stessa cosa?

8

Stavo studiando il libro Struttura e interpretazione dei programmi per computer e nella sezione < a href="http://mitpress.mit.edu/sicp/full-text/book/book-ZH-10.html#%_sec_1.1.5"> 1.1.5 Il modello di sostituzione per l'applicazione di procedura l'autore spiega i concetti di ordine normale e ordine applicativo , che credo di aver capito bene.

Ora sto seguendo un corso su Coursera chiamato Principi di programmazione delle funzioni in Scala e lì il professore Martin Odersky (che ha basato gran parte del suo corso nel libro citato sopra) spiega gli stessi concetti sotto i nomi di call-by-name e call-by-value .

Nel suo corso, il professor Odersky sostiene che il modello di sostituzione è basato sul calcolo Lambda, quindi ho consultato un libro sulla mia libreria Un'introduzione alla programmazione funzionale Sebbene sia il Lambda Calculus e nella pagina 22, l'autore definisce i termini come ordine applicativo e ordine normale. È interessante notare che nella sua definizione dice che l'ordine applicativo è come la chiamata per valore di Pascal, mentre l'ordine normale è come la chiamata per nome di Algol.

L'uso delle parole "è come" nella sua spiegazione è ciò che mi ha fatto dubitare. Quindi le mie domande:

  • Sono questi due termini equivalenti o ce ne sono sottili differenze?
  • Posso usare l'uno o l'altro in modo intercambiabile senza rischiare di sbagliare nel significato che trasmettono?
  • Ci sono ragioni per cui tu sappia che giustificano l'esistenza di termini diversi per riferirsi alla stessa cosa?
posta edalorzo 30.03.2013 - 21:55
fonte

1 risposta

5

La valutazione ordinaria e la valutazione call-by-name non sono esattamente la stessa cosa. Nella valutazione normale dell'ordine, la funzione più esterna viene valutata prima di uno qualsiasi dei suoi argomenti e tali argomenti vengono valutati solo se necessario. Nella valutazione call-by-name, gli argomenti vengono copiati efficacemente nel corpo della funzione più esterna e quindi tale funzione viene valutata. In entrambi i casi, la funzione più esterna viene valutata tecnicamente prima degli argomenti, ma in puro call-by-name, gli argomenti vengono valutati ogni volta che vengono utilizzati (zero, uno o più volte). Nell'ordine normale, gli argomenti della funzione vengono valutati almeno quando sono necessari (in genere zero o una volta).

Quindi la normale valutazione degli ordini lascia aperta la possibilità di memoizzare gli argomenti come un'ottimizzazione (talvolta chiamata call-by-need), mentre call-by-name no. Quindi si potrebbe dire che la valutazione call-by-name è un caso speciale della normale valutazione degli ordini. In altre parole, la normale valutazione dell'ordine si riferisce all'approccio generale di valutare una funzione prima dei suoi argomenti, mentre la valutazione call-by-name fa riferimento a una tecnica specifica per l'implementazione della normale valutazione degli ordini.

Ad esempio, dato f(x, y) = sqrt(x*x + y*y) potremmo avere due modi per implementare f(a+b, c+d) con la normale valutazione degli ordini:

Memoized:

t1 = a+b;
t2 = c+d;
return sqrt(t1*t1 + t2*t2);

Call-by-name:

return sqrt((a+b)*(a+b) + (c+d)*(c+d));

Come puoi vedere, se la chiamata a f include altre chiamate di funzione (cioè f(random(1,100), ask_user_for_value()) ), i due avranno un comportamento molto diverso. La versione memoizzata quadrerà un singolo numero casuale e chiederà all'utente un valore solo una volta, mentre la versione call-by-name moltiplicherà due numeri casuali e chiederà all'utente un valore due volte.

Per ulteriori informazioni su questi concetti, ti consigliamo di leggere la strategia di valutazione della pagina di Wikipedia e link .

    
risposta data 12.04.2013 - 03:49
fonte