CN104991773A - 程序生成方法及装置 - Google Patents

程序生成方法及装置 Download PDF

Info

Publication number
CN104991773A
CN104991773A CN201510378982.2A CN201510378982A CN104991773A CN 104991773 A CN104991773 A CN 104991773A CN 201510378982 A CN201510378982 A CN 201510378982A CN 104991773 A CN104991773 A CN 104991773A
Authority
CN
China
Prior art keywords
code
module
file
code file
program
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
CN201510378982.2A
Other languages
English (en)
Other versions
CN104991773B (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.)
Millet Communication Technology Co Ltd
Original Assignee
Xiaomi Inc
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 Xiaomi Inc filed Critical Xiaomi Inc
Priority to CN201510378982.2A priority Critical patent/CN104991773B/zh
Publication of CN104991773A publication Critical patent/CN104991773A/zh
Application granted granted Critical
Publication of CN104991773B publication Critical patent/CN104991773B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Stored Programmes (AREA)

Abstract

本公开揭示了一种程序生成方法及装置,属于软件开发领域。所述方法包括:获取用于在服务器端执行的Java脚本JavaScript原程序;采用词法分析方式对原程序中的各个代码文件进行代码分析获得各个代码文件之间的依赖关系;根据该依赖关系生成用于在浏览器端执行的目标程序。本公开通过获取用于在服务器端执行的JavaScript原程序,对该原程序中的各个代码文件进行代码分析,获得该各个代码文件之间的依赖关系,并根据该各个代码文件以及该各个代码文件之间的依赖关系生成用于在浏览器端执行的JavaScript程序,不需要针对浏览器端人工开发相应的程序,从而缩短软件研发周期,提高软件开发效率。

Description

