Articulo de referencia

El dispositivo de Jensen

El dispositivo de Jensen es una técnica de programación informática que aprovecha la llamada por nombre . Fue ideado por el científico informático danés Jørn Jensen , quien trab...

El dispositivo de Jensen es una técnica de programación informática que aprovecha la llamada por nombre . Fue ideado por el científico informático danés Jørn Jensen , quien trabajó con Peter Naur en Regnecentralen . Trabajaron en el compilador GIER ALGOL , una de las primeras implementaciones correctas de ALGOL 60. ALGOL 60 utilizaba la llamada por nombre. [ 1 ] [ 2 ] [ 3 ] Durante su discurso de aceptación del Premio Turing, Naur menciona su trabajo con Jensen en GIER ALGOL.

Descripción

El dispositivo de Jensen aprovecha la llamada por nombre y los efectos secundarios . La llamada por nombre es una convención de paso de argumentos que retrasa la evaluación de un argumento hasta que se utiliza realmente en el procedimiento, lo cual es consecuencia de la regla de copia para procedimientos. ALGOL introdujo la llamada por nombre.

Un ejemplo clásico del dispositivo de Jensen es un procedimiento que calcula la suma de una serie,k=ak{\displaystyle \textstyle \sum _ {k=\ell }^{u}a_ {k}}: [ 4 ] [ 5 ] [ 6 ]

procedimiento real Sum(k, l, u, ak) valor l, u; entero k, l, u; real ak; comentario k y ak se pasan por nombre; inicio real s; s := 0; para k := l paso 1 hasta que hagas s := s + ak; Suma := s fin ;

En el procedimiento, la variable de índice ky el término de suma akse pasan por nombre. El paso por nombre permite que el procedimiento cambie el valor de la variable de índice durante la ejecución del forbucle. El paso por nombre también hace que el akargumento se reevalúe durante cada iteración del bucle. Normalmente, akdependerá del cambio (efecto secundario) k.

Por ejemplo, el código para calcular la suma de los primeros 100 términos de un arreglo real V[]sería:

Suma(i, 1, 100, V[i]).

Durante la ejecución de Sum, el argumento real ise incrementará durante cada paso del forbucle, y cada una de las evaluaciones del procedimiento akutilizará el valor actual de ipara acceder a los elementos sucesivos de la matriz V[i].

El dispositivo de Jensen es general. Una doble suma se puede realizar de la siguiente manera:

Suma(i, l, m, Suma(j, l, n, A[i,j]))

La Sumfunción puede emplearse para funciones arbitrarias simplemente utilizando las expresiones apropiadas. Si se deseara una suma de enteros, la expresión sería simplemente Sum(i,1,100,i);, si una suma de cuadrados de enteros, entonces Sum(i,1,100,i*i);, y así sucesivamente. [ 7 ] Una ligera variación sería adecuada para iniciar una integración numérica de una expresión mediante un método muy similar al de Sum.

La evaluación akse implementa mediante una función diferida (thunk) , que es esencialmente una subrutina con un entorno. La función diferida es un cierre sin argumentos. Cada vez que un procedimiento necesita el valor de su argumento formal, simplemente llama a la función diferida. Esta evalúa el argumento real dentro del ámbito del código que la llama (no dentro del ámbito del procedimiento).

En ausencia de esta funcionalidad de paso por nombre, sería necesario definir funciones que incorporen las expresiones que se van a pasar según los protocolos del lenguaje informático, o crear una función compendio junto con algún mecanismo para seleccionar la expresión deseada para cada uso.

GPS

Otro ejemplo es GPS (General Problem Solver), descrito en ALGOL 60 confidencial de DE Knuth y JN Merner . [ 8 ]

procedimiento real GPS(I, N, Z, V); real I, N, Z, V; inicio para I := 1 paso 1 hasta que N hacer Z := V; GPS := 1 fin ;

A continuación se muestra una única instrucción que encuentra el m-ésimo número primo utilizando GPS.

