首页> 中国专利> 一种基于C语言的语法扩展方法、装置及终端设备

一种基于C语言的语法扩展方法、装置及终端设备

摘要

本发明适用于计算机技术领域,提供了一种基于C语言的语法扩展方法,应用于数据流模型。基于C语言的语法扩展方法包括:根据数据流模型,扩展C语言中的参数列表内容,获得初始程序;标记初始程序中的数据流函数;根据数据流函数选择初始程序的编译方式,对初始程序进行编译。通过本发明能够解决现有技术中C语言不兼容数据流模型的编程,而使得数据流模型的适用范围小,不具备良好的跨平台特性的问题。

著录项

  • 公开/公告号CN109358846A

    专利类型发明专利

  • 公开/公告日2019-02-19

    原文格式PDF

  • 申请/专利权人 深圳大学;

    申请/专利号CN201811093285.2

  • 发明设计人 罗秋明;张靖;

    申请日2018-09-19

  • 分类号

  • 代理机构深圳市恒申知识产权事务所(普通合伙);

  • 代理人袁文英

  • 地址 518060 广东省深圳市南山区南海大道3688号

  • 入库时间 2024-02-19 06:52:35

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-09-27

    授权

    授权

  • 2019-03-15

    实质审查的生效 IPC(主分类):G06F8/30 申请日:20180919

    实质审查的生效

  • 2019-02-19

    公开

    公开

说明书

技术领域

本发明涉及计算机领域,尤其涉及一种基于C语言的语法扩展方法、装置及终端设备。

背景技术

目前的处理器的开发主要向多核处理器的方向发展,大型分布式系统也越来越普遍。传统上程序设计采用顺序执行命令的结构进行编程,在该模式下数据往往是“静态“的,执行程序时将不断的对数据进行存取操作,使得程序对于多核处理器以及大型分布式系统的支持不是特别好。而基于数据流模型的数据流编程强调以数据为驱动动力,明确定义输入以及输出的连接操作,不采用命令的方式,每当数据准备好即输入有效,相关操作就会立即执行,因此数据流编程的本质是并行的,适于运行在多核处理器以及大型分布式系统。

然而,作为通用计算机编程语言的C语言为控制流语言,语句按照出现在程序中的顺序执行,以命令的方式为主要驱动,并不兼容数据流编程,因此数据流模型的适用范围小,不具备良好的跨平台特性。

发明内容

本发明的主要目的在于提出一种基于C语言的语法扩展方法、装置及终端设备,以解决现有技术中C语言不兼容数据流编程而使得数据流模型的适用范围小,不具备良好的跨平台特性的问题。

为实现上述目的,本发明实施例第一方面提供一种基于C语言的语法扩展方法,应用于数据流模型,所述基于C语言的语法扩展方法包括:

根据所述数据流模型,扩展C语言中的参数列表内容,获得初始程序;

标记所述初始程序中的数据流函数,获得参数表达式的输入数据条件和输出数据条件;

根据所述数据流函数选择所述初始程序的编译方式,对所述初始程序进行编译。

结合本发明第一方面,本发明第一方面的第一实施方式中,所述标记所述初始程序中的数据流函数包括:

通过pragma指令标注所述初始程序的代码段落,进行编译制导,并判断所述代码段落是否符合所述数据流函数的编译方式;

若所述代码段落符合所述数据流函数的编译方式,则所述代码段落产生所述数据流函数;

若所述代码段落不符合所述数据流函数的编译方式,则所述代码段落不产生所述数据流函数。

结合本发明第一方面,本发明第一方面的第二实施方式中,所述标记所述初始程序中数据流函数还包括:

通过在参数列表中加入分割符号,分割所述参数列表中的参数表达式,并判断所述参数表达式是否符合所述数据流函数的编译方式;

若所述参数表达式符合所述数据流函数的编译方式,则所述参数表达式产生所述数据流函数;

若所述参数表达式不符合所述数据流函数的编译方式,则所述参数表达式不产生所述数据流函数。