程序生成方法及装置
技术领域
本公开涉及软件开发领域,特别涉及一种程序生成方法及装置。
背景技术
JavaScript(Java脚本)一种直译式脚本语言,通常情况下,JavaScript程序运行于浏览器中,但是在某些场景下,还需要在服务器也运行一套相同逻辑的JavaScript程序。
服务器端的JavaScript又称为node.js,其通过require()的方式组织服务器端的JavaScript程序,而浏览器端的JavaScript并不支持require()的组织方式,因此,在相关技术中,当浏览器与服务器需要运行相同逻辑的JavaScript代码时,由开发人员为浏览器和服务器分别开发各自的JavaScript程序,开发周期较长,影响开发效率。
发明内容
为了克服相关技术中存在的,当浏览器与服务器需要运行相同逻辑的JavaScript代码时,由开发人员为浏览器和服务器分别开发各自的JavaScript程序,导致开发周期较长,影响开发效率问题,本公开提供了一种程序生成方法及装置。所述技术方案如下:
根据本公开的第一方面,提供一种程序生成方法,所述方法包括:
获取原程序,所述原程序是用于在服务器端执行的Java脚本JavaScript程序,所述原程序中包含两个或者两个以上的代码文件;
采用词法分析方式对所述原程序中的各个代码文件进行代码分析;
根据分析结果获得所述各个代码文件之间的依赖关系;
根据所述各个代码文件以及所述各个代码文件之间的依赖关系生成目标程序,所述目标程序是用于在浏览器端执行的JavaScript程序。
只需要开发一套在服务器端运行的JavaScript程序,就可以自动生成用于在浏览器端运行的JavaScript程序,不需要针对浏览器端人工开发相应的程序,缩短软件研发周期,提高开发效率。
可选的,所述根据分析结果获得所述各个代码文件之间的依赖关系,包括:
根据所述分析结果生成所述原程序中的各个引用模块声明语句各自对应的抽象语法树;
对于所述各个引用模块声明语句中的每一个引用模块声明语句,查询所述引用模块声明语句对应的抽象语法树,获得所述引用模块声明语句所在的代码文件的依赖文件,所述依赖文件是所述各个代码文件中,所述引用模块声明语句所在的代码文件所依赖的其它文件;
将所述各个代码文件与所述各个代码文件各自的依赖文件之间的对应关系获取为所述各个代码文件之间的依赖关系。
通过语法树生成和分析的方式自动获取各个代码文件之间的依赖关系,不需要人工分析代码,节约人工成本和时间成本,提高分析效率。
可选的,所述查询所述引用模块声明语句对应的抽象语法树,获得所述引用模块声明语句所在的代码文件的依赖文件,包括:
将所述抽象语法树中第一个arguments对象的值获取为文件名,将所述文件名对应的文件确定为所述代码文件的依赖文件。
根据抽象语法树自动分析代码文件的依赖文件的文件名,无需人工查找,节约人工成本和时间成本,提高分析效率。
可选的,所述根据所述各个代码文件以及所述各个代码文件之间的依赖关系生成目标程序,包括:
生成所述目标程序的输出函数;
生成所述目标程序的递归函数,所述递归函数中包含所述各个代码文件各自对应的代码模块,所述递归函数用于递归执行所述各个代码模块。
根据分析获得的各个代码文件之间的依赖关系,将原先只能在服务器端运行的程序自动包装成可以在浏览器端运行的程序,不需要对浏览器端的程序进行人工开发,缩短软件研发周期,提高开发效率。
可选的,所述生成所述目标程序的递归函数,包括:
对于所述各个代码文件中的每一个代码文件,根据所述代码文件以及所述代码文件的依赖文件,生成所述代码文件对应的代码模块;所述代码模块中包含所述代码文件,以及所述代码模块所引用的其它代码模块的标识;所述其它代码模块为所述代码文件的依赖文件所对应的代码模块;
生成模块依赖字典,所述模块依赖字典中包含所述各个代码文件对应的代码模块;
生成以所述模块依赖字典为值的递归函数。
根据各个代码之间的依赖关系自动生成模块依赖字典,以便将在服务器端运行的依赖函数重新包装为可以在浏览器端运行的递归函数,减少人工开发的过程,缩短软件研发周期,提高开发效率。
根据本公开的第二方面,提供一种程序生成装置,所述装置包括:
原程序获取模块,用于获取原程序,所述原程序是用于在服务器端执行的Java脚本JavaScript程序,所述原程序中包含两个或者两个以上的代码文件;
代码分析模块,用于采用词法分析方式对所述原程序中的各个代码文件进行代码分析;
依赖关系获得模块,用于根据分析结果获得所述各个代码文件之间的依赖关系;
目标程序生成模块,用于根据所述各个代码文件以及所述各个代码文件之间的依赖关系生成目标程序,所述目标程序是用于在浏览器端执行的JavaScript程序。
只需要开发一套在服务器端运行的JavaScript程序,就可以自动生成用于在浏览器端运行的JavaScript程序,不需要针对浏览器端人工开发相应的程序,缩短软件研发周期,提高开发效率。
可选的,所述依赖关系获得模块,包括:
语法树生成子模块,用于根据所述分析结果生成所述原程序中的各个引用模块声明语句各自对应的抽象语法树;
查询子模块,用于对于所述各个引用模块声明语句中的每一个引用模块声明语句,查询所述引用模块声明语句对应的抽象语法树,获得所述引用模块声明语句所在的代码文件的依赖文件,所述依赖文件是所述各个代码文件中,所述引用模块声明语句所在的代码文件所依赖的其它文件;
关系获取子模块,用于将所述各个代码文件与所述各个代码文件各自的依赖文件之间的对应关系获取为所述各个代码文件之间的依赖关系。
通过语法树生成和分析的方式自动获取各个代码文件之间的依赖关系,不需要人工分析代码,节约人工成本和时间成本,提高分析效率。
可选的,所述查询子模块,用于将所述抽象语法树中第一个arguments对象的值获取为文件名,将所述文件名对应的文件确定为所述代码文件的依赖文件。
根据抽象语法树自动分析代码文件的依赖文件的文件名,无需人工查找,节约人工成本和时间成本,提高分析效率。
可选的,所述目标程序生成模块,包括:
输出函数生成子模块,用于生成所述目标程序的输出函数;
递归函数生成子模块,用于生成所述目标程序的递归函数,所述递归函数中包含所述各个代码文件各自对应的代码模块,所述递归函数用于递归执行所述各个代码模块。
根据分析获得的各个代码文件之间的依赖关系,将原先只能在服务器端运行的程序自动包装成可以在浏览器端运行的程序,不需要对浏览器端的程序进行人工开发,缩短软件研发周期,提高开发效率。
可选的,所述递归函数生成子模块,包括:
第一生成子模块,用于对于所述各个代码文件中的每一个代码文件,根据所述代码文件以及所述代码文件的依赖文件,生成所述代码文件对应的代码模块;所述代码模块中包含所述代码文件,以及所述代码模块所引用的其它代码模块的标识;所述其它代码模块为所述代码文件的依赖文件所对应的代码模块;
第二生成子模块,用于生成模块依赖字典,所述模块依赖字典中包含所述各个代码文件对应的代码模块;
第三生成子模块,用于生成以所述模块依赖字典为值的递归函数。
根据各个代码之间的依赖关系自动生成模块依赖字典,以便将在服务器端运行的依赖函数重新包装为可以在浏览器端运行的递归函数,减少人工开发的过程,缩短软件研发周期,提高开发效率。
根据本公开的第三方面,提供一种程序生成装置,所述装置包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为:
获取原程序,所述原程序是用于在服务器端执行的Java脚本JavaScript程序,所述原程序中包含两个或者两个以上的代码文件;
采用词法分析方式对所述原程序中的各个代码文件进行代码分析;
根据分析结果获得所述各个代码文件之间的依赖关系;
根据所述各个代码文件以及所述各个代码文件之间的依赖关系生成目标程序,所述目标程序是用于在浏览器端执行的JavaScript程序。
只需要开发一套在服务器端运行的JavaScript程序,就可以自动生成用于在浏览器端运行的JavaScript程序,不需要针对浏览器端人工开发相应的程序,缩短软件研发周期,提高开发效率。
本公开的实施例提供的技术方案可以包括以下有益效果:
通过获取用于在服务器端执行的JavaScript原程序,对该原程序中的各个代码文件进行代码分析,获得该各个代码文件之间的依赖关系并,根据该各个代码文件以及该各个代码文件之间的依赖关系生成用于在浏览器端执行的JavaScript程序,开发人员只需要开发一套在服务器端运行的JavaScript程序,就可以自动生成用于在浏览器端运行的JavaScript程序,不需要针对浏览器端人工开发相应的程序,从而缩短软件研发周期,提高软件开发效率。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本发明的实施例,并于说明书一起用于解释本发明的原理。
图1是根据一示例性实施例示出的一种程序生成方法的流程图;
图2是根据另一示例性实施例示出的一种程序生成方法的流程图;
图3是根据另一示例性实施例示出的一种依赖关系分析方法的流程图;
图4是根据另一示例性实施例示出的一种递归函数生成方法的流程图;
图5是根据一示例性实施例示出的一种程序生成装置的框图;
图6是根据另一示例性实施例示出的一种程序生成装置的框图;
图7是根据一示例性实施例示出的一种装置的框图。
具体实施方式
这里将详细地对示例性实施例执行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本发明相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本发明的一些方面相一致的装置和方法的例子。
服务器端的JavaScript程序由若干个代码文件组成,各个代码文件之间通过require()方式组织到一起,即一个服务器端的JavaScript程序中的各个代码文件必然与其它的代码文件之间存在依赖关系,比如,执行时引用另一个代码文件,或者被另一个代码文件所引用。本公开以下各个示例性实施例所示的方案就是基于服务器端的JavaScript程序的这一特点,通过分析服务器端的JavaScript程序中的各个代码文件之间的依赖关系,并根据各个代码文件之间的依赖关系将其包装成可以被浏览器端直接执行的JavaScript程序。
值得说明的是,在本公开提供的实施例中,为了便于翻译,将本公开中的JavaScript译为Java脚本,在本公开中,JavaScript指的是浏览器脚本,而对于浏览器的类型不做限定。
图1是根据一示例性实施例示出的一种程序生成方法的流程图。该程序生成方法用于个人电脑或者工作站等计算机设备中。如图1所示,该程序生成方法可以包括以下步骤。
在步骤101中,获取原程序,该原程序是用于在服务器端执行的Java脚本JavaScript程序,该原程序中包含两个或者两个以上的代码文件。
在步骤102中,采用词法分析方式对该原程序中的各个代码文件进行代码分析。
在步骤103中,根据分析结果获得该各个代码文件之间的依赖关系。
在步骤104中,根据该各个代码文件以及该各个代码文件之间的依赖关系生成目标程序,该目标程序是用于在浏览器端执行的JavaScript程序。
可选的,该根据分析结果获得该各个代码文件之间的依赖关系,包括:
根据该分析结果生成该原程序中的各个引用模块声明语句各自对应的抽象语法树;
对于该各个引用模块声明语句中的每一个引用模块声明语句,查询该引用模块声明语句对应的抽象语法树,获得该引用模块声明语句所在的代码文件的依赖文件,该依赖文件是该各个代码文件中,该引用模块声明语句所在的代码文件所依赖的其它文件;
将该各个代码文件与该各个代码文件各自的依赖文件之间的对应关系获取为该各个代码文件之间的依赖关系。
可选的,该查询该引用模块声明语句对应的抽象语法树,获得该引用模块声明语句所在的代码文件的依赖文件,包括:
将该抽象语法树中第一个arguments对象的值获取为文件名,将该文件名对应的文件确定为该代码文件的依赖文件。
可选的,该根据该各个代码文件以及该各个代码文件之间的依赖关系生成目标程序,包括:
生成该目标程序的输出函数;
生成该目标程序的递归函数,该递归函数中包含该各个代码文件各自对应的代码模块,该递归函数用于递归执行该各个代码模块。
可选的,该生成该目标程序的递归函数,包括:
对于该各个代码文件中的每一个代码文件,根据该代码文件以及该代码文件的依赖文件,生成该代码文件对应的代码模块;该代码模块中包含该代码文件,以及该代码模块所引用的其它代码模块的标识;该其它代码模块为该代码文件的依赖文件所对应的代码模块;
生成模块依赖字典,该模块依赖字典中包含该各个代码文件对应的代码模块;
生成以该模块依赖字典为值的递归函数。
综上所述,本公开实施例所示的程序生成方法,通过获取用于在服务器端执行的JavaScript原程序,对该原程序中的各个代码文件进行代码分析,获得该各个代码文件之间的依赖关系并,根据该各个代码文件以及该各个代码文件之间的依赖关系生成用于在浏览器端执行的JavaScript程序,开发人员只需要开发一套在服务器端运行的JavaScript程序,就可以自动生成用于在浏览器端运行的JavaScript程序,不需要针对浏览器端人工开发相应的程序,从而缩短软件研发周期,提高软件开发效率。
图2是根据另一示例性实施例示出的一种程序生成方法的流程图。该程序生成方法用于个人电脑或者工作站等计算机设备中。如图2所示,该程序生成方法可以包括以下步骤。
在步骤201中,获取原程序,该原程序是用于在服务器端执行的JavaScript程序,该原程序中包含两个或者两个以上的代码文件。
服务器端执行的JavaScript(也被称为node.js)程序可以如下所示:
上述代码表示原程序中包含3个代码文件,分别为文件a、文件b以及文件test。文件b中的代码语句“var a=require("a");”表示文件b依赖文件a;同样的,文件test中的代码语句“var b=require("b");”表示文件test依赖文件b;其中,代码语句“var a=require("a");”和“var b=require("b");”又被称为引用模块声明语句,用于声明其所在的代码文件所依赖的其它文件。
在步骤202中,从入口文件开始,采用词法分析方式对原程序中的各个代码文件进行代码分析。
其中,入口文件由开发人员预先指定。本公开实施例所示的方案中,主要分析各个代码文件中的require函数的调用,比如查询代码文件中是否包含引用模块声明语句。
在步骤203中,根据分析结果获得各个代码文件之间的依赖关系。
可选的,在本公开实施例中,根据分析结果获得各个代码文件之间的依赖关系的步骤可以参考图3所示的依赖关系分析方法的流程图,该依赖关系分析方法可以包括步骤203a~203c。
在步骤203a中,根据分析结果生成原程序中的各个引用模块声明语句各自对应的抽象语法树。
在本公开实施例中,上述对代码进行分析到生成抽象语法树的过程可以如下:对代码文件中的代码进行词法分析,在词法分析的基础上进行语法分析,继而生成抽象语法树。
在本公开实施例中,对于每一个引用模块声明语句分别生成一个抽象语法树,即当一个代码文件包含多个引用模块声明语句时,该代码文件也对应有多个抽象语法树。以针对文件test中的引用模块声明语句“var b=require("b");”生成抽象语法树为例,生成的抽象语法树可以如下:
在步骤203b中,对于各个引用模块声明语句中的每一个引用模块声明语句,查询该引用模块声明语句对应的抽象语法树,获得该引用模块声明语句所在的代码文件的依赖文件。
其中,该依赖文件是各个代码文件中,该引用模块声明语句所在的代码文件所依赖的其它文件。
可选的,在查询该引用模块声明语句对应的抽象语法树,获得该引用模块声明语句所在的代码文件的依赖文件时,可以将该抽象语法树中第一个arguments对象的值获取为文件名,将该文件名对应的文件确定为该代码文件的依赖文件。
比如,以上述引用模块声明语句“var b=require("b");”所在的文件为文件test,对应的抽象代码树为例,其中的arguments对象为:
可以查询获得该arguments对象的值(value)为b,即文件test的依赖文件为文件b。
在步骤203c中,将各个代码文件与各个代码文件各自的依赖文件之间的对应关系获取为各个代码文件之间的依赖关系。
对每一个抽象语法树进行查询后,统计每一个代码文件的依赖文件,即可以获得各个代码文件之间的依赖关系。
在步骤204中,生成该目标程序的输出函数。
在生成输出函数时,可以创建一个空的对象作为输出函数。
在步骤205中,生成该目标程序的递归函数,该递归函数中包含该各个代码文件各自对应的代码模块,该递归函数用于递归执行该各个代码模块。
可选的,在本公开实施例中,生成该目标程序的递归函数的步骤可以参考图4所示的递归函数生成方法的流程图,该递归函数生成方法可以包括步骤205a~205c。
在步骤205a中,对于该各个代码文件中的每一个代码文件,根据该代码文件以及该代码文件的依赖文件,生成该代码文件对应的代码模块。
其中,该代码模块中包含该代码文件,以及该代码模块所引用的其它代码模块的标识;该其它代码模块为该代码文件的依赖文件所对应的代码模块。
其中,可以为每一个代码文件对应的代码模块设置一个标识,比如,设置文件b对应的代码模块的标识1,文件a对应的代码模块的标识为2,文件test对应的代码模块的标识为3,则生成文件b对应的代码模块为:
由上述代码可以看出,代码模块1中包含两个部分,其中一部分代码为文件b中的代码,其代码如下:
另一部分代码为文件b的依赖文件a所对应的代码模块的标识,其代码为:
{"a":2}
该代码表示文件b的依赖文件a所对应的代码模块的标识为2。
在步骤205b中,生成模块依赖字典,该模块依赖字典中包含该各个代码文件对应的代码模块。
将上述步骤205a生成的各个代码模块按照字典结构合并为模块依赖字典,该模块依赖字典如下:
在步骤205c中,生成以该模块依赖字典为值的递归函数。
本公开实施例生成的递归函数在运行时,可以读取模块依赖字典中的各个模块的依赖关系,即读取每一个代码模块所引用的其它代码模块的标识,并根据每一个代码模块所引用的其它代码模块的标识顺序执行模块依赖字典中的各个模块。
以原程序包含上述文件a、文件b以及文件test为例,在一种可能的递归函数实现方式中,最终生成的递归函数可以如下:
上述递归函数只是以其中一种可能的定义方式为例进行说明,在实际应用中,也可以采用其它的递归函数定义方式,本公开实施例对于递归函数的实现及编写方式不做限定,只要定义的递归函数能否读取模块依赖字典中各个代码模块之间的依赖关系,并据此依次执行其中的各个代码模块即可。
在步骤206中,将上述输出函数和递归函数输出为目标函数。
综上所述,本公开实施例所示的程序生成方法,通过获取用于在服务器端执行的JavaScript原程序,对该原程序中的各个代码文件进行代码分析,获得该各个代码文件之间的依赖关系并,根据该各个代码文件以及该各个代码文件之间的依赖关系生成用于在浏览器端执行的JavaScript程序,开发人员只需要开发一套在服务器端运行的JavaScript程序,就可以自动生成用于在浏览器端运行的JavaScript程序,不需要针对浏览器端人工开发相应的程序,从而缩短软件研发周期,提高软件开发效率。
下述为本公开装置实施例,可以用于执行本公开方法实施例。对于本公开装置实施例中未披露的细节,请参照本公开方法实施例。
图5是根据一示例性实施例示出的一种程序生成装置的框图,该程序生成装置可以用于个人电脑或者工作站等计算机设备中,执行如图1至4任一所示的方法。如图5所示,该程序生成装置包括但不限于:原程序获取模块501、代码分析模块502、依赖关系获得模块503以及目标程序生成模块504;
所述原程序获取模块501被设置为用于获取原程序,所述原程序是用于在服务器端执行的JavaScript程序,所述原程序中包含两个或者两个以上的代码文件;
所述代码分析模块502被设置为用于对所述原程序中的各个代码文件进行代码分析;
所述依赖关系获得模块503被设置为用于根据分析结果获得所述各个代码文件之间的依赖关系;
所述目标程序生成模块504被设置为用于根据所述各个代码文件以及所述各个代码文件之间的依赖关系生成目标程序,所述目标程序是用于在浏览器端执行的JavaScript程序。
综上所述,本公开实施例所示的程序生成装置,通过获取用于在服务器端执行的JavaScript原程序,对该原程序中的各个代码文件进行代码分析,获得该各个代码文件之间的依赖关系并,根据该各个代码文件以及该各个代码文件之间的依赖关系生成用于在浏览器端执行的JavaScript程序,开发人员只需要开发一套在服务器端运行的JavaScript程序,就可以自动生成用于在浏览器端运行的JavaScript程序,不需要针对浏览器端人工开发相应的程序,从而缩短软件研发周期,提高软件开发效率。
图6是根据另一示例性实施例示出的一种程序生成装置的框图,该程序生成装置可以用于个人电脑或者工作站等计算机设备中,执行如图1至4任一所示的方法。如图6所示,该程序生成装置包括但不限于:原程序获取模块501、代码分析模块502、依赖关系获得模块503以及目标程序生成模块504;
所述原程序获取模块501被设置为用于获取原程序,所述原程序是用于在服务器端执行的JavaScript程序,所述原程序中包含两个或者两个以上的代码文件;
所述代码分析模块502被设置为用于对所述原程序获取模块501获取到的原程序中的各个代码文件进行代码分析;
所述依赖关系获得模块503被设置为用于根据所述代码分析模块502的分析结果获得所述各个代码文件之间的依赖关系;
所述目标程序生成模块504被设置为用于根据所述各个代码文件以及所述依赖关系获得模块503获得的所述各个代码文件之间的依赖关系生成目标程序,所述目标程序是用于在浏览器端执行的JavaScript程序。
可选的,所述依赖关系获得模块503,包括:语法树生成子模块503a、查询子模块503b以及关系获取子模块503c;
所述语法树生成子模块503a被设置为用于根据所述代码分析模块502的分析结果生成所述原程序中的各个引用模块声明语句各自对应的抽象语法树;
所述查询子模块503b被设置为用于对于所述各个引用模块声明语句中的每一个引用模块声明语句,查询所述引用模块声明语句对应的抽象语法树,获得所述引用模块声明语句所在的代码文件的依赖文件,所述依赖文件是所述各个代码文件中,所述引用模块声明语句所在的代码文件所依赖的其它文件;
所述关系获取子模块503c被设置为用于将所述各个代码文件与所述查询子模块503b查询到的各个代码文件各自的依赖文件之间的对应关系获取为所述各个代码文件之间的依赖关系。
可选的,所述查询子模块503b被设置为用于将所述抽象语法树中第一个arguments对象的值获取为文件名,将所述文件名对应的文件确定为所述代码文件的依赖文件。
可选的,所述目标程序生成模块504,包括:输出函数生成子模块504a以及递归函数生成子模块504b;
所述输出函数生成子模块504a被设置为用于生成所述目标程序的输出函数;
所述递归函数生成子模块504b被设置为用于生成所述目标程序的递归函数,所述递归函数中包含所述各个代码文件各自对应的代码模块,所述递归函数用于递归执行所述各个代码模块。
可选的,所述递归函数生成子模块504b,包括:第一生成子模块504b1、第二生成子模块504b2以及第三生成子模块504b3;
所述第一生成子模块504b1被设置为用于对于所述各个代码文件中的每一个代码文件,根据所述代码文件以及所述查询子模块503b查询到的所述代码文件的依赖文件,生成所述代码文件对应的代码模块;所述代码模块中包含所述代码文件,以及所述代码模块所引用的其它代码模块的标识;所述其它代码模块为所述代码文件的依赖文件所对应的代码模块;
所述第二生成子模块504b2被设置为用于生成模块依赖字典,所述模块依赖字典中包含第一生成子模块504b1生成的所述各个代码文件对应的代码模块;
所述第三生成子模块504b3被设置为用于生成以所述第二生成子模块504b2生成的模块依赖字典为值的递归函数。
综上所述,本公开实施例所示的程序生成装置,通过获取用于在服务器端执行的JavaScript原程序,对该原程序中的各个代码文件进行代码分析,获得该各个代码文件之间的依赖关系并,根据该各个代码文件以及该各个代码文件之间的依赖关系生成用于在浏览器端执行的JavaScript程序,开发人员只需要开发一套在服务器端运行的JavaScript程序,就可以自动生成用于在浏览器端运行的JavaScript程序,不需要针对浏览器端人工开发相应的程序,从而缩短软件研发周期,提高软件开发效率。
图7是根据一示例性实施例示出的一种装置700的框图。该装置700可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上中央处理器(central processing units,CPU)722(例如,一个或一个以上处理器)和存储器732,一个或一个以上存储应用程序742或数据744的存储介质730(例如一个或一个以上海量存储设备)。其中,存储器732和存储介质730可以是短暂存储或持久存储。存储在存储介质730的程序可以包括一个或一个以上模块(图示没标出),每个模块可以包括对装置中的一系列指令操作,这一系列的指令操作可以用于实现如图1至4任一所示的全部或部分步骤。更进一步地,中央处理器722可以设置为与存储介质730通信,在装置700上执行存储介质730中的一系列指令操作。
装置700还可以包括一个或一个以上电源726,一个或一个以上有线或无线网络接口750,一个或一个以上输入输出接口758,一个或一个以上键盘756,和/或,一个或一个以上操作系统741,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM等等。
关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中执行了详细描述,此处将不做详细阐述说明。
应当理解的是,本发明并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围执行各种修改和改变。本发明的范围仅由所附的权利要求来限制。

