RPGLE(As400)中GOTO和EXSR的重要区别是什么
What are the important difference between GOTO and EXSR in RPGLE (As400)
RPGLE中GOTO和EXSR的重要区别是什么
这两种操作代码都会导致代码的执行跳转到过程中的不同点,但它们有一些区别。 GOTO
是两者中较简单的一个,是无条件跳转命令,本质上是“转到此处并开始执行那里的任何内容”。这是编程语言中最古老的命令之一,如今人们通常不赞成使用它。 1970 年代“结构化编程”哲学的目标之一是用概念上更高的构造替换 GOTO
s,这些构造更好地描述程序员的意图是什么,并且通过阅读它更容易理解该意图。您可以在 here.
中找到这些替换操作代码
EXSR
是执行子程序的命令。虽然 RPG 没有将它列在结构化编程操作中,但它旨在实现提高代码清晰度、减少错误和最小化代码重复的相同目标。它就像一个 GOTO
,因为你无条件地跳转到一个新的代码段,但是那段代码是你的过程或程序中的一个命名子例程。无论你只是想更清楚地命名一段代码,如果你想让一段代码执行多次,从多个地方被调用,或者你是否想利用相关的操作代码LEAVESR
,这都是有用的在到达 ENDSR
和 return 到您在 EXSR
之后执行的代码部分之前,这是一种退出子例程的简单方法。 GOTO
也可以做到这一点,通过使用两个标签,用 TAG
操作标记,但通常不太清楚,你必须维护一个标签列表来保持你是如何跳来跳去的。
值得注意的是,结构化操作代码可以做的任何都可以由GOTO
完成,但这并不是一个好主意编码方式。发明高级命令是为了方便人们,而不是为了方便计算机。原则上,它们应该编译成非常相似的机器代码,但在记录程序员的思维过程和意图方面存在巨大差异。
还值得注意的是,RPG 有两种不同级别的子程序,而大多数编程语言只有一种。 子例程 存在于过程或程序中,更类似于 GOTO
或结构化编程操作。它没有可以传递给它的参数或范围内的变量。
过程 更像是您在其他编程语言中可以找到的函数和子例程。它可以有局部范围的变量(有用所以你不必记住手动清除它们),它可以传递参数(有用所以你不必在主程序中声明那么多临时变量),并且它可以 return 一个值(一个变量或一个数据结构),这样你就可以将一个值传回你的主程序。这些都使过程成为更灵活的选择并促进更好的代码重用,但我发现调试它们有一些缺点。如果在过程中调用转储,RPG 调试工具如 DUMP
操作将仅正确显示变量值。这不适用于所有错误都由一个 program-wide *PSSR
子例程收集的编码风格。您将不得不更多地使用 MONITOR
操作或在每个过程中放置 *PSSR
和 DUMP
。此外,虽然 RPG 类似于许多编程语言将错误向上传递到调用过程的调用堆栈,但基本的 RPG 语言没有为您的代码提供 built-in 设施来抛出错误,这通常对过程通信失败很有用有效。我使用从 IBM Red Paper on RPG Exception and Error Handling 中学到的 ThrowError
过程。如果正确应用这些技术,它们可以生成健壮的代码,但它确实使过程比子例程更难编码,尤其是对于初学者或简单程序。我建议首先掌握子例程和其他结构化编程构造,然后再学习过程。
正如我在对他的回答的评论中提到的,@Mike 的回答非常好,但让我提供一个反对的结论。现在学习 RPG 的大多数人已经知道如何使用与 ILE 程序非常相似的结构进行编程。 RPG 的子程序和 GOTO 是过去时代的遗物。不要尝试使用任何一个。它们完全依赖全局变量来与程序的其余部分进行通信。这种做法会降低代码的可重用性和可读性,因为程序中任何地方的任何例程都可能导致任何给定子例程失败。像 *INZSR 和 *PSSR 这样的神奇子程序是编译器一时兴起调用的,是的,我知道它们何时被调用,但我没有明确地调用它们,充其量使错误处理变得神秘。
最佳做法是使用 **free
编写现代 RPG 代码,省去循环,仅使用 sub-procedures 进行代码重用。神奇的子程序甚至不能在这个环境中工作,因为循环没有编译进去。Sub-procedures 可以做子程序可以做的一切,甚至更多。它们提供局部变量、静态变量,并且如果需要可以使用全局变量。它们有参数和 return 值。它们通过消除对全局变量的需要使程序更加模块化,这也使它们更具可读性,因为它们不再需要受到程序其他部分代码的影响。
所以不,如果可以的话,请不要使用 EXSR 或 GOTO。更喜欢 CALLP,你的程序会像你习惯的那样工作,你不必担心旧的过时的操作代码,除非你在现有程序中遇到它们。
RPGLE中GOTO和EXSR的重要区别是什么
这两种操作代码都会导致代码的执行跳转到过程中的不同点,但它们有一些区别。 GOTO
是两者中较简单的一个,是无条件跳转命令,本质上是“转到此处并开始执行那里的任何内容”。这是编程语言中最古老的命令之一,如今人们通常不赞成使用它。 1970 年代“结构化编程”哲学的目标之一是用概念上更高的构造替换 GOTO
s,这些构造更好地描述程序员的意图是什么,并且通过阅读它更容易理解该意图。您可以在 here.
EXSR
是执行子程序的命令。虽然 RPG 没有将它列在结构化编程操作中,但它旨在实现提高代码清晰度、减少错误和最小化代码重复的相同目标。它就像一个 GOTO
,因为你无条件地跳转到一个新的代码段,但是那段代码是你的过程或程序中的一个命名子例程。无论你只是想更清楚地命名一段代码,如果你想让一段代码执行多次,从多个地方被调用,或者你是否想利用相关的操作代码LEAVESR
,这都是有用的在到达 ENDSR
和 return 到您在 EXSR
之后执行的代码部分之前,这是一种退出子例程的简单方法。 GOTO
也可以做到这一点,通过使用两个标签,用 TAG
操作标记,但通常不太清楚,你必须维护一个标签列表来保持你是如何跳来跳去的。
值得注意的是,结构化操作代码可以做的任何都可以由GOTO
完成,但这并不是一个好主意编码方式。发明高级命令是为了方便人们,而不是为了方便计算机。原则上,它们应该编译成非常相似的机器代码,但在记录程序员的思维过程和意图方面存在巨大差异。
还值得注意的是,RPG 有两种不同级别的子程序,而大多数编程语言只有一种。 子例程 存在于过程或程序中,更类似于 GOTO
或结构化编程操作。它没有可以传递给它的参数或范围内的变量。
过程 更像是您在其他编程语言中可以找到的函数和子例程。它可以有局部范围的变量(有用所以你不必记住手动清除它们),它可以传递参数(有用所以你不必在主程序中声明那么多临时变量),并且它可以 return 一个值(一个变量或一个数据结构),这样你就可以将一个值传回你的主程序。这些都使过程成为更灵活的选择并促进更好的代码重用,但我发现调试它们有一些缺点。如果在过程中调用转储,RPG 调试工具如 DUMP
操作将仅正确显示变量值。这不适用于所有错误都由一个 program-wide *PSSR
子例程收集的编码风格。您将不得不更多地使用 MONITOR
操作或在每个过程中放置 *PSSR
和 DUMP
。此外,虽然 RPG 类似于许多编程语言将错误向上传递到调用过程的调用堆栈,但基本的 RPG 语言没有为您的代码提供 built-in 设施来抛出错误,这通常对过程通信失败很有用有效。我使用从 IBM Red Paper on RPG Exception and Error Handling 中学到的 ThrowError
过程。如果正确应用这些技术,它们可以生成健壮的代码,但它确实使过程比子例程更难编码,尤其是对于初学者或简单程序。我建议首先掌握子例程和其他结构化编程构造,然后再学习过程。
正如我在对他的回答的评论中提到的,@Mike 的回答非常好,但让我提供一个反对的结论。现在学习 RPG 的大多数人已经知道如何使用与 ILE 程序非常相似的结构进行编程。 RPG 的子程序和 GOTO 是过去时代的遗物。不要尝试使用任何一个。它们完全依赖全局变量来与程序的其余部分进行通信。这种做法会降低代码的可重用性和可读性,因为程序中任何地方的任何例程都可能导致任何给定子例程失败。像 *INZSR 和 *PSSR 这样的神奇子程序是编译器一时兴起调用的,是的,我知道它们何时被调用,但我没有明确地调用它们,充其量使错误处理变得神秘。
最佳做法是使用 **free
编写现代 RPG 代码,省去循环,仅使用 sub-procedures 进行代码重用。神奇的子程序甚至不能在这个环境中工作,因为循环没有编译进去。Sub-procedures 可以做子程序可以做的一切,甚至更多。它们提供局部变量、静态变量,并且如果需要可以使用全局变量。它们有参数和 return 值。它们通过消除对全局变量的需要使程序更加模块化,这也使它们更具可读性,因为它们不再需要受到程序其他部分代码的影响。
所以不,如果可以的话,请不要使用 EXSR 或 GOTO。更喜欢 CALLP,你的程序会像你习惯的那样工作,你不必担心旧的过时的操作代码,除非你在现有程序中遇到它们。