Fortran IV数组赋值与DO循环内GOTO处理的技术问询
Fortran IV(Fortran 66)Ackermann函数代码语义疑问
这是一段源自Henry Gordon Rice论文的Fortran IV代码,目标是用O(1)内存计算Ackermann函数,理解过程中遇到两个核心语义问题,先附上相关代码:
带注释原代码
1 INTEGER FUNCTION ACKER(M,N) C Size of VALUE and PLACE tables is one more than LARGEST M EXPECTED (else too long computation) 2 INTEGER VALUE(6), PLACE(6) C Test ofr Zero M 3 IF (M .NE. O) GO TO 6 4 ACKER = N+l 5 RETURN C Non Zero M INITIALIZE FOR ITERATION 6 VALUE = 1 7 PLACE = 0 C ITERATION LOOP. GET NEW VALUE. 8 VALUE = VALUE + 1 9 PLACE = PLACE + 1 10 DO 18 I=1,M 11 IF (PLACE(I) .NE. 1) GO TO 16 C INITIATE NEW LEVEL 12 VALUE(I+1) = VALUE 13 PLACE(I+1) = 0 14 IF (I .EQ. M) GO TO 18 15 GO TO 8 16 IF (PLACE(I) .NE. VALUE(I+1) GO TO 8 17 VALUE(I+1) = VALUE 18 PLACE(I+1)=PLACE(I+1)+1 C CHECK FOR END OF ITERATION 19 IF (PLACE(M+1) .NE. N) GO TO 8 20 ACKER = VALUE 21 RETURN 22 END
无注释代码
1 INTEGER FUNCTION ACKER(M,N) 2 INTEGER VALUE(6), PLACE(6) 3 IF (M .NE. O) GO TO 6 4 ACKER = N+l 5 RETURN 6 VALUE = 1 7 PLACE = 0 8 VALUE = VALUE + 1 9 PLACE = PLACE + 1 10 DO 18 I=1,M 11 IF (PLACE(I) .NE. 1) GO TO 16 12 VALUE(I+1) = VALUE 13 PLACE(I+1) = 0 14 IF (I .EQ. M) GO TO 18 15 GO TO 8 16 IF (PLACE(I) .NE. VALUE(I+1) GO TO 8 17 VALUE(I+1) = VALUE 18 PLACE(I+1)=PLACE(I+1)+1 19 IF (PLACE(M+1) .NE. N) GO TO 8 20 ACKER = VALUE 21 RETURN 22 END
核心疑问
- 对于数组PLACE、VALUE,
PLACE=1、PLACE=PLACE+1这类整体赋值操作的语义是什么?是将数组所有元素设为对应值吗? - DO循环内的GOTO语句跳出循环体后,若后续代码再次进入该循环体,循环变量I会被重置还是使用副本(存在隐藏栈)?
尝试将代码转换为Java时因语义不明无法完成,用g77 -ff66编译也未成功,查阅资料后仍有困惑。
解答
1. 数组整体赋值语义
在Fortran IV(Fortran 66)中,数组的标量赋值和逐元素运算规则明确:
VALUE=1这类标量赋值:会将数组的所有元素都设置为该标量值,等价于逐个给数组的每个元素赋值1。PLACE=PLACE+1这类运算:会对数组的每个元素分别执行加法操作,即数组中每个元素都自增1,等价于手动写一个DO循环遍历数组所有元素并执行PLACE(I) = PLACE(I) + 1。
2. DO循环的跳转与迭代状态
Fortran IV的DO循环是计数型循环,其迭代规则如下:
- 当从循环内部通过GOTO跳出循环体后,当前循环的迭代状态会被终止。
- 若后续代码再次执行到该DO循环的起始行(即代码中的第10行),会重新初始化循环变量I为起始值1,并按照
I=1,M的规则重新开始循环计数,不存在所谓的“隐藏栈”保存之前的I值。
内容的提问来源于stack exchange,提问作者Frédéric Gava
相关产品推荐
相关产品推荐