结合本发明第一方面,本发明第一方面的第三实施方式中,所述根据所述数据流函数选择所述初始程序的编译方式,对所述初始程序进行编译包括:

根据所述数据流函数生成函数执行顺序的有向图,并根据所述有向图对所述初始程序进行编译。

结合本发明第一方面的第三实施方式,本发明第一方面的第四实施方式中,所述根据所述数据流函数生成函数执行顺序的有向图包括:

设置函数集合、已扫描函数集合和已装配函数集合;

遍历所述初始程序中的数据流函数,并将所述数据流函数放入所述函数集合中;

遍历所述函数集合,对每一个所述函数集合中的数据流函数,构造激活输入条件数据和输出条件数据,并将已经构造激活的数据流函数添加到所述已扫描函数集合;

遍历所述已扫描函数集合,在具有输入输出条件数据关系的两个数据流函数之间构造有向连接,并将构造了全部输入的有向连接的数据流函数添加到所述已装配函数集合;

所述已装配函数集合中的元素数量等于所述初始程序中数据流函数的数量时,完成所述有向图;

所述已装配函数集合中的元素不等于所述初始程序中数据流函数的个数时,提示编译错误。

结合本发明第一方面的第四实施方式,本发明第一方面的第五实施方式中,所述在具有输入输出条件数据关系的两个数据流函数之间构造有向连接,并将构造了全部输入的有向连接的数据流函数添加到所述已装配函数集合包括:

将所述已扫描函数集合的一个数据流函数作为第一数据流函数,将在所述已扫描函数集合中的另一个数据流函数作为第二数据流函数;

所述第一数据流函数的输出条件数据,为所述第二数据流函数的输入条件数据时,构造所述第一数据流函数的输出条件数据到所述第二数据流函数的输入条件数据的有向连接;

所述第二数据流函数的输出条件数据,为所述第一数据流函数的输入条件数据时,构造所述第二数据流函数的输出条件数据到所述第一数据流函数的输入条件数据的有向连接;

所述第一数据流函数或所述第二数据流函数的所有输入条件数据均与对应的输出条件数据构造了有向连接时,将所述第一数据流函数或所述第二数据流函数添加到所述已装配函数集合。

本发明实施例第二方面提供了一种基于C语言的语法扩展装置,应用于数据流模型,所述基于C语言的语法扩展装置包括:

编程模块,用于根据所述数据流模型,扩展C语言中的参数列表内容,获得初始程序;

选择标记模块,用于标记所述初始程序中的数据流函数,获得参数表达式的输入数据条件和输出数据条件;

编译模块,用于根据所述数据流函数选择所述初始程序的编译方式,对所述初始程序进行编译。

结合本发明第二方面,本发明第二方面的第一实施方式中,所述选择模块包括第一标注单元;

所述第一标注单元,用于通过pragma指令标注所述初始程序的代码段落,进行编译制导,并判断所述代码段落是否符合所述数据流函数的编译方式;

若所述代码段落符合所述数据流函数的编译方式,则所述代码段落产生所述数据流函数;

若所述代码段落不符合所述数据流函数的编译方式,则所述代码段落不产生所述数据流函数。

本发明实施例的第三方面提供了一种终端设备,包括存储器、处理器以及存储在上述存储器中并可在上述处理器上运行的计算机程序,上述处理器执行上述计算机程序时实现如上第一方面所提供的基于C语言的语法扩展方法的步骤。

本发明实施例的第四方面提供了一种计算机可读存储介质,上述计算机可读存储介质存储有计算机程序,上述计算机程序被处理器执行时实现如上第一方面所提供的基于C语言的语法扩展方法的步骤。

本发明实施例所提供的基于C语言的语法扩展方法,基于标准的C语言,根据数据流模型扩展其参数表达式,获得初始程序,同时生成函数执行顺序的有向图,以使该数据流模型在经过C语言扩展后能够进行编译,最终使得数据流模型能够广泛应用于各平台的多核处理器中。

附图说明

图1为本发明实施例一所提供的基于C语言的语法扩展方法的实现流程示意图;

