¿Son lo mismo "orden normal" y "llamada por nombre"?

8

Estaba estudiando el libro Estructura e interpretación de programas informáticos y en la sección < a href="http://mitpress.mit.edu/sicp/full-text/book/book-ZH-10.html#%_sec_1.1.5"> 1.1.5 El Modelo de Sustitución para la Aplicación de Procedimientos el el autor explica los conceptos de orden normal y orden aplicativo , que creo que he entendido bien.

Ahora, estoy tomando un curso en Coursera llamado Function Programming Principles in Scala y allí el profesor Martin Odersky (que basó gran parte de su curso en el libro citado anteriormente) explica los mismos conceptos bajo los nombres de call-by-name y llamada por valor .

En su curso, el profesor Odersky dice que el modelo de sustitución se basa en el Cálculo Lambda, así que consulté un libro en mi biblioteca Una introducción a la programación funcional a través de Lambda Calculus y en la página 22, el autor define los términos como orden aplicativo y orden normal. Curiosamente en su definición, dice que el orden aplicativo es como la llamada por valor de Pascal, mientras que el orden normal es como la llamada por nombre de Algol.

El uso de las palabras "es como" en su explicación es lo que me hizo dudar. Por eso mis preguntas:

  • ¿Son estos dos términos equivalentes o hay alguno ¿diferencias sutiles?
  • ¿Puedo usar uno u otro indistintamente? sin arriesgarse a cometer un error en el significado que transmiten?
  • ¿Hay alguna razón que sepa que justifique la existencia de una terminología diferente para referirse a la misma cosa?
pregunta edalorzo 30.03.2013 - 21:55

1 respuesta

5

La evaluación de orden normal y la evaluación de llamada por nombre no son exactamente lo mismo. En la evaluación de orden normal, la función más externa se evalúa antes de cualquiera de sus argumentos, y esos argumentos solo se evalúan si es necesario. En la evaluación llamada por nombre, los argumentos se copian de manera efectiva en el cuerpo de la función más externa y luego se evalúa esa función. En ambos casos, la función más externa se evalúa técnicamente antes que los argumentos, pero en la llamada por nombre, los argumentos se evalúan cada vez que se usan (ya sea cero, uno o muchas veces). En el orden normal, los argumentos de la función se evalúan al menos solo cuando se necesitan por primera vez (por lo general, cero o una vez).

Por lo tanto, la evaluación de orden normal deja abierta la posibilidad de memorizar los argumentos como una optimización (a veces llamada llamada por necesidad), mientras que la llamada por nombre no lo hace. Por lo tanto, se podría decir que la evaluación llamada por nombre es un caso especial de evaluación de orden normal. En otras palabras, la evaluación de orden normal se refiere al enfoque general de evaluar una función antes de sus argumentos, mientras que la evaluación de llamada por nombre se refiere a una técnica específica para implementar la evaluación de orden normal.

Como ejemplo, dado f(x, y) = sqrt(x*x + y*y) podríamos tener dos formas de implementar f(a+b, c+d) con la evaluación de orden normal:

Memoized:

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

Llamada por nombre:

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

Como puede ver, si la llamada a f incluye otras llamadas de función (es decir, f(random(1,100), ask_user_for_value()) ), las dos tendrán un comportamiento muy diferente. La versión memorizada cuadrará un solo número aleatorio y le pedirá al usuario un valor solo una vez, mientras que la versión llamada por nombre multiplicará dos números aleatorios y le pedirá al usuario un valor dos veces.

Para obtener más información sobre estos conceptos, recomiendo leer la estrategia de evaluación página de Wikipedia, y enlace .

    
respondido por el Randall Cook 12.04.2013 - 03:49

Lea otras preguntas en las etiquetas