Claims (11)

1.一种程序生成方法,其特征在于,所述方法包括:
获取原程序,所述原程序是用于在服务器端执行的Java脚本JavaScript程序,所述原程序中包含两个或者两个以上的代码文件;
采用词法分析方式对所述原程序中的各个代码文件进行代码分析;
根据分析结果获得所述各个代码文件之间的依赖关系;
根据所述各个代码文件以及所述各个代码文件之间的依赖关系生成目标程序,所述目标程序是用于在浏览器端执行的JavaScript程序。
2.根据权利要求1所述的方法,其特征在于,所述根据分析结果获得所述各个代码文件之间的依赖关系,包括:
根据所述分析结果生成所述原程序中的各个引用模块声明语句各自对应的抽象语法树;
对于所述各个引用模块声明语句中的每一个引用模块声明语句,查询所述引用模块声明语句对应的抽象语法树,获得所述引用模块声明语句所在的代码文件的依赖文件,所述依赖文件是所述各个代码文件中,所述引用模块声明语句所在的代码文件所依赖的其它文件;
将所述各个代码文件与所述各个代码文件各自的依赖文件之间的对应关系获取为所述各个代码文件之间的依赖关系。
3.根据权利要求2所述的方法,其特征在于,所述查询所述引用模块声明语句对应的抽象语法树,获得所述引用模块声明语句所在的代码文件的依赖文件,包括:
将所述抽象语法树中第一个arguments对象的值获取为文件名,将所述文件名对应的文件确定为所述代码文件的依赖文件。
4.根据权利要求2所述的方法,其特征在于,所述根据所述各个代码文件以及所述各个代码文件之间的依赖关系生成目标程序,包括:
生成所述目标程序的输出函数;
生成所述目标程序的递归函数,所述递归函数中包含所述各个代码文件各自对应的代码模块,所述递归函数用于递归执行所述各个代码模块。
5.根据权利要求4所述的方法,其特征在于,所述生成所述目标程序的递归函数,包括:
对于所述各个代码文件中的每一个代码文件,根据所述代码文件以及所述代码文件的依赖文件,生成所述代码文件对应的代码模块;所述代码模块中包含所述代码文件,以及所述代码模块所引用的其它代码模块的标识;所述其它代码模块为所述代码文件的依赖文件所对应的代码模块;
生成模块依赖字典,所述模块依赖字典中包含所述各个代码文件对应的代码模块;
生成以所述模块依赖字典为值的递归函数。
6.一种程序生成装置,其特征在于,所述装置包括:
原程序获取模块,用于获取原程序,所述原程序是用于在服务器端执行的Java脚本JavaScript程序,所述原程序中包含两个或者两个以上的代码文件;
代码分析模块,用于采用词法分析方式对所述原程序中的各个代码文件进行代码分析;
依赖关系获得模块,用于根据分析结果获得所述各个代码文件之间的依赖关系;
目标程序生成模块,用于根据所述各个代码文件以及所述各个代码文件之间的依赖关系生成目标程序,所述目标程序是用于在浏览器端执行的JavaScript程序。
7.根据权利要求6所述的装置,其特征在于,所述依赖关系获得模块,包括:
语法树生成子模块,用于根据所述分析结果生成所述原程序中的各个引用模块声明语句各自对应的抽象语法树;
查询子模块,用于对于所述各个引用模块声明语句中的每一个引用模块声明语句,查询所述引用模块声明语句对应的抽象语法树,获得所述引用模块声明语句所在的代码文件的依赖文件,所述依赖文件是所述各个代码文件中,所述引用模块声明语句所在的代码文件所依赖的其它文件;
关系获取子模块,用于将所述各个代码文件与所述各个代码文件各自的依赖文件之间的对应关系获取为所述各个代码文件之间的依赖关系。
8.根据权利要求7所述的装置,其特征在于,所述查询子模块,用于将所述抽象语法树中第一个arguments对象的值获取为文件名,将所述文件名对应的文件确定为所述代码文件的依赖文件。
9.根据权利要求7所述的装置,其特征在于,所述目标程序生成模块,包括:
输出函数生成子模块,用于生成所述目标程序的输出函数;
递归函数生成子模块,用于生成所述目标程序的递归函数,所述递归函数中包含所述各个代码文件各自对应的代码模块,所述递归函数用于递归执行所述各个代码模块。
10.根据权利要求9所述的装置,其特征在于,所述递归函数生成子模块,包括:
第一生成子模块,用于对于所述各个代码文件中的每一个代码文件,根据所述代码文件以及所述代码文件的依赖文件,生成所述代码文件对应的代码模块;所述代码模块中包含所述代码文件,以及所述代码模块所引用的其它代码模块的标识;所述其它代码模块为所述代码文件的依赖文件所对应的代码模块;
第二生成子模块,用于生成模块依赖字典,所述模块依赖字典中包含所述各个代码文件对应的代码模块;
第三生成子模块,用于生成以所述模块依赖字典为值的递归函数。
11.一种程序生成装置,其特征在于,所述装置包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为:
获取原程序,所述原程序是用于在服务器端执行的Java脚本JavaScript程序,所述原程序中包含两个或者两个以上的代码文件;
采用词法分析方式对所述原程序中的各个代码文件进行代码分析;
根据分析结果获得所述各个代码文件之间的依赖关系;
根据所述各个代码文件以及所述各个代码文件之间的依赖关系生成目标程序,所述目标程序是用于在浏览器端执行的JavaScript程序。
CN201510378982.2A 2015-06-30 2015-06-30 程序生成方法及装置 Active CN104991773B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201510378982.2A CN104991773B (zh) 2015-06-30 2015-06-30 程序生成方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510378982.2A CN104991773B (zh) 2015-06-30 2015-06-30 程序生成方法及装置