图2为本发明实施例二所提供的基于C语言的语法扩展方法的实现流程示意图;

图3为本发明实施例二提供的函数执行顺序的有向图;

图4为本发明实施例三提供的数据流模型示意图;

图5为本发明实施例三提供的函数执行顺序的有向图;

图6为本发明实施例四所提供的基于C语言的语法扩展装置的结构意图。

本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。

在本文中,使用用于表示元件的诸如“模块”、“部件”或“单元”的后缀仅为了有利于本发明的说明,其本身并没有特定的意义。因此,"模块"与"部件"可以混合地使用。

在后续的描述中,发明实施例序号仅仅为了描述,不代表实施例的优劣。

实施例一

如图1所示,本发明实施例提供了一种基于C语言的语法扩展方法,使用了C语言的语言标准、语言组成,但扩展了其语言组成内容,并提供了一种编译方式,将其应用于数据流模型时,能够使数据流模型在多种计算机平台中进行编译,从而应用于各平台的多核处理器中。所述基于C语言的语法扩展方法包括:

S101、根据所述数据流模型,扩展C语言中的参数列表内容,获得初始程序。

在上述步骤S101中,由于C语言中的函数语法要素包括函数名,参数列表,以及函数体,又参数列表中包括多个参数表达式,则参数列表中的内容为参数表达式,其中,参数表达式可以是一种表达式,也可以为一个参数,在C语言中,其采用逗号进行分隔。例如:

fun1(type1arg1,type2arg2,…,typen argn)

{

函数体

}

其中,type和arg分别表示参数列表中参数表达式的类型及名称。

在具体应用中,根据所述数据流模型,扩展C语言中的参数列表内容,获得初始程序可以为:以C语言为初始程序的编程基础,将数据流模型中的输入数据写入参数表达式中,将数据流模型的函数表达式写入函数体中,获得初始程序。

在具体应用中,当数据流模型中包括多个输入数据或函数表达式时,建立多个上述的以C语言为基础的初始程序。

S102、标记所述初始程序中的数据流函数,获得参数表达式的输入数据条件和输出数据条件。

在上述步骤S102中,由于C语言是一种控制流语言,并不兼容数据流编程,因此在根据数据流模型,扩展C语言中的参数列表内容后编程获得的初始程序中,存在数据流函数,数据流函数具有输入条件数据和输出条件数据。

在具体应用中,区分初始程序中的数据流函数和控制流函数的主要依据是两者的编译方法;其中,控制流函数的编译方法是按照出现在程序中的顺序执行,以命令的方式为主要驱动;数据流函数的编译方法是通过数据驱动的方式执行,将需要处理的数据分配到各个核上,将数据的计算与通信相分离,通过任务调度与分配,利用软件流水的并行特性来充分的挖掘流程序中潜在的并行性,使各个核之间负载均衡;当初始程序中存在数据流函数,则能够基于该数据流函数,获得参数表达式的输入数据条件和输出数据条件。

在一个实施例中,所述标记所述初始程序中的数据流函数包括:

通过pragma指令标注所述初始程序的代码段落,进行编译制导,并判断所述代码段落是否符合所述数据流函数的编译方式;

若所述代码段落符合所述数据流函数的编译方式,则所述代码段落产生所述数据流函数;

若所述代码段落不符合所述数据流函数的编译方式,则所述代码段落不产生所述数据流函数。

在具体应用中,采用添加新的关键字pragma dataflow,用该关键字标注段落来进行编译制导。以确定该段代码是否采用数据流函数的方式编译。例如:

#pragma dataflow

{

dfunX(type1arg1,type2arg2,…,typen argn;Dtype1arg1,Dtype2arg2,…Dtypek argk;DOtype data1,DOtype data2,…,DOtype dataL)

}

其中type arg表示C语言函数参数类型及名称;Dtype arg表示激活该任务所需的数据条件,DOtype arg表示该任务将产生的新的数据流准备好标志或任务数据。具有相关的特殊语义动作可称为数据流域,则在此段内的函数为数据流函数,而在数据流域之外的函数为普通的C语言函数。

