CN111506314A - 项目开发的方法、装置、服务器及介质 - Google Patents

项目开发的方法、装置、服务器及介质 Download PDF

Info

Publication number
CN111506314A
CN111506314A CN202010272510.XA CN202010272510A CN111506314A CN 111506314 A CN111506314 A CN 111506314A CN 202010272510 A CN202010272510 A CN 202010272510A CN 111506314 A CN111506314 A CN 111506314A
Authority
CN
China
Prior art keywords
code
language
target
project source
codes
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.)
Granted
Application number
CN202010272510.XA
Other languages
English (en)
Other versions
CN111506314B (zh
Inventor
梁进超
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Netease Hangzhou Network Co Ltd
Original Assignee
Netease Hangzhou Network Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Netease Hangzhou Network Co Ltd filed Critical Netease Hangzhou Network Co Ltd
Priority to CN202010272510.XA priority Critical patent/CN111506314B/zh
Publication of CN111506314A publication Critical patent/CN111506314A/zh
Application granted granted Critical
Publication of CN111506314B publication Critical patent/CN111506314B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/51Source to source
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Stored Programmes (AREA)

Abstract

本发明提供一种项目开发的方法、装置、服务器及介质,涉及数据处理技术领域。该方法包括:通过语法分析器分析基于第一语言开发的项目源码,获得项目源码对应的语法树;通过预配置的过滤规则对语法树进行过滤,得到过滤后的项目源码;通过代码生成器对过滤后的项目源码进行转化,得到用于第二语言开发的目标代码,其中,目标代码为基于第一语言的代码。通过语法分析器、预配置的过滤规则以及代码生成器,自动获取目标代码,以建立第一语言和第二语言之间的联系,节省了人力资源,提高了建立第一语言和第二语言联系时的效率。

Description

项目开发的方法、装置、服务器及介质
技术领域
本发明涉及数据处理技术领域,具体而言,涉及一种项目开发的方法、装置、服务器及介质。
背景技术
通过引擎对于游戏或者其他项目的开发越来越多,引擎可以由C++语言代码编写而成,引擎中项目源码也可以由C++语言代码编写而成,Python为一种解释性的高级语言,当在该引擎中,采用Python语言进行开发时,需要建立C++语言和Python语言之间的联系。
相关技术中,将C++语言代码中静态库转换为Python语言所需要的动态库,采用模板将C++语言代码中的接口导入到Python语言中,并手动为每个接口编写代码,为每个接口或者头文字编写配置,从而建立引擎中C++语言和Python语言之间的联系。
但是,相关技术中,为每个接口编写代码,以及每个接口或者头文字编写配置,工作量较大,浪费了不必要的人力资源,也降低了建立引擎中C++语言和Python语言联系时的效率。
发明内容
本发明的目的在于,针对上述现有技术中的不足,提供一种项目开发的方法、装置、服务器及介质,以便解决相关技术中,为每个接口编写代码,以及每个接口或者头文字编写配置,工作量较大,浪费了不必要的人力资源,也降低了建立引擎中C++语言和Python语言联系时的效率的问题。
为实现上述目的,本发明实施例采用的技术方案如下:
第一方面,本发明实施例提供了一种项目开发的方法,包括:
通过语法分析器分析基于第一语言开发的项目源码,获得所述项目源码对应的语法树;
通过预配置的过滤规则对所述语法树进行过滤,得到过滤后的项目源码;
通过代码生成器对所述过滤后的项目源码进行转化,得到用于第二语言开发的目标代码,其中,所述目标代码为基于所述第一语言的代码。
可选的,所述方法还包括:利用所述第二语言对所述目标代码进行开发,得到所述项目源码的更新代码。
可选的,所述目标代码支持函数提示和/或类型检查。
可选的,所述通过代码生成器对所述过滤后的项目源码进行转化,得到用于第二语言开发的目标代码,包括:
通过代码生成器将所述项目源码中的至少一个目标任务封装为目标组件;
将不包含所述目标组件的项目源码转化为用于第二语言开发的目标代码。
可选的,对所述目标任务进行监测;
若监测到触发事件,则对所述目标任务进行处理。
可选的,所述目标任务为需要每帧处理的任务。
可选的,所述通过代码生成器对所述过滤后的项目源码进行转化,得到用于第二语言开发的目标代码之后,还包括:
在所述目标代码中为不同对象添加释放标签,所述释放标签用于指示在所述目标代码中释放对象时是否释放所述项目源码中对应的对象。
可选的,所述通过代码生成器对所述过滤后的项目源码进行转化,得到用于第二语言开发的目标代码之后,还包括:
接收针对所述目标代码的修订指令;
根据所述修订指令在预设中间文件中执行修订内容;
利用所述修订内容、通过预设格式的宏命令,更新所述目标代码,获得修订后的目标代码。
可选的,所述通过代码生成器对所述过滤后的项目源码进行转化,得到用于第二语言开发的目标代码,包括:
结合所述过滤后的目标源码中的参数类型以及函数类型,通过所述代码生成器,生成所述用于第二语言开发的目标代码。
可选的,所述第一语言为C++;所述第二语言为python。
第二方面,本发明实施例提供了一种项目开发的装置,包括:
分析模块,用于通过语法分析器分析基于第一语言开发的项目源码,获得所述项目源码对应的语法树;
过滤模块,用于通过预配置的过滤规则对所述语法树进行过滤,得到过滤后的项目源码;
转化模块,用于通过代码生成器对所述过滤后的项目源码进行转化,得到用于第二语言开发的目标代码,其中,所述目标代码为基于所述第一语言的代码。
可选地,利用所述第二语言对所述目标代码进行开发,得到所述项目源码的更新代码。
可选的,所述目标代码支持函数提示和/或类型检查。
可选的,所述转化模块,还用于通过代码生成器将所述项目源码中的至少一个目标任务封装为目标组件;将不包含所述目标组件的项目源码转化为用于第二语言开发的目标代码。
可选的,所述装置还包括:
监测模块,用于对所述目标任务进行监测;
处理模块,用于若监测到触发事件,则对所述目标任务进行处理。
可选的,所述目标任务为需要每帧处理的任务。
进一步地,所述装置还包括:
添加模块,在所述目标代码中为不同对象添加释放标签,所述释放标签用于指示在所述目标代码中释放对象时是否释放所述项目源码中对应的对象。
进一步地,所述装置还包括:
接收模块,用于接收针对所述目标代码的修订指令;
执行模块,用于根据所述修订指令在预设中间文件中执行修订内容;
更新模块,用于利用所述修订内容、通过预设格式的宏命令,更新所述目标代码,获得修订后的目标代码。
进一步地,所述转化模块,还用于结合所述过滤后的目标源码中的参数类以及函数类型,通过所述代码生成器,生成所述用于第二语言开发的目标代码。
进一步地,所述第一语言为C++;所述第二语言为python。
第三方面,本发明实施例还提供了一种服务器,包括:存储器和处理器,所述存储器存储有所述处理器可执行的计算机程序,所述处理器执行所述计算机程序时实现上述第一方面任一项所述的方法。
第四方面,本发明实施例还提供了一种存储介质,所述存储介质上存储有计算机程序,所述计算机程序被读取并执行时,实现上述第一方面任一项所述的方法。
本发明的有益效果是:本发明实施例提供一种项目开发的方法,通过语法分析器分析基于第一语言开发的项目源码,获得项目源码对应的语法树;通过预配置的过滤规则对语法树进行过滤,得到过滤后的项目源码;通过代码生成器对过滤后的项目源码进行转化,得到用于第二语言开发的目标代码,其中,目标代码为基于第一语言的代码。通过语法分析器、预配置的过滤规则以及代码生成器,自动获取目标代码,以建立第一语言和第二语言之间的联系,节省了人力资源,提高了建立第一语言和第二语言联系时的效率。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为本发明实施例提供的一种项目开发的方法的流程示意图;
图2为本发明实施例提供的一种项目开发的方法的流程示意图;
图3为本发明实施例提供的一种项目开发的方法的流程示意图;
图4为本发明实施例提供的一种项目开发的方法的流程示意图;
图5为本发明实施例提供的一种项目开发的装置的结构示意图;
图6为本发明实施例提供的一种服务器的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。
图1为本发明实施例提供的一种项目开发的方法的流程示意图,如图1所示,该方法包括:
S101、通过语法分析器分析基于第一语言开发的项目源码,获取项目源码对应的语法树。
其中,项目源码可以包括:特定项目源码和/或引擎源码,即,项目源码可以仅包括特定项目源码,也可以仅包括引擎源码,还可以同时包括特定项目源码和引擎源码。该特定项目源码可以为游戏逻辑源码。
在一些实施方式中,服务器可以通过语法分析器,可以通过调用预设工具的动态库来分析第一语言开发的项目源码,获取项目源码对应的语法树。
当然,服务器还可以采用其他方式基于第一语言开发的项目源码,获取项目源码对应的语法树,本发明实施例对此不进行具体限制。
S102、通过预配置的过滤规则对语法树进行过滤,得到过滤后的项目源码。
其中,过滤后的项目源码也可以称为过滤后的语法树。
其中,过滤规则中可以包括:多个配置项,该配置项可以为正则表达式。服务器可以通过过滤器,采用预配置的过滤规则对语法树进行过滤,得到过滤后的项目源码。
需要说明的是,过滤器可以支持部分导出或全部导出、正则式配置类或函数的黑白名单、自动剔除不支持的参数或返回类型、支持按文件路径限制或过滤导出、过滤基类时过滤其所有子类、支持外部头文件、头文件自动包含或目录递归查找、组件自定义事件等。
例如,下述列举出了多个配置项,以及各个配置项所对应的功能:
cpp_namespace:限定导出C++的namespace(命名空间),不在该namspace(命名空间)的C++类/函数不会导出;
clang_headers:clang(轻量级编译器)语法分析时的一些参数,例如,可以为指定头文件的搜索路径(有先后顺序);
headers:预导出接口的头文件,可以写成一个头文件。
dep_headers:在自动生成的_auto.h头文件中添加#include这些头文件。
add_dep_headers_by_headers:将headers中引用的头文件也包含在_auto.h头文件中;
file_locations_in:限定导出的C++类/函数的定义必须在预设路径中;
skip_file_locations:若待导出的C++类/函数定义于该路径中,则不予导出;
classes:限定导出的C++类名,如在类名前加预设标记,则表示只导出已支持类型的方法;
global_functions:限定导出的C++函数名;
skip:跳过导出C++类中的某些函数;
not_support_argtype:函数参数为该类型时,不予导出;
classes_have_no_parents:在导出时确定该类没有父类;
base_classes_to_skip:如果待导出的类为预设类或其子类,不予导出,其中,预设类可以包括:classes_own_cpp_struct、abstract_classes和can_not_delete_classes。classes_own_cpp_struct:指定own_struct类,abstract_classes:抽象类、构造函数被private(用于声明私有变量及分配存储空间)的类,can_not_delete_classes:析构函数被private的类;
generate_not_declare_class:设置对于没有具体定的类,是否导出;
classes_to_rename:类名导出到python时,对名字进行修改;
other_enum_prefix:额外导出预设枚举,设置该枚举的前缀限定;
menu_component:强行指定为menu_component(自定义组件)的类;
not_menu_component:强行指定不为menu_component的类。
需要说明的是,采用过滤规则进行过滤的内容可以包括:命名空间过滤、文件路径过滤或不过滤、类名过滤、函数名过滤、按函数参数类型过滤、特定类方法过滤、类方法配置、父或子类过滤、枚举前缀过滤、组件或非组件过滤等。
在本发明实施例中,类名前可以添加有名字空间(namespaced_name),当一些类不允许被构造或者析构时,则可以将该类添加至抽象类(abstract_classes)中,或者不能被删除类(can_not_delete_classes)中。
应当理解的是,上述多个配置项仅为一种示例,本发明实施例对于配置项所包括的内容,不进行限制。
S103、通过代码生成器对过滤后的项目源码进行转化,得到用于第二语言开发的目标代码。
其中,目标代码为基于第一语言的代码,目标代码可以用于描述第一语言和第二语言之间的映射关系。
在一些实施方式中,服务器采用代码生成器中的预设模板,以及基于框架系统的编译器,将过滤后的项目源码进行转换生成binding层,即目标代码。
例如,上述代码生成器可以为Cheatah(一种代码生成器),上述基于框架系统的编译器可以为Clang LLVM。
在本发明实施例中,当项目源码包括特定项目源码时,调用目标代码可以将基于第一语言开发的特定项目源码,转换为项目源码的更新代码,该项目源码的更新代码为基于第二语言的代码。
另外,当项目源码包括引擎源码时,调用目标代码可以将基于第一语言开发的待编辑代码,转换为基于第二语言开发的项目代码。待编辑代码与引擎源码基于同一引擎,待编辑代码可以为不同游戏的逻辑代码,这使得目标代码具有普适性,扩大了目标代码的适用范围。
当项目源码包括特定项目源码和引擎源码时,调用目标代码既可以将基于第一语言开发的特定项目源码,转换为项目源码的更新代码;也可以将基于第一语言开发的待编辑代码,转换为基于第二语言开发的项目代码。待编辑代码与引擎源码基于同一引擎。
可选的,第一语言可以为C++,第二语言可以为python。
综上所述,本发明实施例提供一种项目开发的方法,通过语法分析器分析基于第一语言开发的项目源码,获得项目源码对应的语法树;通过预配置的过滤规则对语法树进行过滤,得到过滤后的项目源码;通过代码生成器对过滤后的项目源码进行转化,得到用于第二语言开发的目标代码,其中,目标代码为基于第一语言的代码。通过语法分析器、预配置的过滤规则以及代码生成器,自动获取目标代码,以建立第一语言和第二语言之间的联系,节省了人力资源,提高了建立第一语言和第二语言联系时的效率。
可选的,该方法还可以包括:利用第二语言对目标代码进行开发,得到项目源码的更新代码。
本申请实施例中,若项目源码包括特定项目源码,即特定游戏代码;利用第二语言进行开发时,可以调用目标代码对项目源码进行转换,得到项目源码的更新代码。
可选的,目标代码支持函数提示和/或类型检查。
在本发明实施例中,上述函数提示用于研发人员在写代码时,可以提供函数或变量的提示;上述类型检查可以基于编辑器,类型检查可以用于检查传入函数的参数类型是否正确。
另外,对于第二语言的项目代码,服务器会自动生成预设文件,该预设文件可以为“.PYI”(一种已知的软件应用程序查看)格式的文件,对于非自动生成预设文件,例如binding(绑定)函数/类/类方法等,可以手动添加“.PYI”格式的文件。
而且,服务器可以预设的开发环境中,将上述“.PYI”格式的文件设置为根目录,以及实现函数提示功能,以及类型检查功能。其中,预设开发环境可以为PyCharm(PythonIDE)、VSCode等。
需要说明的是,函数提示,和/或,类型检查,可以包括:函数提示、类型检查、函数提示和类型检查等三种情况。
可选的,上述S103还可以包括:通过代码生成器将项目源码中的至少一个目标任务封装为目标组件;将不包含目标组件的项目源码转化为用于第二语言开发的目标代码。
在一些实施方式中,项目源码中可以包括特定项目源码,服务器可以通过代码生成器将特定项目源码中对应对象封装为目标组件,再将特定项目源码中处理的至少一个目标任务写在该目标组件中,将不包含目标组件的项目源码转化为用于第二语言开发的目标代码。其中,特定项目源码中对应对象是基于第一语言所编写的。
另外,上述目标组件可以为Proc(处理)组件或者Render(渲染)组件。
需要说明的是,服务器可以基于Auto binding(自动绑定)方法,采用特化模板对每个目标组件进行处理,以便终端可以执行该处理后的目标组件中的目标任务。该特化模板可以用CPyMenuComponentT<C++类>来表示。
可选的,图2为本发明实施例提供的一种项目开发的方法的流程示意图,如图2所示,该方法还包括:
S201、对目标任务进行监测。
S202、若监测到触发事件,则对目标任务进行处理。
在一些实施方式中,终端可以通过执行目标组件中的目标任务,以根据目标任务进行监测,当监测的事件满足预设条件时,则确定该事件为触发事件,通过目标代码将基于第一语言的触发事件转换为基于第二语言的触发事件,可以将基于第二语言的触发事件发送至项目源码的更新代码,项目源码的更新代码可以创建自定义组件,将该触发事件放置于自定义组件中。
相应的,终端可以根据自定义组件(component)的id(Identity document,唯一编码)依次执行触发事件,即进行触发事件的渲染或者其他处理。
在本发明实施例中,第二语言中的自定义组件可以放置于容器中。第二语言为Python时,可以通过Python来控制自定义组件是否进行触发事件的渲染或者处理。
可选的,上述S201,还可以包括:目标任务为需要每帧处理的任务。
其中,上述终端可以为游戏对应的终端,每帧处理的任务可以为:游戏在运行时,对游戏中每帧画面处理的任务。
项目源码可以包括特定项目源码,服务器可以将特定项目源码中对应对象封装为目标组件,再将特定项目源码中每帧处理的任务,写在对应的目标组件中。
另外,可以通过上述目标组件中每帧处理的任务,对每帧的处理逻辑进行监测,若监测到触发事件时,调用目标代码将基于第一语言的触发事件转换为基于第二语言的触发事件,将基于第二语言的触发事件发送至项目源码的更新代码中,以使得基于项目源码的更新代码进行相应处理。
例如,目标组件中的目标任务可以对游戏中的每帧的处理逻辑进行监测,当监测结果指示玩家添加按钮时,则将该添加按钮事件作为触发事件,发送至目标代码所创建的自定义组件中,以便项目源码的更新代码可以执行该创建按钮的任务。
综上所述,当引擎为游戏引擎时,服务器需要对游戏逻辑中每帧处理的任务进行分析与处理,将配置在项目源码中处理的至少一个目标任务写在项目源码中对应对象的目标组件中,可以便于对服务器对游戏逻辑中每帧处理的任务进行处理。通过控件事件化机制,将原有的每帧处理逻辑转换为事件触发回调脚本层,从而解决了每帧处理的性能问题。
可选的,图3为本发明实施例提供的一种项目开发的方法的流程示意图,如图3所示,在上述S103之后,该方法还可以包括:
S301、在目标代码中为不同对象添加释放标签。
其中,释放标签用于指示在目标代码中释放目标对象时是否释放引擎和项目源码中对应的对象。
另外,在Auto-binding方法中,Python对象可以分为三类,包括:结构体、普通对象和自定义组件。结构体可以用own_struct来表示,普通对象可以用object来表示,自定义组件可以用menu_component来表示。
在一些实施方式中,当服务器确定对象中存在预设方法时,则可以确定该对象为自定义组件。预设方法可以为Render(渲染)、Update(更新)、SetPos(函数)等方法。
在本发明实施例中,可以对每个目标代码中对象添加释放标签。当目标代码中对象添加有释放标签时,目标代码中的对象释放时,也会自动释放项目源码中的对象。
需要说明的是,当对象的类型为返回值对象时,则不为该对象添加释放标签,当创建新对象的类静态函数,则可以根据用户的修改操作在python中修改该值。
在本发明实施例中,服务器可以基于Python binding(Python绑定)方法,来建立引擎中Python语言和C++语言之间的联系,Python binding方法不会自动构造或者析构C++中的对象,服务器可以为C++对象添加释放标记,以确定该C++对象是否可以自动析构。
在一些实施方式中,python创建的对象可由python释放,由C++创建的对象可由C++释放,当python创建的对象与C++创建的对象有引用时,服务器可以根据用户的释放操作进行释放。当C++创建的对象被python所引用,该对象被C++释放,造成python持有野指针,可能会导致程序崩溃,需要用户的释放操作进行释放。
综上所述,对于对象的生命周期管理,采用半自动化管理,大部分对象都添加释放标记,来确定是否需要自动释放,减少了对象生命周期管理的工作量。
可选的,图4为本发明实施例提供的一种项目开发的方法的流程示意图,如图4所示,在S103之后,该方法还可以包括:
S401、接收针对目标代码的修订指令。
其中,目标代码可以包括多个代码文件,每个代码文件具有代码文件名。
在本发明实施例中,服务器可以根据用户的修订操作,获取目标代码的修订指令,修订指令可以指示预修订的代码文件,以及预修订的内容。
S402、根据修订指令在预设中间文件中执行修订内容。
在一些实施方式中,当预修订的代码文件的代码文件名为预设代码文件名时,则可以根据修订指令在预设中间文件中执行修订内容。当预修订的代码文件的代码文件名不为预设代码文件名时,可以根据修订指令直接对预修订的代码文件进行修订。
需要说明的是,上述预设代码文件名可以为代码文件名以_auto.cpp或_auto.h结尾的文件名。预设中间文件可以为预设的能够直接添加修订内容的文件。
另外,上述预设中间文件可以用xxxxx_Manual_inc.h进行表示。
S403、利用修订内容、通过预设格式的宏命令,更新目标代码,获取修订后的目标代码。
其中,可以根据目标代码来查找预设格式的宏命令,当查找到预设格式的宏命令时,服务器可以通过预设格式的宏命令,利用修订内容对目标代码进行更新,继而可以获取修订后的目标代码。
在一种可能的实施方式中,当在一个对象中添加方法时,对象可以为CNumberPlate(普通对象),添加的方法可以为SetCompPos,则预设格式的宏可以表示为:
Figure BDA0002442992420000121
继而编写函数pymm_game_base_CNumberPlate_SetCompPos,则可以更新目标代码,获取修订后的目标代码。
可选的,上述S103,还可以包括:结合过滤后的项目源码中的参数类型以及函数类型,通过代码生成器,生成用于第二语言开发的目标代码。
在一些实施方式中,服务器可以根据代码生成器判断过滤后的项目源码中入参或者返回值的类型,若为内置类型,则可以生成第二语言的转换函数代码。其中,内置类型可以为int、long和float等,第二语言为Python时,转换函数可以用PyXXX_AsXXX或者PyXXX_FromXXX来表示。
另外,若入参的类型为非内置类型,则可以直接取出第二语言对象中的第一语言对象指针,当第二语言对象为结构体时,可以复制该第二语言对象。
若返回值的类型为非内置类型,则可以将指针记录在第二语言的对象中,如果是当第二语言对象为结构体时,可以复制该第二语言对象。
其中,当第二语言为Python时,结构体可以用own struct来表示。
例如,当binding函数返回值为NULL(空)时,在python里面会转换为None(无);传入python的参数为None时,binding函数的参数会被转换为NULL。
在本发明实施例中,当过滤后的项目源码中函数类型为构造函数时,则可以创建第二语言对象,当过滤后的项目源码中抽象类或者构造函数被声明为私有变量及分配存储空间时,则不允许构造第二语言对象。当第一语言为C++时,在声明私有变量及分配存储空间时,可以用private进行表示。
需要说明的是,当析构函数被声明为私有变量时,则第二语言中的析构对象可以具有预设接口,以清理对象。
在Python中,对于Object对象的入参和返回值处理,如表1所示:入参的参数类型为:A*obj,传入参数可以为pyarg->cobj;入参的参数类型为:A&obj,传入参数可以为*pyarg->cobj;入参的参数类型为:A,传入参数可以为*pyarg->cobj。返回值的类型为A*obj,对应的处理为A*obj=xxx(),pyarg->cobj=obj;返回值的类型为A&obj,对应的处理为A*obj=&xxx(),pyarg->cobj=obj;返回值的类型为A,对应的处理为*pyarg->cobj=xxx()。
表1
Figure BDA0002442992420000131
在Python中,对于own_struct(结构体)的入参和返回值处理,如表2所示:入参的参数类型为:A*obj,传入参数可以为&pyarg->cobj;入参的参数类型为:A&obj,传入参数可以为pyarg->cobj;入参的参数类型为:A,传入参数可以为pyarg->cobj。返回值的类型为A*obj,对应的处理为A*obj=xxx(),pyarg->cobj=*obj;返回值的类型为A&obj,对应的处理为pyarg->cobj=xxx();返回值的类型为A,对应的处理为pyarg->cobj=xxx()。
Figure BDA0002442992420000132
在本发明实施例中,生成目标代码后,目标代码可以支持的特性包括但不限于:普通的类与函数、函数重载、函数默认参数、类/结构体嵌套、类/结构体成员/静态成员、抽象类/无法构造或析构的类、默认构造/析构函数、无定义的类型、枚举类型、引擎内置类型等。
在类型转换时,普通object之间、menu_component(自定义组件)之间可以进行类型转换,在进行类型转换时,可以第一语言的预设运算符,判断转换的对象是否存在父子或者子父关系,对于强制转换(ForceConvert)的代码不进行判断。其中,结构体、普通对象和自定义组件不能被强制转换。
Auto-binding(自动绑定)方法可以支持导出C++重载函数,其用法和C++中类似,区别在于:C++中,若存在父类和子类有同名重载函数但参数列表不一样的方法时,可以通过子类对象调用父类的重载方法,但在Auto-binding不实现该特性。
Python和C++中,对于函数默认参数的用法相同。
Auto-binding可以支持导出类成员,当类成员的类型为“已经导出的类”并且为public(类的访问修饰符)时会自动导出,实现在python中可以对类成员赋值/取值。类成员类型为char*(一种类型)时,会申请新内存。类成员可以分为普通成员、静态成员、常量等。
对于Python中的普通对象,可以直接进行赋值或者取值,实现方式与C++中相同,当普通对象为指针类型时,应注意该对象的生命周期,即是否携带释放标记等,当普通对象携带const(常类型)修饰时,则不可以进行赋值。当类成员为own_struct(结构体)时,不支持指针,不可以连续多次取成员进行赋值。
Python和C++中,对于常量的写法相同,不能进行赋值。常量为类内static const(静成员)修饰的整数、浮点数、布尔类型,是不会发生改变的值。
在Python中,对于hook(钩子,可以在python加载脚本时添加自定义处理)类静态成员的读或写,过特殊命名的函数来实现对类静态成员进行赋值或者取值。特殊命名的函数可以为ClassName.Get_XXXX()或者ClassName.Set_XXXX(value),其中,XXXX为类静态成员名。
当入参预传入空指针时,在python中传None即可。当返回值为空指针时,在python中为None。入参传入None时,确定C++中该函数是否允许空指针输入。
C++中的抽象类和普通类的主要区别是能否构造对象,可以手动在Auto-binding配置文件的abstract_classes(抽象类)里面设置。
图5为本发明实施例提供的一种项目开发的方法的结构示意图,如图5所示,该装置可以包括:
分析模块501,用于通过语法分析器分析基于第一语言开发的项目源码,获得项目源码对应的语法树,项目源码包括:特定项目源码和/或引擎源码;
过滤模块502,用于通过预配置的过滤规则对语法树进行过滤,得到过滤后的项目源码;
转化模块503,用于通过代码生成器对过滤后的项目源码进行转化,得到用于第二语言开发的目标代码,其中,目标代码为基于第一语言的代码。
可选的,利用第二语言对目标代码进行开发,得到项目源码的更新代码。
可选的,目标代码支持函数提示和/或类型检查。
可选的,转化模块503,通过代码生成器将项目源码中的至少一个目标任务封装为目标组件;将不包含目标组件的项目源码转化为用于第二语言开发的目标代码。
可选的,装置还包括:
监测模块,用于对目标任务进行监测;
处理模块,用于若监测到触发事件,则对目标任务进行处理。
可选的,目标任务为需要每帧处理的任务。
进一步地,装置还包括:
添加模块,在目标代码中为不同对象添加释放标签,释放标签用于指示在目标代码中释放对象时是否释放项目源码中对应的对象。
进一步地,装置还包括:
获取模块,用于接收针对目标代码的修订指令;
执行模块,用于根据修订指令在预设中间文件中执行修订内容;
更新模块,用于利用修订内容、通过预设格式的宏命令,更新目标代码,获得修订后的目标代码。
进一步地,生成模块,还用于结合过滤后的目标源码中的参数类以及函数类型,通过代码生成器,生成用于第二语言开发的目标代码。
上述装置用于执行前述实施例提供的方法,其实现原理和技术效果类似,在此不再赘述。
以上这些模块可以是被配置成实施以上方法的一个或多个集成电路,例如:一个或多个特定集成电路(Application Specific Integrated Circuit,简称ASIC),或,一个或多个微处理器(digital singnal processor,简称DSP),或,一个或者多个现场可编程门阵列(Field Programmable Gate Array,简称FPGA)等。再如,当以上某个模块通过处理元件调度程序代码的形式实现时,该处理元件可以是通用处理器,例如中央处理器(CentralProcessing Unit,简称CPU)或其它可以调用程序代码的处理器。再如,这些模块可以集成在一起,以片上系统(system-on-a-chip,简称SOC)的形式实现。
图6为本发明实施例提供的一种服务器的结构示意图,该服务器包括:处理器601、存储器602。
存储器602用于存储程序,处理器601调用存储器602存储的程序,以执行上述方法实施例。具体实现方式和技术效果类似,这里不再赘述。
可选地,本发明还提供一种程序产品,例如计算机可读存储介质,包括程序,该程序在被处理器执行时用于执行上述方法实施例。
在本发明所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(英文:processor)执行本发明各个实施例所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(英文:Read-Only Memory,简称:ROM)、随机存取存储器(英文:Random Access Memory,简称:RAM)、磁碟或者光盘等各种可以存储程序代码的介质。

Claims (13)

1.一种项目开发的方法,其特征在于,包括:
通过语法分析器分析基于第一语言开发的项目源码,获得所述项目源码对应的语法树;
通过预配置的过滤规则对所述语法树进行过滤,得到过滤后的项目源码;
通过代码生成器对所述过滤后的项目源码进行转化,得到用于第二语言开发的目标代码,其中,所述目标代码为基于所述第一语言的代码。
2.如权利要求1所述的方法,其特征在于,所述方法还包括:利用所述第二语言对所述目标代码进行开发,得到所述项目源码的更新代码。
3.如权利要求1所述的方法,其特征在于,所述目标代码支持函数提示和/或类型检查。
4.如权利要求1所述的方法,其特征在于,所述通过代码生成器对所述过滤后的项目源码进行转化,得到用于第二语言开发的目标代码,包括:
通过代码生成器将所述项目源码中的至少一个目标任务封装为目标组件;
将不包含所述目标组件的项目源码转化为用于第二语言开发的目标代码。
5.如权利要求4所述的方法,其特征在于,所述方法还包括:
对所述目标任务进行监测;
若监测到触发事件,则对所述目标任务进行处理。
6.如权利要求4或5所述的方法,其特征在于,所述目标任务为需要每帧处理的任务。
7.如权利要求1所述的方法,其特征在于,所述通过代码生成器对所述过滤后的项目源码进行转化,得到用于第二语言开发的目标代码之后,还包括:
在所述目标代码中为不同对象添加释放标签,所述释放标签用于指示在所述目标代码中释放对象时是否释放所述项目源码中对应的对象。
8.如权利要求1所述的方法,其特征在于,所述通过代码生成器对所述过滤后的项目源码进行转化,得到用于第二语言开发的目标代码之后,还包括:
接收针对所述目标代码的修订指令;
根据所述修订指令在预设中间文件中执行修订内容;
利用所述修订内容,通过预设格式的宏命令,更新所述目标代码,获得修订后的目标代码。
9.如权利要求1所述的方法,其特征在于,所述通过代码生成器对所述过滤后的项目源码进行转化,得到用于第二语言开发的目标代码,包括:
结合所述过滤后的项目源码中的参数类型以及函数类型,通过所述代码生成器,生成所述用于第二语言开发的目标代码。
10.如权利要求1所述的方法,其特征在于,所述第一语言为C++;所述第二语言为python。
11.一种项目开发的装置,其特征在于,包括:
分析模块,用于通过语法分析器分析基于第一语言开发的项目源码,获得所述项目源码对应的语法树;
过滤模块,用于通过预配置的过滤规则对所述语法树进行过滤,得到过滤后的项目源码;
转化模块,用于通过代码生成器对所述过滤后的项目源码进行转化,得到用于第二语言开发的目标代码,其中,所述目标代码为基于所述第一语言的代码。
12.一种服务器,其特征在于,包括:存储器和处理器,所述存储器存储有所述处理器可执行的计算机程序,所述处理器执行所述计算机程序时实现上述权利要求1-10任一项所述的方法。
13.一种存储介质,其特征在于,所述存储介质上存储有计算机程序,所述计算机程序被读取并执行时,实现上述权利要求1-10任一项所述的方法。
CN202010272510.XA 2020-04-08 2020-04-08 项目开发的方法、装置、服务器及介质 Active CN111506314B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010272510.XA CN111506314B (zh) 2020-04-08 2020-04-08 项目开发的方法、装置、服务器及介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010272510.XA CN111506314B (zh) 2020-04-08 2020-04-08 项目开发的方法、装置、服务器及介质

Publications (2)

Publication Number Publication Date
CN111506314A true CN111506314A (zh) 2020-08-07
CN111506314B CN111506314B (zh) 2024-05-14

Family

ID=71867239

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010272510.XA Active CN111506314B (zh) 2020-04-08 2020-04-08 项目开发的方法、装置、服务器及介质

Country Status (1)

Country Link
CN (1) CN111506314B (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112269566A (zh) * 2020-11-03 2021-01-26 支付宝(杭州)信息技术有限公司 脚本生成处理方法、装置、设备及系统
CN112667223A (zh) * 2021-01-05 2021-04-16 北京城市网邻信息技术有限公司 组件配置表的生成方法、装置、电子设备及存储介质
CN112698813A (zh) * 2020-12-29 2021-04-23 智慧神州(北京)科技有限公司 系统开发的方法、装置、计算机可读存储介质与处理器
CN113391815A (zh) * 2021-06-09 2021-09-14 上海创景信息科技有限公司 基于多种开发语言的源码分析结果测试方法及系统
CN114035804A (zh) * 2021-11-16 2022-02-11 北京字节跳动网络技术有限公司 代码转换方法、装置、介质和电子设备

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101261579A (zh) * 2007-03-08 2008-09-10 青牛(北京)技术有限公司 一种实现VBScript语言跨平台应用的方法
US20100095282A1 (en) * 2008-10-10 2010-04-15 The Boeing Company Method, Apparatus And Computer Program Product For Creating Inter-Language Interface
US20130159982A1 (en) * 2011-12-16 2013-06-20 Apostolos Lerios Language Translation Using Preprocessor Macros
CN107861728A (zh) * 2017-10-25 2018-03-30 深圳四方精创资讯股份有限公司 用于传统程序语言向现代程序语言转换的方法及其系统
CN109697215A (zh) * 2018-12-14 2019-04-30 安徽同徽网络技术有限公司 数据采集方法、数据采集系统和非易失性计算机存储介质
CN109933331A (zh) * 2019-03-07 2019-06-25 杭州时趣信息技术有限公司 一种客户端服务器间数据转换方法及相关组件
CN110471666A (zh) * 2019-07-18 2019-11-19 五八有限公司 代码自动转换方法和装置、代码转换器及介质
CN110531965A (zh) * 2018-05-23 2019-12-03 阿里巴巴集团控股有限公司 一种数据处理方法、程序运行方法和设备

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101261579A (zh) * 2007-03-08 2008-09-10 青牛(北京)技术有限公司 一种实现VBScript语言跨平台应用的方法
US20100095282A1 (en) * 2008-10-10 2010-04-15 The Boeing Company Method, Apparatus And Computer Program Product For Creating Inter-Language Interface
US20130159982A1 (en) * 2011-12-16 2013-06-20 Apostolos Lerios Language Translation Using Preprocessor Macros
CN107861728A (zh) * 2017-10-25 2018-03-30 深圳四方精创资讯股份有限公司 用于传统程序语言向现代程序语言转换的方法及其系统
CN110531965A (zh) * 2018-05-23 2019-12-03 阿里巴巴集团控股有限公司 一种数据处理方法、程序运行方法和设备
CN109697215A (zh) * 2018-12-14 2019-04-30 安徽同徽网络技术有限公司 数据采集方法、数据采集系统和非易失性计算机存储介质
CN109933331A (zh) * 2019-03-07 2019-06-25 杭州时趣信息技术有限公司 一种客户端服务器间数据转换方法及相关组件
CN110471666A (zh) * 2019-07-18 2019-11-19 五八有限公司 代码自动转换方法和装置、代码转换器及介质

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112269566A (zh) * 2020-11-03 2021-01-26 支付宝(杭州)信息技术有限公司 脚本生成处理方法、装置、设备及系统
CN112698813A (zh) * 2020-12-29 2021-04-23 智慧神州(北京)科技有限公司 系统开发的方法、装置、计算机可读存储介质与处理器
CN112667223A (zh) * 2021-01-05 2021-04-16 北京城市网邻信息技术有限公司 组件配置表的生成方法、装置、电子设备及存储介质
CN113391815A (zh) * 2021-06-09 2021-09-14 上海创景信息科技有限公司 基于多种开发语言的源码分析结果测试方法及系统
CN113391815B (zh) * 2021-06-09 2023-11-21 上海创景信息科技有限公司 基于多种开发语言的源码分析结果测试方法及系统
CN114035804A (zh) * 2021-11-16 2022-02-11 北京字节跳动网络技术有限公司 代码转换方法、装置、介质和电子设备

Also Published As

Publication number Publication date
CN111506314B (zh) 2024-05-14

Similar Documents

Publication Publication Date Title
CN111506314B (zh) 项目开发的方法、装置、服务器及介质
CN108920133B (zh) 跨语言编程方法、装置、电子设备及存储介质
US8997070B2 (en) Extension mechanism for scripting language compiler
CN106155749B (zh) 一种监控插件扩展方法及装置
KR20140057547A (ko) 런타임 시스템
JP2005011362A (ja) モジュラオブジェクトシリアライゼーションアーキテクチャ
US20090328016A1 (en) Generalized expression trees
CN111736954A (zh) 多智能合约虚拟机实现方法、多智能合约虚拟机及系统
CN110457013B (zh) 程序组件配置装置及方法
CN114064213B (zh) 基于Kubernets容器环境的快速编排服务方法及系统
CN110727429B (zh) 一种前端页面的生成方法、装置及设备
CN112083919A (zh) 一种基于yaml模板的目标服务代码生成方法及装置
CN115390846A (zh) 编译构建方法、装置、电子设备和存储介质
CA2428558C (en) System and method for defining and using subclasses declaratively within markup
CN111752841A (zh) 单测模拟方法、装置、设备与计算机可读存储介质
CN117234470B (zh) 一种基于低代码平台的跨端表单开发系统及方法
CN116466953B (zh) 组件化的前端开发方法、装置、计算机设备和存储介质
CN111488144A (zh) 一种数据处理方法以及设备
CN111309634A (zh) 一种基于继承和代理的代码检测规则框架建立及使用方法
CN111126008A (zh) 基于xsd的代码生成方法、装置、计算机设备及存储介质
CN116243923A (zh) 一种小程序处理方法、装置及电子设备
CN117971350A (zh) 小程序运行方法、装置和计算机可读存储介质
CN113485686B (zh) 信息系统程序的生成方法、装置、电子设备及存储介质
CN113342399A (zh) 应用项目的结构配置方法、装置及可读存储介质
Wille Presenting C

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