Publications (2)

Publication Number Publication Date
CN104991773A true CN104991773A (zh) 2015-10-21
CN104991773B CN104991773B (zh) 2018-05-08

Family

ID=54303589

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510378982.2A Active CN104991773B (zh) 2015-06-30 2015-06-30 程序生成方法及装置

Country Status (1)

Country Link
CN (1) CN104991773B (zh)

Cited By (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106775781A (zh) * 2017-02-17 2017-05-31 北京金山安全软件有限公司 减小应用安装包的方法、装置及电子设备
CN106843820A (zh) * 2015-12-04 2017-06-13 阿里巴巴集团控股有限公司 代码处理方法和装置
CN107193622A (zh) * 2017-05-16 2017-09-22 北京小米移动软件有限公司 代码编译的处理方法、装置及终端
CN107391528A (zh) * 2016-03-30 2017-11-24 阿里巴巴集团控股有限公司 前端组件依赖信息搜索方法及设备
CN107665124A (zh) * 2017-09-14 2018-02-06 广东神马搜索科技有限公司 模块化JavaScript文件处理方法、设备和服务器
CN107704234A (zh) * 2017-08-22 2018-02-16 北京三快在线科技有限公司 前端工程构建方法、装置、电子设备及可读存储介质
CN108121578A (zh) * 2017-12-29 2018-06-05 东软集团股份有限公司 生成应用程序的方法、装置和存储介质以及电子设备
CN108965295A (zh) * 2018-07-17 2018-12-07 郑州云海信息技术有限公司 一种文件压缩合并方法及相关装置
CN109388403A (zh) * 2018-09-26 2019-02-26 广州视源电子科技股份有限公司 依赖注入方法、装置、设备和存储介质
CN109960497A (zh) * 2017-12-26 2019-07-02 北京高德云图科技有限公司 一种脚本文件间的调用方法及装置
CN110362792A (zh) * 2019-07-05 2019-10-22 五八有限公司 将rn文件转换为小程序文件的方法、装置及转换设备
CN110489128A (zh) * 2019-08-23 2019-11-22 第四范式(北京)技术有限公司 将特征计算脚本转换成底层程序代码的方法和设备
CN110795069A (zh) * 2018-08-02 2020-02-14 Tcl集团股份有限公司 代码分析方法、智能终端及计算机可读存储介质
CN110888645A (zh) * 2019-10-12 2020-03-17 贝壳技术有限公司 一种转换为小程序的方法、装置和存储介质
CN111309332A (zh) * 2020-02-11 2020-06-19 北京达佳互联信息技术有限公司 文件内容按需加载方法、装置及电子设备、存储介质
CN113391812A (zh) * 2020-03-13 2021-09-14 阿里巴巴集团控股有限公司 应用程序模块的分析方法、装置以及分析工具
CN114721657A (zh) * 2021-01-04 2022-07-08 中国移动通信有限公司研究院 一种多线程程序实现方法、装置及相关设备

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20110119652A1 (en) * 2009-11-16 2011-05-19 Limin Yu Generating object annotations
CN102779029A (zh) * 2011-05-10 2012-11-14 北京磊友信息科技有限公司 一种对JavaScript代码加扰的方法及设备
US8972932B2 (en) * 2007-08-08 2015-03-03 International Business Machines Corporation Method, framework, and program product for formatting and serving web content

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8972932B2 (en) * 2007-08-08 2015-03-03 International Business Machines Corporation Method, framework, and program product for formatting and serving web content
US20110119652A1 (en) * 2009-11-16 2011-05-19 Limin Yu Generating object annotations
CN102779029A (zh) * 2011-05-10 2012-11-14 北京磊友信息科技有限公司 一种对JavaScript代码加扰的方法及设备

Cited By (25)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106843820A (zh) * 2015-12-04 2017-06-13 阿里巴巴集团控股有限公司 代码处理方法和装置
CN106843820B (zh) * 2015-12-04 2020-08-04 阿里巴巴集团控股有限公司 代码处理方法和装置
CN107391528A (zh) * 2016-03-30 2017-11-24 阿里巴巴集团控股有限公司 前端组件依赖信息搜索方法及设备
CN107391528B (zh) * 2016-03-30 2021-04-20 阿里巴巴集团控股有限公司 前端组件依赖信息搜索方法及设备
CN106775781A (zh) * 2017-02-17 2017-05-31 北京金山安全软件有限公司 减小应用安装包的方法、装置及电子设备
CN107193622B (zh) * 2017-05-16 2020-03-17 北京小米移动软件有限公司 代码编译的处理方法、装置及终端
CN107193622A (zh) * 2017-05-16 2017-09-22 北京小米移动软件有限公司 代码编译的处理方法、装置及终端
CN107704234A (zh) * 2017-08-22 2018-02-16 北京三快在线科技有限公司 前端工程构建方法、装置、电子设备及可读存储介质
CN107665124A (zh) * 2017-09-14 2018-02-06 广东神马搜索科技有限公司 模块化JavaScript文件处理方法、设备和服务器
CN107665124B (zh) * 2017-09-14 2021-04-20 阿里巴巴(中国)有限公司 模块化JavaScript文件处理方法、设备和服务器
CN109960497A (zh) * 2017-12-26 2019-07-02 北京高德云图科技有限公司 一种脚本文件间的调用方法及装置
CN108121578A (zh) * 2017-12-29 2018-06-05 东软集团股份有限公司 生成应用程序的方法、装置和存储介质以及电子设备
CN108965295A (zh) * 2018-07-17 2018-12-07 郑州云海信息技术有限公司 一种文件压缩合并方法及相关装置
CN108965295B (zh) * 2018-07-17 2021-09-17 郑州云海信息技术有限公司 一种文件压缩合并方法及相关装置
CN110795069A (zh) * 2018-08-02 2020-02-14 Tcl集团股份有限公司 代码分析方法、智能终端及计算机可读存储介质
CN109388403B (zh) * 2018-09-26 2022-04-05 广州视源电子科技股份有限公司 依赖注入方法、装置、设备和存储介质
CN109388403A (zh) * 2018-09-26 2019-02-26 广州视源电子科技股份有限公司 依赖注入方法、装置、设备和存储介质
CN110362792A (zh) * 2019-07-05 2019-10-22 五八有限公司 将rn文件转换为小程序文件的方法、装置及转换设备
CN110362792B (zh) * 2019-07-05 2023-05-23 五八有限公司 将rn文件转换为小程序文件的方法、装置及转换设备
CN110489128A (zh) * 2019-08-23 2019-11-22 第四范式(北京)技术有限公司 将特征计算脚本转换成底层程序代码的方法和设备
CN110489128B (zh) * 2019-08-23 2023-08-29 第四范式(北京)技术有限公司 将特征计算脚本转换成底层程序代码的方法和设备
CN110888645A (zh) * 2019-10-12 2020-03-17 贝壳技术有限公司 一种转换为小程序的方法、装置和存储介质
CN111309332A (zh) * 2020-02-11 2020-06-19 北京达佳互联信息技术有限公司 文件内容按需加载方法、装置及电子设备、存储介质
CN113391812A (zh) * 2020-03-13 2021-09-14 阿里巴巴集团控股有限公司 应用程序模块的分析方法、装置以及分析工具
CN114721657A (zh) * 2021-01-04 2022-07-08 中国移动通信有限公司研究院 一种多线程程序实现方法、装置及相关设备

Also Published As

Publication number Publication date
CN104991773B (zh) 2018-05-08

Similar Documents

Publication Publication Date Title
CN104991773A (zh) 程序生成方法及装置
CN106843869B (zh) 一种前端开发工程化系统和方法
CN113010181B (zh) 一种深度学习框架之中算子的部署方法、装置及电子设备
CN109597618B (zh) 程序开发方法、装置、计算机设备及存储介质
CN109032631B (zh) 应用程序补丁包获取方法、装置、计算机设备及存储介质
Herrera et al. Numerical computing on the web: Benchmarking for the future
CN106648755B (zh) 一种在安卓art环境中动态加载dex的方法及装置
CN108197027B (zh) 软件性能优化方法、可存储介质、计算机、计算机程序
CN112965720B (zh) 一种组件编译方法、装置、设备及计算机可读存储介质
CN103412754A (zh) 动态语言代码执行方法和装置
CN103488517A (zh) Php代码编译方法、php代码运行方法及装置
CN114064601B (zh) 存储过程转换方法、装置、设备和存储介质
CN112947960A (zh) 一种基于机器学习的风险模型部署方法及系统
US9116714B2 (en) Methods and systems for file processing
CN115686606A (zh) 一种项目依赖树的展示方法、装置、系统及介质
CN111580821B (zh) 脚本绑定方法、装置、电子设备及计算机可读存储介质
CN106681781A (zh) 实时计算业务的实现方法和系统
Mirandola et al. UML based performance modeling of distributed systems
CN116149726A (zh) 增量代码分析方法、装置、设备及介质
CN112650502A (zh) 批处理任务处理方法、装置、计算机设备和存储介质
CN114741294A (zh) 一种页面的调试方法、装置、设备及存储介质
CN113360373A (zh) 一种移动应用Activity页面全遍历的测试方法
CN112527314A (zh) 项目代码自动优化方法、装置、设备及介质
JP2022542007A (ja) テスト・ベクタを使用した高水準コンストラクトの最適化の自動検証
Cvijić et al. From. NET Core to. NET 8: A Comprehensive Analysis of Performance, Features, and Migration Pathways

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C41 Transfer of patent application or patent right or utility model
TA01 Transfer of patent application right

Effective date of registration: 20160701

Address after: 100085, Haidian District, Beijing Qinghe Street No. 68, Huarun colorful city shopping center two, 9 layers

Applicant after: Millet Communication Technology Co Ltd

Address before: 100085 Beijing city Haidian District Qinghe Street No. 68 Huarun colorful city shopping center two floor 13

Applicant before: Xiaomi Technology Co., Ltd.

GR01 Patent grant
GR01 Patent grant