首页 > 解决方案 > RPGLE(As400)中GOTO和EXSR的重要区别是什么

问题描述

RPGLE中GOTO和EXSR的重要区别是什么

标签: ibm-midrangerpgle

解决方案


这两种操作码都会导致代码的执行跳转到一个过程中的不同点,但是它们还是有一些区别的。 GOTO是两者中较简单的一个,作为无条件跳转命令,本质上是“到这里并开始执行那里的任何东西”。这是编程语言中最古老的命令之一,如今它的使用通常不受欢迎。1970 年代“结构化编程”哲学的目标之一是GOTO用概念上更高的构造替换 s,这些构造可以更好地描述程序员的意图,并且通过阅读它更容易理解该意图。您可以在此处找到这些替换操作代码。

EXSR是执行子程序的命令。虽然 RPG 并未将其列入结构化编程操作,但它旨在实现提高代码清晰度、减少错误和最小化代码重复的相同目标。这就像GOTO你无条件地跳转到一段新的代码,但那段代码是你的过程或程序中的一个命名子例程。无论您只是想更清楚地命名代码段,如果您希望一个段多次执行,从多个地方调用,或者您是否想利用相关的操作代码LEAVESR,这都是有用的,这是一种简单的方法在到达 之前退出子程序ENDSR并返回到您在 . 之后执行的代码部分EXSRGOTO也可以做到这一点,通过使用两个标签,标有TAG操作,但通常不太清楚,你必须维护一个标签列表,以保持你是如何跳来跳去的。

值得注意的是,结构化操作代码可以做的任何事情都可以由 来完成GOTO,但这并不意味着以这种方式编写代码是一个好主意。更高的命令是为了人们的方便而发明的,而不是为了计算机的方便。原则上,它们应该编译成非常相似的机器代码,但在记录程序员的思维过程和意图方面存在巨大差异。

还值得注意的是,RPG 有两种不同级别的子程序,而大多数编程语言只有一种。子例程存在于过程或程序中,更类似于GOTO结构化编程操作。它没有可以传递给它的参数或作用于它的变量。

过程更像是其他编程语言中的函数和子例程。它可以有局部范围的变量(很有用,因此您不必记住手动清除它们),可以传递参数(很有用,因此您不必在主程序中声明尽可能多的临时变量),并且可以返回一个值(变量或数据结构),以便您可以将值传递回主程序。这些都使过程成为更灵活的选择并促进更好的代码重用,但我发现调试它们有一些缺点。只有在过程中调用转储时,像操作这样的 RPG 调试工具DUMP才会正确显示变量的值。这不适用于所有错误都由一个程序范围收集的编码样式*PSSR子程序。您将不得不更多地使用该MONITOR操作或在每个过程中放置​​ a *PSSRwith a 。DUMP此外,虽然 RPG 类似于许多编程语言将错误向上传递到调用过程,但基本的 RPG 语言并没有为您的代码提供引发错误的内置工具,这通常对过程有效地传达故障很有用。我使用了一个ThrowErrorIBM Red Paper 中学到的关于 RPG 异常和错误处理的过程. 如果您正确应用这些技术,它们可以编写出健壮的代码,但它确实使程序比子程序更难编码,特别是对于初学者或简单程序。我建议先掌握子例程和其他结构化编程结构,然后再学习过程。


推荐阅读