在一个实施例中,所述标记所述初始程序中的数据流函数还包括:

通过在参数列表中加入分割符号,分割所述参数列表中的参数表达式,并判断所述参数表达式是否符合所述数据流函数的编译方式;

若所述参数表达式符合所述数据流函数的编译方式,则所述参数表达式产生所述数据流函数;

若所述参数表达式不符合所述数据流函数的编译方式,则所述参数表达式不产生所述数据流函数。

在具体应用中,分割符号为分号、顿号、冒号或加号等非C函数参数表达式中的符号。扩展后的参数表达式的内容无法在原C语言中进行编译,基于C语言所扩展后的初始程序,具有数据流的编译方式和函数条件。例如:

dfunX(type1arg1,type2arg2,…,typen argn;Dtype1arg1,Dtype2arg2,…Dtypek argk;DOtype data1,DOtype data2,…,DOtype dataL)

其中type arg表示C语言函数参数类型及名称;Dtype arg表示激活该任务所需的数据条件,DOtype arg表示该任务将产生的新的数据流准备好标志。当识别到上述的数据条件和标志,则此函数为数据流函数。

S103、根据所述数据流函数选择所述初始程序的编译方式,对所述初始程序进行编译。

在上述步骤S103中,在根据所述数据流模型,扩展C语言中的参数列表内容后,获得的初始程序,并不能根据C语言的编译方法进行编译,而需要采用数据流函数的编译方式进行编译。

在本发明实施例中,数据流函数的编译方式,主要是根据其所需的输入数据条件匹配输出数据条件。

本发明实施例提供了一种基于C语言的语法扩展方法,基于标准的C语言,根据数据流模型扩展其参数表达式,获得初始程序,同时生成函数执行顺序的有向图,以使该数据流模型在经过C语言扩展后能够进行编译,最终使得数据流模型能够广泛应用于各平台的多核处理器中。

实施例二

如图2所示,本发明实施例所提供的基于C语言的语法扩展方法,示例性的示出了上述实施例一中步骤S103的一种具体实现流程:

根据所述数据流函数生成函数执行顺序的有向图,并根据所述有向图对所述初始程序进行编译。

在具体应用中,可以采用有向图的方式进行编译,其中,一个数据流程序的静态实例会按照它的结构被描述成一张有向图,图中节点表示计算单元,边代表数据传输路径。相邻节点间通过边传输数据,节点消耗数据进行计算,并将产生的数据输出到输入输出序列作为下一个计算单元的输入。

在本发明实施例中,上述根据数据流函数生成函数执行顺序的有向图的具体步骤包括:

S1031、设置函数集合、已扫描函数集合和已装配函数集合。

在上述步骤S1031中,已扫描函数集合和已装配函数集合的初始设定为空。

S1032、遍历所述初始程序中的数据流函数,并将所述数据流函数放入所述函数集合中。

在上述步骤S1032中,遍历操作保证了函数集合中的函数个数,等于初始程序中数据流函数的个数。

S1033、遍历所述函数集合,对每一个所述函数集合中的数据流函数,构造激活输入条件数据和输出条件数据,并将已经构造激活的数据流函数添加到所述已扫描函数集合。

在上述步骤S1033中,已扫描函数集合中包括数据流函数、输入条件数据和输出条件数据三部分。

在具体应用中,有向图中的相邻节点间通过边传输数据,因此需将数据流函数的数据输出到输入输出序列作为下一个数据流函数的数据输入。

S1034、遍历所述已扫描函数集合,在具有输入输出条件数据关系的两个数据流函数之间构造有向连接,并将构造了全部输入的有向连接的数据流函数添加到所述已装配函数集合。

在上述步骤S1034中,构造了有向连接的数据流函数添加到已装配函数集合中后,数据流函数逐渐构成有向图中的节点;全部输入的有向连接即所有的输出条件数据到输入条件数据的有向连接。

S1035、所述已装配函数集合中的元素数量等于所述初始程序中数据流函数的数量时,完成所述有向图。

S1036、所述已装配函数集合中的元素不等于所述初始程序中数据流函数的个数时,提示编译错误。