I := GPS(I, si I=0 entonces -1.0 sino I, P, si I=1 entonces 1.0 sino si GPS(A, I, Z, si A=1 entonces 1.0 sino si entier(A)×(entier(I)÷entier(A))=entier(I) ∧ A<I entonces 0.0 sino Z) = Z entonces ( si P<m entonces P+1 sino I×GPS(A, 1.0, I, -1.0)) sino P)

(Nota: En el artículo original, la expresión cerca del final es , debido a un caso límite en la especificación de la semántica de la instrucción for deGPS(A, 1.0. I, 0.0) ALGOL 60. )

Crítica

El dispositivo de Jensen se basa en la llamada por nombre, pero esta es sutil y presenta algunos problemas. Por consiguiente, la llamada por nombre no está disponible en la mayoría de los lenguajes. Knuth comenta que ALGOL 60 no puede expresar un increment(n)procedimiento que incremente su argumento en uno; la llamada increment(A[i])no realiza la acción esperada si ise trata de un funcional que cambia con cada acceso. [ 9 ] Knuth afirma: «El uso de las funcionalidades de definición de "macro" para extender el lenguaje, en lugar de depender únicamente de procedimientos para este propósito, da como resultado un programa de ejecución más satisfactorio».

Otros señalan que un procedimiento de llamada por nombre que intercambia su argumento puede tener problemas sutiles. [ 10 ] Un procedimiento de intercambio obvio es:

procedimiento swap(a, b) entero a, b; inicio entero temp; temp := a; a := b; b := temp; fin ;

El procedimiento funciona correctamente para muchos argumentos, pero la invocación swap(i,A[i])es problemática. El uso de la regla de copia conduce a las siguientes asignaciones:

temp := i; i := A[i]; A[i] := temp;

El problema es que la segunda asignación cambia i, por lo que A[i]en la tercera asignación probablemente no será el mismo elemento de la matriz que al principio. Si, por otro lado, el procedimiento se codificara al revés (guardando b en temp en lugar de a ), entonces se obtendría la acción deseada, a menos que se invocara como swap(A[i],i). (Una opción más segura swap()sería .)temp1 := a; temp2 := b; a := temp2; b := temp1;

Véase también

Referencias

  1. Naur, Peter (2005). Vídeo de la conferencia de Peter Naur . Premios ACM . Dinamarca: Association for Computing Machinery . Consultado el 11 de septiembre de 2020 .
  2. David (1 de marzo de 2006). "El pionero del software Peter Naur gana el premio Turing de la ACM" . ACM Public Policy . Association for Computing Machinery . Consultado el 11 de septiembre de 2020 .
  3. "ACM: Miembros: Peter Naur, Profesor Emérito, Universidad de Copenhague, Cita" . 2005. Archivado del original el 12 de febrero de 2008. Consultado el 21 de septiembre de 2020 .Archivado el 12 de febrero de 2008 en Wayback Machine.
  4. MacLennan, Bruce J. (1987). Principios de los lenguajes de programación: diseño, evaluación e implementación (2.ª ed.). Holt, Rinehart & Winston. págs. 141–142 . ISBN   0-03-005163-0.
  5. Dijkstra, EW (noviembre de 1961). "Defensa de ALGOL 60 (Carta al editor)" . Communications of the ACM . 4 (11): 502– 503. doi : 10.1145/366813.366844 . S2CID 34185299 . 
  6. Knuth, DE (octubre de 1967). "Los puntos problemáticos restantes en ALGOL 60" . Communications of the ACM . 10 (10): 611– 617. doi : 10.1145/363717.363743 . S2CID 10070608 . 
  7. Sum requiere unrealargumento para el término, por lo que se asume la conversión de tipo.
  8. ^ Knuth, Donald E.; Merner, Jack N. (junio de 1961). «ALGOL 60 confidencial» . Comunitario. ACM . 4 (6): 268– 272. doi : 10.1145/366573.366599 . S2CID 22215746 . 
  9. Knuth 1967 , pág. 613. Por ejemplo,se incrementarádos veces. increment(A[increment(j)])j
  10. MacLennan 1987
  • Semántica estándar sin almacenamiento para la estructura de bloques de estilo ALGOL y llamada por nombre.