计算机编程/程序和函数
不同的编程语言使用不同的术语来表示不同的含义。在不同语言中,相同的事物可能具有不同的名称。程序、过程、函数、子程序、子程序、子查询……这些词都具有非常相似的含义。问题或差异在于它们是否可以独立存在;
我们可以调用一个对象,它执行并执行一个复杂的流程。该对象是否被称为上述列表中的任何一个,取决于它用哪种编程语言编写,是否有人可以调用它,或者它是否必须由另一个程序或列表中的其他名称调用。
在一般的编程理论中,当使用程序的机构可以拥有包含数百万个程序的库,这些程序总共包含数十亿行源代码时,我们希望避免在多个地方重复相同的代码。假设需要更改某些内容。需要向集合添加一条新错误消息。客户编号刚刚从 6 位数字变为 8 位数字。有一个新的货币,例如欧元,需要处理。如果这些内容在每个处理它的程序中都被引用,我们可能需要更新数万个程序来处理更改。但是,如果存在子程序来处理不同的场景,那么当该场景发生变化时,唯一需要更新的是相关的子程序。同样,当我们编写一个新程序时,它需要的许多元素已经存在,例如访问特定文件以获取特定类型的数据,计算库存量。我们可以调用执行该功能的标准子程序,而不是编写多行源代码来执行该功能,并使该代码在数百万个程序中复制。
在某些语言中,需要从调用程序传递参数到被调用程序。辅助程序会导致这些值被更改,然后将控制权返回到主程序。这种架构,即一个程序调用一个辅助程序为其完成专门的工作,实际上可以深入多个级别。互相调用的不同程序可以用多种不同的语言编写。这样做有两个主要原因:将整体功能组织成逻辑上可管理的片段;不同的语言更适合不同类型的功能。
RPG 具有代码部分来处理活动,如文件定义、定义表和数组、输入、输出、与其他系统和程序的通信、定义各种数据结构以及计算。计算部分具有一个主例程和任何数量的子程序,这些子程序可以从主例程和彼此之间调用。
在 RPG 中,如果一段源代码具有定义的起点和终点,并且嵌入在主程序中,则称为子程序。主程序中的某个点调用子程序。控制权转到子程序的开头,然后子程序一直控制,直到它到达终点或过早地遇到子程序主体中的退出语句为止。这是一个例子
Main calculations routine RPG statement RPG statement RPG statement EXSR $TOP RPG statement RPG statement End of main routine
EXSR 命令表示执行子程序。子程序名称可以包含字母、符号和数字,但不能以数字开头。由于编译包含所有在程序中使用的元素的交叉索引,因此习惯在某些类型函数的开头使用特殊字符,以便它们都以交叉索引中的一致位置显示,例如货币符号用于子程序,以及其他一些符号用于输出到打印机。
在任何子程序的开头,最好在注释中放置一个摘要语句或解释 $TOP 子程序的功能,例如处理要打印在报告顶部的内容。
Comments BEGSR RPG statement RPG statement RPG statement EXCPT @PAGE EXCPT @TITLE RPG statement RPG statement EXCPT @HEAD RPG statement RPG statement ENDSR
BEGSR 是子程序开始语句,而 ENDSR 是子程序结束语句。EXCPT 是标识某种类型输出到打印机或类似打印机文件的语句。可以将数据写入日志或其他类似于打印输出的对象,例如一系列行。
当控制权从该程序转移到另一个程序时,该程序由该程序调用,然后该程序调用另一个程序为子程序。子程序包含其他类型的 RPG 内容,例如文件定义、输入输出等。子程序不需要访问任何文件。它可以从调用程序填充的数据结构中获取所有数据。
这些子程序和子程序仅仅是将程序组织成要执行的逻辑块的一种方式。我们可以将它们视为黑盒,它们被输入各种不同的标准信息片段,只是将可预测的结果返回给主程序。因此,当程序需要维护时,我们可以有效地忽略与维护工作无关的程序部分。当我们维护的程序的总源代码、主例程、子程序和子程序内容可能达到数十万行代码时,这一点至关重要。
如果您比较 RPG 程序的实际源代码列表及其在编译时的内容,您可能会发现编译中有很多内容在源代码中没有明确出现。这通常通过两种方式之一实现。
如果使用标准外部描述的对象,例如文件或数据结构,源代码只需要用几行代码指定该对象,即哪个对象以及在该程序中处理该对象所需的更改。在编译时,文件的整个布局,例如表的所有列,都会被调用到要编译的内容中。
另一种方法是,在使用标准子程序或调用标准子程序的代码时,这些代码要复制到数百万个其他程序中,而不是将这些代码包含在数百万个程序的源代码中,而是有一行代码标识要包含在这里的标准代码,以及如果在本程序中,是否要通过其他名称引用其中的任何部分。
很少有其他语言可以嵌入到 RPG 源代码中,例如 SQL/400。RPG 程序可以将控制权转移到其他程序,RPG 将其称为子程序。这些其他程序可以用任何语言编写。根据语言的不同,这些程序需要编写成期望被调用,并且与该握手相关的代码,以及调用程序可以使程序以某种方式运行变得不切实际,而不是以这种方式运行。
不同类型的错误消息及其关联的帮助链接可以根据问题的性质存储在不同的库中。使用该程序的人员可能调用了不存在的记录,尝试获取超出范围的值。一天中的最大小时数是 25 小时,这只有在由于夏令时而更改日期的那一天才会出现。如果有人尝试输入某一天工厂发生的活动,而某位工厂工人的总时间超过 25 小时,这就是输入超出范围的一个例子。程序需要向用户传达问题是什么。部分消息处理可以使用一个子程序,该子程序只知道通过一些引用代码的错误消息。实际上,当前错误消息不会在处理错误消息的子程序中明确引用,因此它可以处理任何不同的错误消息。它唯一需要的参数是定义如何访问特定错误消息及其关联的引用,例如用户与之交互的方式。