如图3所示,本发明实施例还提供了上述步骤S1034的具体实现流程:

S10341、将所述已扫描函数集合的一个数据流函数作为第一数据流函数,将在所述已扫描函数集合中的另一个数据流函数作为第二数据流函数。

在上述步骤S10341中,第一数据流函数和第二数据流函数为已扫描函数集合的任意两个数据流函数。

S10342、所述第一数据流函数的输出条件数据,为所述第二数据流函数的输入条件数据时,构造所述第一数据流函数的输出条件数据到所述第二数据流函数的输入条件数据的有向连接。

S10343、所述第二数据流函数的输出条件数据,为所述第一数据流函数的输入条件数据时,构造所述第二数据流函数的输出条件数据到所述第一数据流函数的输入条件数据的有向连接。

在上述步骤S10342和步骤S10343中,可以将第一数据流函数的输出条件数据作为标准,遍历寻找能够构成对应的,满足输入条件数据的第二数据流函数,然后在第一数据流函数和第二数据流函数之间构造有向连接。同理,可以将第二数据流函数的输出条件数据作为标准,遍历寻找能够构成对应的,满足输入条件数据的第一数据流函数,然后在第一数据流函数和第二数据流函数之间构造有向连接。

在本发明实施例中,有向连接均表现为输出数据条件到输入数据条件的有向连接。

S10344、所述第一数据流函数或所述第二数据流函数的所有输入条件数据均与对应的输出条件数据构造了有向连接时,将所述第一数据流函数或所述第二数据流函数添加到所述已装配函数集合。

在上述步骤S10344中,数据流函数可以具有多个输入条件数据,已装配函数集合中的数据流函数根据其所有的输入条件数据,装配了与所有输入条件数据对应的输出条件数据,并构造了所有的输出条件数据到输入条件数据的有向连接。

本发明实施例提供了一种基于C语言的语法扩展方法,基于标准的C语言,根据数据流模型扩展其参数表达式,获得初始程序,同时生成函数执行顺序的有向图,以使该数据流模型在经过C语言扩展后能够进行编译,最终使得数据流模型能够广泛应用于格平台的多核处理器中。

实施例三

本发明实施例以如图4所示的数据流模型为例,对上述实施例一及实施例二中,基于C语言的语法扩展方法的实现流程进行示例性说明。

针对如图4所示的数据流模型,其具有三个函数A、B、C;扩展C语言中的参数列表内容,获得的初始程序可有如下代码:

a)dfunA为图4中的平方运算,表示为:

dfunA(int a;;DOintc1)//DI部分为空,表示立即可以运行

{

c1.var=a*a;

}

其中a代表初始输入参数,DOint c1代表了该数据流函数输出的条件数据,dfunA执行后DOint c1的标志ready变为ture。

在本发明实施例中,取a为4。

b)dfunB为图4中的开根号运算,表示为:

dfunB(int b;;DOint c2)//DI部分同样为空,表示立即可以运行

{

c2.var=sqrt(b);

}

其中b代表初始输入参数,DOint c2代表了该数据流函数输出的条件数据,dfunB执行后DOint c1的标志ready变为ture。

在本发明实施例中,取b为9。

c)dfunC为图4中的相加运算,表示为:

dfunC(;Dint c1,Dint c2;)//没有普通参数,DO部分为空

{

d=c1.var+c2.var;

}

其中DOint c1,Dint c2代表了该数据流函数输出的条件数据。当满足这两项条件数据之后,函数自动激活。并对输入数据c1.var和c2.var处理,即c1.var+c2.var,其中c1.var为dfunA的输出数据,c2.var为dfunB的输出数据。

在本发明实施例中,上述的dfunA、dfunB和dfunC均为数据流函数,下面示出了生成函数执行顺序的有向图的具体实现流程:

1)将数据流函数dfunA、dfunB和dfunC放入函数集合DFUN中,同时设置已扫描函数集合SCANF和已装配函数集合FIXEDF,其中已扫描函数集合SCANF和已装配函数集合FIXEDF的初始状态设为空。

