какой поток в этой программе? - PullRequest
2 голосов
/ 14 июня 2011

Я наткнулся на часть программы на cobol, которая запутала меня, this - страница, содержащая код, она пытается продемонстрировать, насколько плох ALTER, но в то же время я не понимаю, как проходит программа.

     PERFORM 2100-PROCESS-RECORD THRU 2199-EXIT.
...
 2100-PROCESS-RECORD. 
     GO TO 2110-PROCESS-HEADER.
*
 2110-PROCESS-HEADER.
* code to process a file header
     ALTER 2100-PROCESS-RECORD TO 2120-PROCESS-DETAIL.
     GO TO 2199-EXIT.
*
 2120-PROCESS-DETAIL.
* code to process a detail record 
     GO TO 2199-EXIT.
...
*
 2199-EXIT.
     EXIT.

На мой взгляд, поток выглядит так:

     PERFORM 2100-PROCESS-RECORD THRU 2199-EXIT.
...
 2100-PROCESS-RECORD. 
     GO TO 2110-PROCESS-HEADER.
*
 2110-PROCESS-HEADER.
* code to process a file header
     ALTER 2100-PROCESS-RECORD TO 2120-PROCESS-DETAIL.
     GO TO 2199-EXIT.

 2199-EXIT.
     EXIT.

Если ALTER должен изменить пункт назначения GO-TO, как это может быть полезно, если GO- ТО уже выполнено и программа закрыта?

1 Ответ

5 голосов
/ 14 июня 2011

http://home.swbell.net/mck9/cobol/style/alter.html объясняет это. вы правы для первого выполнения, но при последующих запусках поведение изменяется:

"Когда мы в первый раз выполняем PERFORM, управление проходит через 2110-PROCESS-HEADER. Однако, ALTER в конце этого параграфа изменяет назначение GO TO в 2100-PROCESS-RECORD. В результате, на все последующие исполнения PERFORM, управление не проходит через 2110-PROCESS-HEADER, а вместо этого проходит через 2120-PROCESS-DETAIL.

"Вероятность путаницы очевидна. Измененный GO TO не идет туда, куда он претендует - вместо этого он идет в место, указанное в некотором удаленном фрагменте кода. Чтобы понять, как работает код, вам нужно знать что ALTER присутствует, и вам нужно знать все обстоятельства, которые выполняют ALTER. "

это называется самоизменяющийся код, и его очень сложно понять и отладить. для легкого чтения перед сном я рекомендую http://www.pbm.com/~lindahl/mel.html историю Мел.

в Cobol оператор EXIT не означает «выйти из программы»: http://publib.boulder.ibm.com/infocenter/iadthelp/v6r0/index.jsp?topic=/com.ibm.etools.iseries.langref.doc/evfeb4ls124.htm

...