CN107562463B - 一种Ada编程语言的子程序规格化定义及调用方法 - Google Patents
一种Ada编程语言的子程序规格化定义及调用方法 Download PDFInfo
- Publication number
- CN107562463B CN107562463B CN201710812573.8A CN201710812573A CN107562463B CN 107562463 B CN107562463 B CN 107562463B CN 201710812573 A CN201710812573 A CN 201710812573A CN 107562463 B CN107562463 B CN 107562463B
- Authority
- CN
- China
- Prior art keywords
- subprogram
- address
- normalized
- type
- normalization
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Landscapes
- Executing Machine-Instructions (AREA)
Abstract
本发明涉及一种Ada编程语言的子程序规格化定义及调用方法,其采用把子程序的多个相同或不同类型的形式参数统一转化为一个形式参数,这个形式参数的类型为地址数组的访问类型,该访问类型相当于指针,该方法使子程序的定义得到统一;在子程序调用时,由于所有子程序使用的是统一的规格化的子程序定义。本发明取得了子程序调用可灵活替换效果,且与具体软件运行平台无关,具有广泛的适用性。
Description
技术领域
本发明涉及软件编程的规格化技术,特别是涉及一种Ada编程语言的子程序规格化定义及调用方法。
背景技术
按照Ada编程语言的标准定义,子程序有函数调用和过程两种形式,函数调用有返回值,过程没有返回值。函数调用和过程都可以包含或不包含形式参数,形式参数的参数方式表达了和实参信息转换的方向:in,in out和 out,方式in是缺省的。
因此,程序员在编程时,不同的程序员会按照各自的喜好来定义子程序的形式,所以子程序的定义没有一个标准的统一形式。
子程序调用是按照其形式进行的,因没有标准的统一形式,所以其调用也是不可互换的,因此子程序调用的灵活性和可替换性受到极大的限制。
综上所述,需要采用一种子程序规格化定义方法解除这种限制,所以本发明提供了一种Ada编程语言的子程序规格化定义方法,且目前并没有发现同本发明类似技术的说明或报道,也尚未收集到国内外类似的资料。
发明内容
本发明的目的是提供一种Ada编程语言的子程序规格化定义及调用方法,通过使子程序的定义得到统一,解决了子程序调用时灵活性和可替换性的限制,并具有广泛的适用性。
本发明提供了一种Ada编程语言的子程序规格化定义及调用方法,其通过一个或多个处理器来执行以下步骤:
a、规格化一个子程序:把规格化前的子程序中的一个或多个相同类型或不同类型的形式参数转化为规格化形式参数;
b、多个子程序的规格化:对于多个子程序,重复所述步骤a,完成所有子程序的规格化;
c、子程序的形式参数的赋值:子程序调用前,把规格化前的每个子程序的每个形式参数的地址按照顺序赋值给一个地址数组,将所述地址数组的地址传递给规格化后的子程序的规格化形式参数;
d、规格化后的子程序调用:对于多个子程序,通过规格化形式参数,对每个子程序按照顺序进行调用;
e、对规格化后的子程序进行替换。
优选地,规格化后的每个子程序仅含有一个规格化形式参数。
优选地,所述规格化形式参数的类型为所述地址数组的访问类型。
优选地,定义的所述地址数组为通用地址数组。
优选地,所述步骤a中,规格化子程序的方法为:
a1:定义地址数组的类型;
a2:定义地址数组的访问类型;定义地址数组变量,其用于存放规格化前的多个子程序的形式参数的地址;
a3:定义带有访问类型的规格化形式参数的子程序访问类型;
a4:定义所述子程序访问类型的数组变量,其用于存放多个子程序的地址。
优选地,所述步骤c中,子程序的形式参数赋值的方法为:
c1:定义强制类型转换函数,将访问子程序的形式参数的类型转换成访问所述转换函数的类型;
c2:子程序包含有转换函数类型的多个形式参数;
c3:将规格化形式参数指向的第一个地址对应的参数传递给子程序的第一形式参数;将规格化形式参数指向的第二个地址对应的参数传递给子程序的第二形式参数,依次进行下去,直至完成子程序的所有的形式参数的赋值。
优选地,所述步骤d中,规格化后的子程序调用方法为:
d1:定义一个调用主程序;
d2:对地址数组变量的各个分量进行初始化;
d3:对子程序访问类型的数组变量进行赋值,将子程序的地址赋值给子程序访问类型的数组变量;
d4:通过循环方式按照顺序对子程序进行调用。
优选地,对规格化后的子程序进行替换的方法是通过改变子程序的地址和子程序的地址数组,子程序调用的位置不变。
与现有技术相比,本发明的有益效果为:(1)子程序调用时,由具有可灵活替换等效果;(2)且本发明与具体软件运行平台无关,因此具有广泛的适用性。
附图说明
图1是子程序规格化前与规格化后的转换示意图;
图2是规格化后的子程序的形式参数赋值示意图;
图3是规格化前与规格化后的子程序调用对比示意图;
图4是规格化后的主程序调用流程图;
图5是规格化前子程序替换示意图;
图6是规格化后子程序替换示意图。
具体实施方式
本发明提供了一种Ada编程语言的子程序规格化定义及调用方法,为使本发明更明显易懂,下面结合附图与具体实施方式对本发明做进一步的说明。
本发明提供的一种Ada编程语言的子程序规格化定义及调用方法,如图 1所示,把规格化前的子程序中n(n的范围大于等于0)个具有相同或不同类型的形式参数转化为一个形式参数,这个形式参数的类型是地址数组的访问类型,使得规格化前的子程序中的n个形式参数在规格化后,各自对应有一个地址。其中,该子程序仅含有这一个形式参数即可。
如图2和图3结合所示,子程序调用前,把规格化前的每个子程序的每个形式参数的地址按照顺序赋值给一个地址数组,把该地址数组的地址传递给规格化后的子程序的形式参数。若对于有m个子程序,每个子程序的地址按照顺序调用。
本发明的Ada编程语言的子程序规格化定义方法可被处理器执行以下相关操作,来实现本发明的规格化定义。其中处理器主要包含定义处理模块、类型转换函数模块和调用处理模块。
其中,定义处理模块接收储存的各个子程序的形式参数,定义处理模块会根据接收到的数据进行相关的定义操作。类型转换函数模块会将定义处理模块输出的所定义的访问类型进行强制转换,以符合Ada语言的要求;在类型转换函数模块中主要通过其内部的转换函数,进行参数传递。通过调用处理模块,利用循环的方式,对各个子程序按照顺序进行调用。
本实施例以定义两个子程序、每个子程序含有三个形式参数来进行示例,具体步骤如下:
(一)计算机程序可被处理器中的定义处理模块执行以下步骤:
(a)定义一个地址数组的类型Addrarray(相当于变量的指针),则有:
type Addrarray is array(Integer range<>)of System.Address;
(b)定义一个地址数组(步骤a所述的Addrarray)的访问类型 Acce_Addrarray(相当于指针的指针),则有:
type Acce_Addrarray is access all Addrarray;
本实施例的定义子程序的个数为两个,则本示例设定初值为2,表示后续会定义两个子程序,m表示子程序的个数,如果有多于2个子程序,更改 m的初值即可,则有:
m:constant:=2;
定义地址数组变量为Ptr,则有:
Ptr:array(1..m)of Acce_Addrarray;
(c)定义一个带有访问类型(步骤b所述的Acce_Addrarray)的形式参数的子程序访问类型(相当于程序的指针),则有:
type Proc_Ptr is access procedure(Para_Ptr:Acce_Addrarray);
(d)定义一个子程序访问类型的数组变量Proc_Ptr_List(实施例中设定数组的范围1..m),则有:
Proc_Ptr_List:array(1..m)of Proc_Ptr;
其中,子程序访问类型的数组变量Proc_Ptr_List是用来存放多个子程序的地址;地址数组变量Ptr是用来存放多个子程序的形式参数的地址。
(二)为了本发明符合Ada语言语法要求,则通过类型转换函数模块先定义两个强制类型转换函数,例如function Atoint32ptr和function Atofloat32ptr。其中,functionAtoint32ptr转换函数是把访问地址类型转换成访问Integer类型;functionAtofloat32ptr转换函数是把访问地址类型转换成访问float类型。本实施例定义了两个带有地址访问类型的形式参数的子程序。
所以计算机程序可被处理器中的类型转换函数模块执行以下操作:
procedure Proc_1(Para_Ptr:Acce_Addrarray);
procedure Proc_2(Para_Ptr:Acce_Addrarray);
其中,子程序Proc_1完成两个Integer类型的加法;子程序Proc_2完成两个float类型的加法。
例如,子程序Proc_1实际含有Integer类型的形式参数A1、B1、C1(形式参数的类型和数量可不限于本实施例),通过访问类型的形参Para_Ptr传递信息。该过程主要是通过数据传递模块进行实现的。
参数传递过程中,对Proc_1的处理的程序设计具体为:
上述Proc_1的参数传递过程中,(Atoint32ptr(Para_Ptr.all(0))).all是把形式参数Para_Ptr指向的第1个地址对应的参数传递给形式参数A1;
(Atoint32ptr(Para_Ptr.all(1))).all是把形式参数Para_Ptr指向的第2个地址对应的参数传递给形式参数B1;
(Atoint32ptr(Para_Ptr.all(2))).all是把形式参数Para_Ptr指向的第3个地址对应的参数传递给形式参数C1;
C1:=A1+B1是指子程序Proc_1的功能是把A1和B1的和赋值给C1;
(Para_Ptr.all(2)).all:=C1是指把C1的值返回给形式参数Para_Ptr指向的第3个地址对应的参数。
同样,对于定义子程序Proc_2,实际含有float类型的形式参数A2、B2、 C2(形式参数的类型和数量不限于本实施例)。
参数传递过程中,对Proc_2的处理的程序设计具体为:
上述Proc_2的参数传递过程中,(Atofloat32ptr(Para_Ptr.all(0))).al是把形式参数Para_Ptr指向的第1个地址对应的参数传递给形式参数A2;
其中,(Atofloat32ptr(Para_Ptr.all(1))).all是把形式参数Para_Ptr指向的第2个地址对应的参数传递给形式参数B2;
其中,(Atofloat32ptr(Para_Ptr.all(2))).all是把形式参数Para_Ptr指向的第3个地址对应的参数传递给形式参数C2;
C2:=A2+B2是指Proc_2的功能是把A2和B2的和赋值给C2;
其中,(Para_Ptr.all(2)).all:=C2是指把C2的值返回给形式参数Para_Ptr 指向的第3个地址对应的参数。
(三)计算机程序可被处理器中的调用处理模块执行以下操作:
(e)定义一种可灵活替换的调用方法
为了说明规格化后的子程序调用,先定义一个调用主程序main,来调用子程序Proc_1和子程序Proc_2,主程序调用流程图如图4所示。
主程序调用流程具体为:
e1:定义调用主程序main;
e2:对数组变量Ptr的第1个分量Ptr(1)进行初始化;
e3:对数组变量Ptr的第2个分量Ptr(2)进行初始化;
e4:对子程序访问类型的数组变量Proc_Ptr_List进行赋值,将子程序 Proc_1和子程序Proc_2的地址赋给数组变量Proc_Ptr_List;
e5:通过循环的方式来执行子程序顺序调用。
其中,定义的一个调用主程序main来调用子程序Proc_1和子程序 Proc_2,具体执行程序为:
在步骤e2中,给所定义的数组变量Ptr的第1个分量Ptr(1)初始化一个地址,这个地址指向一个有3个分量的地址数组类型Addrarray;其中,(0..2) 表示有3个分量;(本例中3个分量与定义的Proc_1实际有3个形式参数相对应)。其中,步骤e2相应的执行程序为:
Ptr(1):=new Addrarray(0..2);
其实现的作用等价于:
Ptr(1).all(0):=A1'Address;
Ptr(1).all(1):=B1'Address;
Ptr(1).all(2):=C1'Address;
在步骤e3中,给所定义的数组变量Ptr的第2个分量Ptr(2)初始化一个地址,这个地址指向一个有3个分量的地址数组类型Addrarray;其中,(0..2) 表示有3个分量;(本例中3个分量与定义的Proc_2实际有3个形式参数相对应)。其中,步骤e3相应的执行程序为:
Ptr(2):=new Addrarray(0..2);
其实现的作用等价于:
Ptr(2).all(0):=A2'Address;
Ptr(2).all(1):=B2'Address;
Ptr(2).all(2):=C2'Address;
在步骤e4中,给所定义的子程序访问类型的数组变量Proc_Ptr_List进行赋值,将子程序Proc_1和子程序Proc_2的地址赋给子程序访问类型的数组变量Proc_Ptr_List。其中,步骤e4相应的执行程序为:
Proc_Ptr_List:=(Proc_1'access,Proc_2'access);
其中,Proc_1'access表示取子程序Proc_1的地址;Proc_2'access表示取子程序Proc_2的地址。
在步骤e5中,由于所定义的子程序访问类型的数组变量Proc_Ptr_List 是用来存放多个子程序的地址,以及所定义的地址数组变量Ptr是用来存放多个子程序的形式参数的地址,所以通过循环的方式来执行子程序顺序调用,且执行程序为:
其中,Proc_Ptr_List(I).all(Ptr(I))表示调用Proc_Ptr_List(I)指向的子程序,这个子程序的形式参数是Ptr(I);for I in 1..m loop表示循环执行;本实施例中定义了m个子程序(m初值是2),所以循环范围是1..m。
当进行子程序替换时,例如把Proc_2替换成Proc_3。
如图5所示,规格化前的子程序替换方式必须要通过更改软件源程序实现,把原来调用Proc_2的代码替换成调用Proc_3的代码。
如图6所示,本发明的规格化后子程序替换方式为:先定义一个新的子程序Proc_3,使子程序Proc_3完成两个Integer类型的乘法。子程序调用只需要更改变量Proc_Ptr_Lis(2)和Ptr(2)的值,而更改变量的值不用更改软件源程序。
具体执行的程序如下:
综上所述,本发明的一种Ada编程语言的子程序规格化定义及调用方法。规格化后的子程序均可灵活的被替换,完全不受子程序形参类型的限制。
尽管本发明的内容已经通过上述优选实施例作了详细介绍,但应当认识到上述的描述不应被认为是对本发明的限制。在本领域技术人员阅读了上述内容后,对于本发明的多种修改和替代都将是显而易见的。因此,本发明的保护范围应由所附的权利要求来限定。
Claims (1)
1.一种Ada编程语言的子程序规格化定义及调用方法,其特征在于,其通过一个或多个处理器来执行以下步骤:
a、规格化一个子程序:把规格化前的子程序中的一个或多个相同类型或不同类型的形式参数转化为规格化形式参数;
b、多个子程序的规格化:对于多个子程序,重复所述步骤a,完成所有子程序的规格化;
c、子程序的形式参数的赋值:子程序调用前,把规格化前的每个子程序的每个形式参数的地址按照顺序赋值给一个地址数组,将所述地址数组的地址传递给规格化后的子程序的规格化形式参数;
d、规格化后的子程序调用:对于多个子程序,通过规格化形式参数,对每个子程序按照顺序进行调用;
e、对规格化后的子程序进行替换;
规格化后的每个子程序仅含有一个规格化形式参数;
所述规格化形式参数的类型为所述地址数组的访问类型;
定义的所述地址数组为通用地址数组;
所述步骤a中,规格化子程序的方法为:
a1:定义地址数组的类型;
a2:定义地址数组的访问类型;定义地址数组变量,其用于存放规格化前的多个子程序的形式参数的地址;
a3:定义带有访问类型的规格化形式参数的子程序访问类型;
a4:定义所述子程序访问类型的数组变量,其用于存放多个子程序的地址;
所述步骤c中,子程序的形式参数赋值的方法为:
c1:定义强制类型转换函数,将访问子程序的形式参数的类型转换成访问所述转换函数的类型;
c2:子程序包含有转换函数类型的多个形式参数;
c3:将规格化形式参数指向的第一个地址对应的参数传递给子程序的第一形式参数;将规格化形式参数指向的第二个地址对应的参数传递给子程序的第二形式参数,依次进行下去,直至完成子程序的所有的形式参数的赋值;所述步骤d中,规格化后的子程序调用方法为:
d1:定义一个调用主程序;
d2:对地址数组变量的各个分量进行初始化;
d3:对子程序访问类型的数组变量进行赋值,将子程序的地址赋值给子程序访问类型的数组变量;
d4:通过循环方式按照顺序对子程序进行调用;
对规格化后的子程序进行替换的方法是通过改变子程序的地址和子程序的地址数组,子程序调用的位置不变。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710812573.8A CN107562463B (zh) | 2017-09-11 | 2017-09-11 | 一种Ada编程语言的子程序规格化定义及调用方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710812573.8A CN107562463B (zh) | 2017-09-11 | 2017-09-11 | 一种Ada编程语言的子程序规格化定义及调用方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107562463A CN107562463A (zh) | 2018-01-09 |
CN107562463B true CN107562463B (zh) | 2020-10-27 |
Family
ID=60979566
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710812573.8A Active CN107562463B (zh) | 2017-09-11 | 2017-09-11 | 一种Ada编程语言的子程序规格化定义及调用方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107562463B (zh) |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1115060A (zh) * | 1995-04-12 | 1996-01-17 | 中国人民解放军总参谋部第六十一研究所 | 隶属云产生方法、隶属云发生器与隶属云控制装置 |
CN101617293A (zh) * | 2007-02-27 | 2009-12-30 | 富士通株式会社 | 模组生成装置、模组生成方法、模组生成程序以及记录有该程序的记录介质 |
CN101986278A (zh) * | 2010-10-29 | 2011-03-16 | 中国计量科学研究院 | 一种电子类设备的自动测试方法及系统 |
CN103501326A (zh) * | 2013-09-26 | 2014-01-08 | 中国银行股份有限公司 | 基于中间件的数据处理方法及系统 |
CN105144006A (zh) * | 2013-04-25 | 2015-12-09 | 西门子公司 | 具有改变子程序的可行性的数字式控制装置 |
CN105210044A (zh) * | 2013-05-15 | 2015-12-30 | 三菱电机株式会社 | 程序分析装置、程序分析方法及程序分析程序 |
-
2017
- 2017-09-11 CN CN201710812573.8A patent/CN107562463B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1115060A (zh) * | 1995-04-12 | 1996-01-17 | 中国人民解放军总参谋部第六十一研究所 | 隶属云产生方法、隶属云发生器与隶属云控制装置 |
CN101617293A (zh) * | 2007-02-27 | 2009-12-30 | 富士通株式会社 | 模组生成装置、模组生成方法、模组生成程序以及记录有该程序的记录介质 |
CN101986278A (zh) * | 2010-10-29 | 2011-03-16 | 中国计量科学研究院 | 一种电子类设备的自动测试方法及系统 |
CN105144006A (zh) * | 2013-04-25 | 2015-12-09 | 西门子公司 | 具有改变子程序的可行性的数字式控制装置 |
CN105210044A (zh) * | 2013-05-15 | 2015-12-30 | 三菱电机株式会社 | 程序分析装置、程序分析方法及程序分析程序 |
CN103501326A (zh) * | 2013-09-26 | 2014-01-08 | 中国银行股份有限公司 | 基于中间件的数据处理方法及系统 |
Non-Patent Citations (1)
Title |
---|
BASIC语言调用机器码子程序的一个方法;权恒通;《微型机与应用》;19931231;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN107562463A (zh) | 2018-01-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8181155B2 (en) | Unified expression and location framework | |
US7069548B2 (en) | Inter-procedure global register allocation method | |
US20070028222A1 (en) | Free/outer variable capture | |
CN111796831B (zh) | 一种多芯片兼容的编译方法和装置 | |
JPH02272627A (ja) | デイジタル・コンピユータ・システムとその手続呼び出し方法 | |
JPH0922362A (ja) | コンピュータシステムおよびコンピュータ制御方法 | |
JP2006092544A (ja) | プリオペレーティングシステム環境におけるモジュールの動的リンク | |
US8464236B2 (en) | Data consistency in data processing systems | |
US8752056B2 (en) | Running native code across single or multi-core hybrid processor achitecture | |
US20110252409A1 (en) | Methods and systems to implement non-abi conforming features across unseen interfaces | |
US20060048095A1 (en) | Local type alias inference system and method | |
CN110865814B (zh) | 一种支持异构计算核架构的编译器实现方法和系统 | |
US7647580B2 (en) | General programming language support for nullable types | |
US20160357533A1 (en) | Generating code in statically typed programming languages for dynamically typed array-based language | |
US20090144709A1 (en) | Reducing stack space consumption via head-call optimization | |
US20070050168A1 (en) | Type extensions | |
US10346144B2 (en) | Methods and apparatus to map single static assignment instructions onto a data flow graph in a data flow architecture | |
US10496433B2 (en) | Modification of context saving functions | |
CN107562463B (zh) | 一种Ada编程语言的子程序规格化定义及调用方法 | |
WO2022048191A1 (en) | Method and apparatus for reusable and relative indexed register resource allocation in function calls | |
CN115098158A (zh) | Sdk打包方法和装置、计算机设备及存储介质 | |
US11435989B2 (en) | Thread-local return structure for asynchronous state machine | |
CN114072762A (zh) | 将源代码编译和执行为服务 | |
CN113918290A (zh) | 一种api调用方法以及装置 | |
US20120060011A1 (en) | Allocating register halves independently |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |