젠센의 장치
Jensen's device젠슨의 장치는 이름으로 호출을 착취하는 컴퓨터 프로그래밍 기법이다.레그네센트랄렌에서 피터 나우르와 함께 일했던 덴마크의 컴퓨터 과학자 욘 옌센이 고안한 것이다.그들은 GIER ALGOL 컴파일러에서 일했는데, ALGOL 60은 이름별 호출을 사용하였다.[1][2][3]튜링 어워드 연설에서 나우르스는 젠슨과의 GIER ALGOL에 대한 그의 작품에 대해 언급한다.
설명
젠슨의 장치는 이름과 부작용에 의한 호출을 이용한다.이름별 호칭은 논쟁의 평가를 절차에서 실제로 사용될 때까지 지연시키는 인수합병(continue passing convention)으로, 절차에 대한 복사 규칙의 결과물이다.알골은 이름별 호출을 소개했다.
옌센 디바이스의 고전적인 예로 k = a k [4][5][6] :
real procedure Sum(k, l, u, u, ak) 값 l, 정수 k, l, u, real ak, comment k 및 ak는 이름으로 전달된다; real s; s= 0; k := l step 1의 경우 u do :=s + q; sum := send;
절차에서 인덱스 변수k
및 합계 기간ak
이름 석자로 통하다Call by name(이름별 호출)은 실행 중에 인덱스 변수의 값을 변경하는 절차를 활성화한다.for
루프. 이름을 부르는 것은 또한ak
루프의 각 반복 동안 재평가해야 할 주장전형적으로ak
변화(부작용)에 따라 달라짐)k
.
예를 들어, 실제 배열의 처음 100개 항의 합계를 계산하는 코드V[]
다음과 같을 수 있다.
합(i, 1, 100, V[i])
실행 중Sum
, 실제 논쟁i
의 각 단계 동안 증가for
루프, 그리고 각 절차의 평가:ak
의 현재 값을 사용할 것i
연속적인 배열 요소에 접근하다V[i]
.
젠슨의 장치는 일반적이다.이중 합계는 다음과 같이 할 수 있다.
Sum(i, l, m, Sum(j, l, n, A[i,j]))
그Sum
함수는 적절한 표현을 사용하는 것만으로 임의 함수에 사용될 수 있다.만약 정수의 합을 원한다면 그 표현은 그저 그럴 것이다.Sum(i,1,100,i);
정수의 제곱합이면Sum(i,1,100,i*i);
, 등등.[7]약간의 변동은 의 그것과 매우 유사한 방법으로 표현식의 수치적 통합을 시작하는데 적합할 것이다.Sum
.
에 대한 평가.ak
기본적으로 환경이 있는 서브루틴인 Thunk로 구현된다.그 깡패는 논쟁 없이 종결된 것이다.어떤 절차가 그것의 공식적인 논쟁의 가치를 필요로 할 때마다, 그것은 단순히 thunk를 부른다.Thunk는 호출 코드의 범위(절차의 범위가 아님)에서 실제 인수를 평가한다.
이 패스 바이 네임 시설이 없는 경우, 컴퓨터 언어의 프로토콜에 따라 전달할 그러한 표현을 구현하는 기능을 정의하거나, 각 용도에 대해 원하는 표현을 선택하기 위한 어떤 배열과 함께 컴펜듐 기능을 만들 필요가 있을 것이다.
GPS
또 다른 예는 D에 기술된 GPS(General Problem Solver)이다.E. Knuth와 J. N. Merner의 ALGOL 60 기밀.[8]
실제 절차 GPS(I, N, Z, V); 실제 I, N, Z, V; N do Z := V; GPS : 1 end;
다음은 GPS를 사용하여 m-th prime을 찾는 단일 문항이다.
I := GPS(I, if I=0 then -1.0 else I, P, if I=1 then 1.0 else if GPS(A, I, Z, if A=1 then 1.0 else if entier(A)×(entier(I)÷entier(A))=entier(I) ∧ A<I then 0.0 else Z) = Z then (if P<m then P+1 else I×GPS(A, 1.0, I, -1.0)) else P)
(참고: 원본에서 말단 가까운 표현은GPS(A, 1.0. I, 0.0)
, 성명용 ALGOL 60의 의미 명세서의 코너 케이스로 인해.)
비판
젠슨의 장치는 이름별 호출에 의존하지만, 이름별 호출은 미묘하고 약간의 문제가 있다.따라서 대부분의 언어에서는 이름별 호출을 사용할 수 없다.ALGOL 60은 표현할 수 없다는 Knuth 논평increment(n)
그 주장을 1로 증가시키는 절차; 요구increment(A[i])
다음과 같은 경우 예상되는 작업을 수행하지 않음i
각각의 접근에 따라 변하는 기능이다.[9]크누스는 '매크로' 정의 설비를 이용해 언어를 확장하는 것은 이러한 목적을 위해 절차에만 의존하는 것이 아니라 보다 만족스러운 실행 프로그램을 만들어 낸다고 말한다.
다른 이들은 자신의 주장을 스와핑하는 지명절차에 의한 통화는 미묘한 문제를 일으킬 수 있다고 지적한다.[10]분명한 스와핑 절차는 다음과 같다.
프로시저 스왑(a, b) 정수 a, b; 시작 정수 temp; temp := a; b; b := temp; end;
그 절차는 많은 논쟁에 대해 옳은 일을 하지만, 의 발명은.swap(i,A[i])
문제가 있다.복사 규칙을 사용하면 다음과 같은 할당이 발생한다.
온도 := i; i := A[i];A[i] :=온도;
문제는 두 번째 과제가 바뀐다는 것이다.i
, 그래서 .A[i]
세 번째 할당에서는 아마도 시작 시와 동일한 배열 요소가 아닐 것이다.반면에 절차를 (b가 a 대신 temp에 저장됨) 다른 방식으로 코드화한다면, 원하는 동작은 다음과 같이 호출되지 않는 한 결과가 될 것이다.swap(A[i],i)
참고 항목
- 콜 스택, 스택 프레임, 정적 링크 및 디스플레이(환경 링크를 포함한 폐쇄)
- 더프 장치
- 함수를 값으로 전달 및 반환하는 방법에 대한 Funarg 문제
- 남자 또는 남자 테스트, 환경 테스트
참조
- ^ Naur, Peter (2005). Peter Naur Lecture Video. ACM Awards. Denmark: Association for Computing Machinery. Retrieved 2020-09-11.
- ^ David (1 March 2006). "Software Pioneer Peter Naur Wins ACM's Turing Award". ACM Public Policy. Association for Computing Machinery. Retrieved 2020-09-11.
- ^ "ACM: Fellows: Peter Naur, Professor Emeritus, University of Copenhagen, Citation". 2005. Archived from the original on 2008-02-12. Retrieved 2020-09-21.
- ^ MacLennan, Bruce J. (1987). Principles of Programming Languages: Design, Evaluation, and Implementation (2nd ed.). Holt, Rinehart & Winston. pp. 141–2. ISBN 0-03-005163-0.
- ^ Dijkstra, E. W. (November 1961). "Defense of ALGOL 60 (Letter to the Editor)". Communications of the ACM. 4 (11): 502–503. doi:10.1145/366813.366844. S2CID 34185299.
- ^ Knuth, D. E. (October 1967). "The Remaining Troublespots in ALGOL 60". Communications of the ACM. 10 (10): 611–617. doi:10.1145/363717.363743. S2CID 10070608.
- ^
Sum
a가 필요하다.real
용어에 대한 인수, 즉 유형 변환을 가정한다. - ^ Knuth, Donald E.; Merner, Jack N. (June 1961). "ALGOL 60 confidential". Commun. ACM. 4 (6): 268–272. doi:10.1145/366573.366599. S2CID 22215746.
- ^ 크누스 1967, 페이지 613.예를 들면
increment(A[increment(j)])
증가할 것이다j
두 번 - ^ 매클렌넌 1987