2)将数据流函数添加至已扫描函数集合SCANF:

遍历函数集合DFun,对每一个函数集合中的数据流函数,构造激活输入条件数据DI输出条件数据DO,例如此数据流函数为dfunA,然后将该函数

dfunA添加到已扫描函数集合SCANF,同时完成已扫描函数集合SCANF内部的扫描,即遍历已扫描函数集合SCANF中除了数据流函数dfunA以外的其他所有函数dfunB和dfunC,则已扫描函数集合SCANF中的数据流函数均由输入条件数据DI输出条件数据DO,但没有构造连接关系。

3)将已扫描函数集合SCANF中的数据流函数添加至已装配函数集合FIXEDF:

在本发明实施例中,首先扫描的是funA,dfunA已经加入已扫描函数集合SCANF。由于该数据流函数的DI项是缺省的,表示该函数是直接运行的,所以将funA直接加入已装配函数集合FIXEDF表示完成该项装载;接着扫描的是funB,将funB加入已扫描函数集合SCANF,由于该数据流函数的DI项是也缺省的,表示该函数是直接运行的,所以直接加入已装配函数集合FIXEDF表示完成该项装载;最后查找funC,发现已扫描函数集合SCANF中的funA的DO是funC的DI一部分,则构造funA到funC的有向连接,funC的DI仅完成了连接的一半,还不能加入已装配函数集合FIXEDF,则继续查找funC,发现在已扫描函数集合SCANF中的funB的DO是funC的DI的一部分,构造funB到funC的有向连接。

在具体应用中,缺省表示系统默认状态,意思与“默认”相同。

4)funC的DI完成所有的连接时,将已扫描函数集合SCANF加入已装配函数集合FIXEDF,至此函数集合DFUN中所有函数已扫描完成,且已装载函数的数量和数据流函数的数量是相等的,完成了函数执行顺序的有向图的生成。

如图5所示,本发明实施例还提供了根据如图4所示的数据流模型,所生成的函数执行顺序的有向图的结构示意图。

在本发明实施例中,上述的数据流函数dfunA、dfunB和dfunC根据上述有向图进行编译。

实施例四

如图6所示,本发明实施例还提供了一种基于C语言的语法扩展装置60,其使用了C语言的语言标准、语言组成,但扩展了其语言组成内容,并提供了一种编译方式,将其应用于数据流模型时,能够使数据流模型在多种计算机平台中进行编译,从而应用于各平台的多核处理器中。基于C语言的语法扩展装置60包括:

编程模块61,用于根据数据流模型,扩展C语言中的参数列表内容,获得初始程序;

选择标记模块62,用于标记所述初始程序中的数据流函数,获得参数表达式的输入数据条件和输出数据条件;

编译模块63,用于根据所述数据流函数选择所述初始程序的编译方式,对所述初始程序进行编译。

在一个实施例中,选择模块62包括第一标注单元。

在具体应用中,第一标注单元,用于通过pragma指令标注初始程序的代码段落,进行编译制导,并判断代码段落是否符合数据流函数的编译方式;

若代码段落符合数据流函数的编译方式,则代码段落产生数据流函数;

若代码段落不符合数据流函数的编译方式,则代码段落不产生数据流函数。

在一个实施例中,选择模块62包括第二标注单元。

在具体应用中,第二标注单元,用于通过在参数列表中加入分割符号,分割参数列表中的参数表达式,并判断参数表达式是否符合数据流函数的编译方式;

若参数表达式符合数据流函数的编译方式,则参数表达式产生数据流函数;

若参数表达式不符合数据流函数的编译方式,则参数表达式不产生数据流函数。

本发明实施例还提供一种终端设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时,实现如实施例一中所述的基于C语言的语法扩展方法中的各个步骤。

本发明实施例还提供一种存储介质,所述存储介质为计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时,实现如实施例一中所述的基于C语言的语法扩展方法中的各个步骤。

以上所述实施例仅用以说明本发明的技术方案,而非对其限制;尽管前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围,均应包含在本发明的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号