CN113778451A - 文件加载方法、装置、计算机系统和计算机可读存储介质 - Google Patents

文件加载方法、装置、计算机系统和计算机可读存储介质 Download PDF

Info

Publication number
CN113778451A
CN113778451A CN202011289598.2A CN202011289598A CN113778451A CN 113778451 A CN113778451 A CN 113778451A CN 202011289598 A CN202011289598 A CN 202011289598A CN 113778451 A CN113778451 A CN 113778451A
Authority
CN
China
Prior art keywords
file
target
source
compiling
module
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
CN202011289598.2A
Other languages
English (en)
Other versions
CN113778451B (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.)
Beijing Jingdong Century Trading Co Ltd
Beijing Wodong Tianjun Information Technology Co Ltd
Original Assignee
Beijing Jingdong Century Trading Co Ltd
Beijing Wodong Tianjun Information Technology 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 Beijing Jingdong Century Trading Co Ltd, Beijing Wodong Tianjun Information Technology Co Ltd filed Critical Beijing Jingdong Century Trading Co Ltd
Priority to CN202011289598.2A priority Critical patent/CN113778451B/zh
Publication of CN113778451A publication Critical patent/CN113778451A/zh
Application granted granted Critical
Publication of CN113778451B publication Critical patent/CN113778451B/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/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/425Lexical analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading

Landscapes

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

Abstract

本公开提供了一种文件加载方法、装置、计算机系统和计算机可读存储介质。该方法包括:获取以第一文件名命名的源文件,其中,源文件的文件类型为第一文件类型;对源文件进行编译,得到文件类型为第二文件类型的目标文件,其中,目标文件以第一文件名命名;以及在目标项目中引用源文件的位置,将源文件替换为目标文件。

Description

文件加载方法、装置、计算机系统和计算机可读存储介质
技术领域
本公开涉及计算机技术领域,更具体地,涉及一种文件加载方法、装置、计算机系统和计算机可读存储介质。
背景技术
随着计算机技术的快速发展,提高了项目完成的效率。
在实现本公开构思的过程中,发明人发现相关技术中至少存在如下问题,开发人员编写的计算机程序的后续实施过程包括编译和集成两个过程,因编泽一般会伴随着计算机程序的函数名改变,导致程序集成至项目中时存在引用复杂的问题。
发明内容
有鉴于此,本公开提供了一种文件加载方法、装置、计算机系统和计算机可读存储介质。
本公开的一个方面提供了一种文件加载方法,包括:获取以第一文件名命名的源文件,其中,所述源文件的文件类型为第一文件类型;对所述源文件进行编译,得到文件类型为第二文件类型的目标文件,其中,所述目标文件以所述第一文件名命名;以及在目标项目中引用所述源文件的位置,将所述源文件替换为所述目标文件。
根据本公开的实施例,所述对所述源文件进行编译,得到文件类型为第二文件类型的目标文件包括:对所述源文件进行编译,得到以第二文件名命名的机器码文件,其中,所述机器码文件的文件类型为所述第二文件类型;将所述机器码文件的所述第二文件名替换为与所述机器码文件对应的所述源文件的所述第一文件名;以及将具有所述第一文件名的所述机器码文件作为所述目标文件。
根据本公开的实施例,所述对所述源文件进行编译,得到以第二文件名命名的机器码文件包括:将所述源文件输入至词法分析器,生成分析后的字符流文件;将所述分析后的字符流文件输入至语法分析器,生成语法树文件;将所述语法树文件输入至语义分析器,以判断所述语法树文件的逻辑是否正确;以及在判断所述语法树文件的逻辑正确的情况下,将所述语法树文件输入至编译器,生成所述机器码文件。
根据本公开的实施例,在所述在目标项目中引用所述源文件的位置,将所述源文件替换为所述目标文件之后,还包括:将所述目标文件转换为字节数组文件;对所述字节数组文件进行合法性验证;在验证合法的情况下,对所述字节数组文件进行编译并实例化,生成实例文件;以及将所述实例文件加载至所述目标项目中。
根据本公开的实施例,所述在验证合法的情况下,对所述字节数组文件进行编译并实例化,生成实例文件包括:对所述字节数组文件进行编译,生成未实例化的模块;将所述未实例化的模块进行实例化,生成所述实例文件。
根据本公开的实施例,所述将所述实例文件加载至所述目标项目中还包括:通过胶水文件对所述实例文件进行封装,得到胶水文件类;以及将所述胶水文件类加载至所述目标项目中。
本公开的另一个方面提供了一种文件加载装置,包括:获取模块,用于获取以第一文件名命名的源文件,其中,所述源文件的文件类型为第一文件类型;编译模块,用于对所述源文件进行编译,得到文件类型为第二文件类型的目标文件,其中,所述目标文件以所述第一文件名命名;以及替换模块,用于在目标项目中引用所述源文件的位置,将所述源文件替换为所述目标文件。
根据本公开的实施例,所述编译模块包括:第一编译子模块,用于对所述源文件进行编译,得到以第二文件名命名的机器码文件,其中,所述机器码文件的文件类型为所述第二文件类型;替换子模块,用于将所述机器码文件的所述第二文件名替换为与所述机器码文件对应的所述源文件的所述第一文件名;以及定义子模块,用于将具有所述第一文件名的所述机器码文件作为所述目标文件。
根据本公开的实施例,所述第一编译子模块包括:第一生成单元,用于将所述源文件输入至词法分析器,生成分析后的字符流文件;第二生成单元,用于将所述分析后的字符流文件输入至语法分析器,生成语法树文件;第三生成单元,用于将所述语法树文件输入至语义分析器,以判断所述语法树文件的逻辑是否正确;以及第四生成单元,用于在判断所述语法树文件的逻辑正确的情况下,将所述语法树文件输入至编译器,生成所述机器码文件。
根据本公开的实施例,上述装置还包括:转换模块,用于将所述目标文件转换为字节数组文件;验证模块,用于对所述字节数组文件进行合法性验证;实例化模块,用于在验证合法的情况下,对所述字节数组文件进行编译并实例化,生成实例文件;以及加载模块,用于将所述实例文件加载至所述目标项目中。
根据本公开的实施例,所述实例化模块包括:第二编译子模块,用于对所述字节数组文件进行编译,生成未实例化的模块;以及实例化子模块,用于将所述未实例化的模块进行实例化,生成所述实例文件。
根据本公开的实施例,所述加载模块包括:封装单元,用于通过胶水文件对所述实例文件进行封装,得到胶水文件类;以及加载单元,用于将所述胶水文件类加载至所述目标项目中。
本公开的另一方面提供了一种计算机系统,包括:一个或多个处理器;存储器,用于存储一个或多个程序,其中,当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现如上所述的方法。
本公开的另一方面提供了一种计算机可读存储介质,其上存储有计算机可执行指令,所述指令在被执行时用于实现如上所述的方法。
本公开的另一方面提供了一种计算机程序,所述计算机程序包括计算机可执行指令,所述指令在被执行时用于实现如上所述的方法。
根据本公开的实施例,通过采用了获取以第一文件名命名的源文件,其中,源文件的文件类型为第一文件类型;对源文件进行编译,得到文件类型为第二文件类型的目标文件,其中,目标文件以第一文件名命名;以及在目标项目中引用源文件的位置,将源文件替换为目标文件的技术手段,由于得到的目标文件的文件名和源文件的文件名相同,可以直接根据源文件确定目标文件,从而将目标项目中的源文件可以直接替换为目标文件,所以至少部分地克服了程序集成到项目中时的引用复杂且集成过程需要大量的人工操作的技术问题,进而达到了可减少程序集成过程的人工劳动力的技术效果。
附图说明
通过以下参照附图对本公开实施例的描述,本公开的上述以及其他目的、特征和优点将更为清楚,在附图中:
图1示意性示出了根据本公开实施例的可以应用文件加载方法的示例性系统架构;
图2示意性示出了根据本公开实施例的文件加载方法的流程图;
图3示意性示出了根据本公开实施例的源文件编译得到机器码文件的流程图;
图4示意性示出了根据图3实施例的源文件编译得到机器码文件的具体流程图;
图5示意性示出了根据本公开实施例的目标文件集成至目标项目的流程图;
图6示意性示出了根据图5实施例的目标文件集成至目标项目的具体流程图;
图7示意性示出了根据本公开的实施例的文件加载装置的框图;以及
图8示意性示出了根据本公开实施例的适于实现文件加载方法的计算机系统的框图。
具体实施方式
以下,将参照附图来描述本公开的实施例。但是应该理解,这些描述只是示例性的,而并非要限制本公开的范围。在下面的详细描述中,为便于解释,阐述了许多具体的细节以提供对本公开实施例的全面理解。然而,明显地,一个或多个实施例在没有这些具体细节的情况下也可以被实施。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本公开的概念。
在此使用的术语仅仅是为了描述具体实施例,而并非意在限制本公开。在此使用的术语“包括”、“包含”等表明了所述特征、步骤、操作和/或部件的存在,但是并不排除存在或添加一个或多个其他特征、步骤、操作或部件。
在此使用的所有术语(包括技术和科学术语)具有本领域技术人员通常所理解的含义,除非另外定义。应注意,这里使用的术语应解释为具有与本说明书的上下文相一致的含义,而不应以理想化或过于刻板的方式来解释。
在使用类似于“A、B和C等中至少一个”这样的表述的情况下,一般来说应该按照本领域技术人员通常理解该表述的含义来予以解释(例如,“具有A、B和C中至少一个的系统”应包括但不限于单独具有A、单独具有B、单独具有C、具有A和B、具有A和C、具有B和C、和/或具有A、B、C的系统等)。在使用类似于“A、B或C等中至少一个”这样的表述的情况下,一般来说应该按照本领域技术人员通常理解该表述的含义来予以解释(例如,“具有A、B或C中至少一个的系统”应包括但不限于单独具有A、单独具有B、单独具有C、具有A和B、具有A和C、具有B和C、和/或具有A、B、C的系统等)。
一个完整项目的实现,通常需要不同的开发人员分块编写相应模块的程序,再将各模块程序集成得到该项目。
发明人在实现本公开构思的过程中还发现,在程序集成得到项目的过程中,需要首先通过命令行工具进行编译,而编译过程一般伴随有函数名压缩,因此编译结果一般会使程序的原定函数名发生改变,导致项目中不同模块的程序中的函数名可能不统一,致使程序集成得到的项目中存在引用复杂而可能进一步导致项目无法正常运行等问题。针对此问题,通常需要通过人为手动的方式的实现该集成过程,浪费时间和人力。
本公开的实施例提供了一种文件加载方法、装置、计算机系统和计算机可读存储介质。该方法包括获取以第一文件名命名的源文件,其中,源文件的文件类型为第一文件类型;对源文件进行编译,得到文件类型为第二文件类型的目标文件,其中,目标文件以第一文件名命名;以及在目标项目中引用源文件的位置,将源文件替换为目标文件。
图1示意性示出了根据本公开实施例的可以应用文件加载方法的示例性系统架构100。需要注意的是,图1所示仅为可以应用本公开实施例的系统架构的示例,以帮助本领域技术人员理解本公开的技术内容,但并不意味着本公开实施例不可以用于其他设备、系统、环境或场景。
如图1所示,根据该实施例的系统架构100可以包括终端设备101、102、103,网络104和服务器105。网络104用以在终端设备101、102、103和服务器105之间提供通信链路的介质。网络104可以包括各种连接类型,例如有线和/或无线通信链路等等。
用户可以使用终端设备101、102、103通过网络104与服务器105交互,以接收或发送消息等。终端设备101、102、103可以是安装有各种系统的设备,例如Linux系统、Windows系统、android系统和/或iOS系统等,各类型系统的终端设备101、102、103上可以安装有各种命令行工具,例如C/C++编译器、Java编译器等,这些编译器例如可以包括Visual C++、Clang、GCC等适用于C/C++的编译器,JDK、MyEclipse等适用于Java的开发环境或编译器,以及IDLE等适用于Python的集成开发环境等。
终端设备101、102、103可以是具有显示屏并且支持程序类文件运行的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机和台式计算机等等。
服务器105可以是提供各种服务的服务器,例如对用户利用终端设备101、102、103所运行的程序类文件提供数据支持的后台管理服务器。后台管理服务器可以对接收到的程序请求进行分析等处理,并将所请求结果反馈给终端设备。
需要说明的是,本公开实施例所提供的文件加载方法一般可以由服务器105执行。相应地,本公开实施例所提供的文件加载装置一般可以设置于服务器105中。本公开实施例所提供的文件加载方法也可以由不同于服务器105且能够与终端设备101、102、103和/或服务器105通信的服务器或服务器集群执行。相应地,本公开实施例所提供的文件加载装置也可以设置于不同于服务器105且能够与终端设备101、102、103和/或服务器105通信的服务器或服务器集群中。或者,本公开实施例所提供的文件加载方法也可以由终端设备101、102、或103执行,或者也可以由不同于终端设备101、102、或103的其他终端设备执行。相应地,本公开实施例所提供的文件加载装置也可以设置于终端设备101、102、或103中,或设置于不同于终端设备101、102、或103的其他终端设备中。
例如,源文件和目标项目可以原本存储在终端设备101、102、或103中的任意一个或任意多个(例如,终端设备101,但不限于此)之中,或者存储在外部存储设备上并可以导入到终端设备101中。然后,终端设备101可以在本地执行本公开实施例所提供的文件加载方法,或者将源文件和/或目标项目发送到其他终端设备、服务器、或服务器集群,并由接收该源文件或目标项目的其他终端设备、服务器、或服务器集群来执行本公开实施例所提供的文件加载方法。
应该理解,图1中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。
根据本公开的实施例,一个完整项目的实现,例如可以包括由不同开发人员开发的一个或多个主程序、以及由该一个或多个主程序衍生出来的一个或多个子程序的集成。一般地,需要将子程序或主程序集成到项目中以完成该项目的整体实现,例入可以为将子程序集成到项目的主程序中得到一个完整的项目实现方案,或者可以为将多个子程序或主程序集成到一起得到一个完整的项目实现方案,其中,该主程序和子程序例如可以为已编译或未编译的程序。
根据本公开的实施例,实现项目的计算机编程语言例如可以包括Java(面向对象的计算机程序设计语言)、Python(计算机程序设计语言)、C(计算机通用程序设计语言)、C++(面向对象的计算机程序设计语言)、C#(面向对象的高级程序设计语言)等。
图2示意性示出了根据本公开实施例的文件加载方法的流程图。
如图2所示,该方法包括操作S201~S203。
在操作S201,获取以第一文件名命名的源文件,其中,源文件的文件类型为第一文件类型。
根据本公开的实施例,源文件例如可以为上述的主程序或子程序,以C++程序实现项目为例,该源文件例如可以为C++代码文件。
在操作S202,对源文件进行编译,得到文件类型为第二文件类型的目标文件,其中,目标文件以第一文件名命名。
根据本公开的实施例,通过命令行工具实现上述编译过程,例如可以为通过C++编译器完成对上述C++代码的编译,得到编译结果,并将该编译结果作为上述目标文件。
在操作S203,在目标项目中引用源文件的位置,将源文件替换为目标文件。
根据本公开的实施例,目标项目例如可以为集成了已编译或未经编译的一个或多个上述子程序和/或主程序的项目,对于目标项目中尚存的引用类源文件,可以直接替换为目标文件,从而完成项目的正确实施。
通过本公开的上述实施例,由于编译后的目标文件的文件名与源文件的文件名一致,可以将相关位置处的源文件直接替换为目标文件,解决了集成在目标项目中的不同程序间引用复杂的技术问题。
根据本公开的上述实施例,上述直接替换的过程例如可以为通过设计脚本程序的方式实现,减少了手动操作的复杂性,从而可进一步节省人力和时间上的成本。
需要说明的是,实现上述操作S201~S203的脚本程序例如可以基于webpack(一种前端资源加载/打包工具)、Python或nodejs(一种开发平台)等实现。
根据本公开的实施例,利用前端项目中WebAssembly可以直接引用.cpp文件,并调用.cpp函数暴露的方法,编译得到.wasm目标文件的优势,源文件仍以.cpp文件为例,目标文件仍以.wasm文件为例,以下结合具体实施例,并参考图3~图4,对图2所示的方法做进一步说明。
根据本公开的实施例,上述操作S201中,以源文件为C++代码文件为例,上述第一文件名例如可以为fun,第一文件类型例如可以为.cpp,据此得到的上述源文件例如可以为fun.cpp。
根据本公开的实施例,上述操作S202进一步包括:对源文件进行编译,得到以第二文件名命名的机器码文件,其中,机器码文件的文件类型为第二文件类型;将机器码文件的第二文件名替换为与机器码文件对应的源文件的第一文件名;以及将具有第一文件名的机器码文件作为目标文件。
根据本公开的上述实施例,编译后得到的第二文件名例如可以为_fun或@fun等,第二文件类型例如可以为使用WebAssembly(Web的汇编语言)得到的.wasm类型,据此得到的机器码文件例如可以为_fun.wasm或@fun.wasm。通过设计脚本语言,将该机器码文件的第二文件名(即_fun或@fun)替换为与源文件相同的第一文件名(即fun),以得到与源文件的文件名相同的目标文件fun.wasm。
通过本公开的上述实施例,由于根据源文件fun.cpp的文件名fun可以直接确定其编译后对应的目标文件fun.wasm,从而可据此设计脚本程序(例如可以结合webpack)将目标项目中的源文件相关信息直接修改为目标文件相关信息,实现目标项目的无差错实施,并可同时节省人力操作。
图3示意性示出了根据本公开实施例的源文件编译得到机器码文件的流程图。
图4示意性示出了根据图3实施例的源文件编译得到机器码文件的具体流程图。
图4所示流程是webpack进行打包时,读取.cpp源文件,进行编译,生成机器码文件,并保存为.wasm目标文件到目标项目中,替换对应.cpp源文件在目标项目中的引用路径,更改为.wasm目标文件的路径。
如图3所示,陔方法包括操作S301~S304。
在操作S301,将源文件输入至词法分析器,生成分析后的字符流文件。
根据本公开的实施例,如图4所示,基于webpack,首先读取.cpp源文件,并将读取的字节流放入cpploader(即cpp程序入口点),然后使用cpp词法分析器进行词法分析,主要识别源文件中的关键字、识别符、字面量、特殊符号,以得到词法分析处理后的字符流文件(记号字符流)。
在操作S302,将分析后的字符流文件输入至语法分析器,生成语法树文件。
根据本公开的实施例,如图4所示,操作S301输出得到的词法分析处理后的记号字符流输入至cpp语法分析器,以转换得到AST语法树(即语法树文件)。
在操作S303,将语法树文件输入至语义分析器,以判断语法树文件的逻辑是否正确。
根据本公开的实施例,如图4所示,语义分析器接收操作S302得到的AST语法树,并遍历该AST语法树,保证语意的正确性。
根据本公开的上述实施例,在上述语义分析器检测发现逻辑错误的情况下,终止该过程,并在控制台显示错误信息。
在操作S304,在判断语法树文件的逻辑正确的情况下,将语法树文件输入至编译器,生成机器码文件。
根据本公开的实施例,如图4所示,在上述语义分析器检测得到逻辑正确的情况下,将上述AST语法树继续传输给编译器重新遍历及编译,以得到生成的机器码。
根据本公开的上述实施例,可以将生成的上述机器码保存在本地,由此得到的.wasm目标文件与.cpp源文件存储在不同的路径下,基于此,在实现上述操作S203的过程中,需要将目标项目中引用的.cpp源文件对应的文件路径替换为该源文件编译得到的.wasm目标文件的文件路径。
需要说明的是,在保存至本地的过程中,上述机器码也可以直接使用和.cpp源文件相同的文件名,直接保存为.wasm目标文件,在该种情况下,可直接得到上述操作S202中的目标文件(即具有第一文件名的机器码文件),而无需再进行后续的文件名替换的操作。
图5示意性示出了根据本公开实施例的目标文件集成至目标项目的流程图。
图6示意性示出了根据图5实施例的目标文件集成至目标项目的具体流程图。
如图5所示,该方法包括操作S501~S506。
根据本公开的实施例,如图6所示,在执行操作S501~S506之前,首先通过Fetch()函数,获取wasm代码(即WebAssembly代码)。
在操作S501,将目标文件转换为字节数组文件。
根据本公开的实施例,如图6所示,生成一个线程worker,在线程内部使用http请求,请求生成的.wasm目标文件,通过将目标文件读取到arrayBuffer(数组缓冲区)中,实现将目标文件转换为buffer(即字节数组文件,以二进制形式存在)的过程。
在操作S502,对字节数组文件进行合法性验证。
根据本公开的实施例,如图6所示,该合法性验证主要用于校验操作S501得到的buffer是否是合法的wasm代码,通过WebAssembly.validate()这一方法实现,验证结果为输出布尔值(true或者false)。在输出为false的情况下,抛出异常;在输出为true的情况下,进入操作S503。
在操作S503,对字节数组文件进行编译并实例化,生成实例文件。
根据本公开的实施例,如图6所示,该编译并实例化的过程例如可以为通过WebAssembly.instantiate(buffer,importObj)这一方法实现,用于编译并实例化上述WebAssembly的二进制代码buffer,以生成有状态、可执行的实例化模块module(即该实例文件),其中,importObj作为一个导入对象供buffer使用。
需要说明的是,根据本公开的实施例,上述编译并实例化的过程还可以替换为通过编译过程和实例化过程两个过程来实现,即上述操作S503例如可以替换为如下的操作S504~S505。
在操作S504,对字节数组文件进行编译,生成未实例化的模块。
根据本公开的实施例,如图6所示,该编译过程的程序表示例如可以为:letmodule=WebAssembly.compile(buffer),该程序使用WebAssembly对象,对buffer进行编译,实现将WebAssembly的二进制代码buffer编译为未实例化的模块module’,即在内存中生成module’。在部分情况下,其中的WebAssembly.compile()这一方法例如还可以替换为WebAssembly.Module()。
在操作S505,将未实例化的模块进行实例化,生成实例文件。
根据本公开的实施例,如图6所示,该实例化过程的程序表示例如可以为:letinstance=WebAssembly.instance(module),该程序用于为上述未实例化的模块module’创建一个新的WebAssembly的实例对象instance,以得到实例化的模块module(即实例文件),其中,WebAssembly.instance()中例如也可以包括一个供module使用的importObj导入对象,WebAssembly.instance()例如还可以替换为WebAssembly.instantiate()。
在操作S506,将实例文件加载至目标项目中。
根据本公开的实施例,该操作S506包括:通过胶水文件对实例文件进行封装,得到胶水文件类;以及将胶水文件类加载至目标项目中。
根据本公开的实施例,如图6所示,胶水文件例如可以为通过上述的导入对象importObj实现,对于该导入对象importObj,存在一个与其匹配的属性instance.exports,通过instance.exports属性可以调用实例文件上返回的可用信息,然后例如可以将该可用信息封装为胶水文件类,供主函数(如JS操作形成的目标项目)引用。
根据本公开的上述实施例,主线程监听worker加载完成的时间,当WebAssembly实例化后,主线程引入实例文件module,从而通过调用上述胶水文件封装得到的胶水文件类的方法,实现对WebAssembly内部函数的间接调用。其中,胶水文件封装得到的胶水文件类的方法例如可以为,引入胶水文件加载上述wasm代码,并将该wasm代码加载后的函数暴露出来供胶水文件调用并封装得到胶水文件类。外部可直接调用该封装好的胶水文件类。
需要说明的是,上述操作S501~S506中,操作S503和操作S504~S505可同时存在,也可不同时存在,在此不做限定。
通过本公开的上述实施例,由于得到的目标文件和源文件的文件名相同,而且可以通过脚本程序的设计直接或间接的将源文件编译得到的机器码文件确定为目标文件,从而可以将一般存在的源文件编译得到机器码文件和目标文件集成至目标项目这两个过程合并至一个流程实现,并可结合胶水文件的封装方法实现目标项目可以直接调用编译后的源文件信息,简化了人工操作,节省了时间成本。
图7示意性示出了根据本公开的实施例的文件加载装置的框图。
如图7所示,文件加载装置700包括获取模块710、编译模块720和替换模块730。
获取模块710,用于获取以第一文件名命名的源文件,其中,源文件的文件类型为第一文件类型。
编译模块720,用于对源文件进行编译,得到文件类型为第二文件类型的目标文件,其中,目标文件以第一文件名命名。
替换模块730,用于在目标项目中引用源文件的位置,将源文件替换为目标文件。
根据本公开的实施例,上述编译模块包括第一编译子模块、替换子模块和定义子模块。
第一编译子模块,用于对源文件进行编译,得到以第二文件名命名的机器码文件,其中,机器码文件的文件类型为第二文件类型。
替换子模块,用于将机器码文件的第二文件名替换为与机器码文件对应的源文件的第一文件名。
定义子模块,用于将具有第一文件名的机器码文件作为目标文件。
根据本公开的实施例,上述第一编译子模块包括第一生成单元、第二生成单元、第三生成单元和第四生成单元。
第一生成单元,用于将源文件输入至词法分析器,生成分析后的字符流文件。
第二生成单元,用于将分析后的字符流文件输入至语法分析器,生成语法树文件。
第三生成单元,用于将语法树文件输入至语义分析器,以判断语法树文件的逻辑是否正确。
第四生成单元,用于在判断语法树文件的逻辑正确的情况下,将语法树文件输入至编译器,生成机器码文件。
根据本公开的实施例,上述文件加载装置还包括转换模块、验证模块、实例化模块和加载模块。
转换模块,用于将目标文件转换为字节数组文件。
验证模块,用于对字节数组文件进行合法性验证。
实例化模块,用于在验证合法的情况下,对字节数组文件进行编译并实例化,生成实例文件。
加载模块,用于将实例文件加载至目标项目中。
根据本公开的实施例,上述实例化模块包括第二编译子模块和实例化子模块。
第二编译子模块,用于对字节数组文件进行编译,生成未实例化的模块。
实例化子模块,用于将未实例化的模块进行实例化,生成实例文件。
根据本公开的实施例,上述加载模块包括封装单元和加载单元。
封装单元,用于通过胶水文件对实例文件进行封装,得到胶水文件类。
加载单元,用于将胶水文件类加载至目标项目中。
根据本公开的实施例的模块、子模块、单元中的任意多个、或其中任意多个的至少部分功能可以在一个模块中实现。根据本公开实施例的模块、子模块、单元中的任意一个或多个可以被拆分成多个模块来实现。根据本公开实施例的模块、子模块、单元中的任意一个或多个可以至少被部分地实现为硬件电路,例如现场可编程门阵列(FPGA)、可编程逻辑阵列(PLA)、片上系统、基板上的系统、封装上的系统、专用集成电路(ASIC),或可以通过对电路进行集成或封装的任何其他的合理方式的硬件或固件来实现,或以软件、硬件以及固件三种实现方式中任意一种或以其中任意几种的适当组合来实现。或者,根据本公开实施例的模块、子模块、单元中的一个或多个可以至少被部分地实现为计算机程序模块,当该计算机程序模块被运行时,可以执行相应的功能。
例如,获取模块710、编译模块720和替换模块730中的任意多个可以合并在一个模块/子模块/单元中实现,或者其中的任意一个模块/子模块/单元可以被拆分成多个模块/子模块/单元。或者,这些模块/子模块/单元中的一个或多个模块/子模块/单元的至少部分功能可以与其他模块/子模块/单元的至少部分功能相结合,并在一个模块/子模块/单元中实现。根据本公开的实施例,获取模块710、编译模块720和替换模块730中的至少一个可以至少被部分地实现为硬件电路,例如现场可编程门阵列(FPGA)、可编程逻辑阵列(PLA)、片上系统、基板上的系统、封装上的系统、专用集成电路(ASIC),或可以通过对电路进行集成或封装的任何其他的合理方式等硬件或固件来实现,或以软件、硬件以及固件三种实现方式中任意一种或以其中任意几种的适当组合来实现。或者,获取模块710、编译模块720和替换模块730中的至少一个可以至少被部分地实现为计算机程序模块,当该计算机程序模块被运行时,可以执行相应的功能。
需要说明的是,本公开的实施例中文件加载装置部分与本公开的实施例中文件加载方法部分是相对应的,文件加载装置部分的描述具体参考文件加载部分,在此不再赘述。
图8示意性示出了根据本公开实施例的适于实现文件加载方法的计算机系统的框图。图8示出的计算机系统仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图8所示,根据本公开实施例的计算机系统800包括处理器801,其可以根据存储在只读存储器(ROM)802中的程序或者从存储部分808加载到随机访问存储器(RAM)803中的程序而执行各种适当的动作和处理。处理器801例如可以包括通用微处理器(例如CPU)、指令集处理器和/或相关芯片组和/或专用微处理器(例如,专用集成电路(ASIC)),等等。处理器801还可以包括用于缓存用途的板载存储器。处理器801可以包括用于执行根据本公开实施例的方法流程的不同动作的单一处理单元或者是多个处理单元。
在RAM 803中,存储有系统800操作所需的各种程序和数据。处理器801、ROM 802以及RAM 803通过总线804彼此相连。处理器801通过执行ROM 802和/或RAM 803中的程序来执行根据本公开实施例的方法流程的各种操作。需要注意,所述程序也可以存储在除ROM 802和RAM 803以外的一个或多个存储器中。处理器801也可以通过执行存储在所述一个或多个存储器中的程序来执行根据本公开实施例的方法流程的各种操作。
根据本公开的实施例,系统800还可以包括输入/输出(I/O)接口805,输入/输出(I/O)接口805也连接至总线804。系统800还可以包括连接至I/O接口805的以下部件中的一项或多项:包括键盘、鼠标等的输入部分806;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分807;包括硬盘等的存储部分808;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分809。通信部分809经由诸如因特网的网络执行通信处理。驱动器810也根据需要连接至I/O接口805。可拆卸介质811,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器810上,以便于从其上读出的计算机程序根据需要被安装入存储部分808。
根据本公开的实施例,根据本公开实施例的方法流程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读存储介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分809从网络上被下载和安装,和/或从可拆卸介质811被安装。在陔计算机程序被处理器801执行时,执行本公开实施例的系统中限定的上述功能。根据本公开的实施例,上文描述的系统、设备、装置、模块、单元等可以通过计算机程序模块来实现。
本公开还提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施例中描述的设备/装置/系统中所包含的;也可以是单独存在,而未装配入该设备/装置/系统中。上述计算机可读存储介质承载有一个或者多个程序,当上述一个或者多个程序被执行时,实现根据本公开实施例的方法。
根据本公开的实施例,计算机可读存储介质可以是非易失性的计算机可读存储介质。例如可以包括但不限于:便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
例如,根据本公开的实施例,计算机可读存储介质可以包括上文描述的ROM 802和/或RAM 803和/或ROM 802和RAM 803以外的一个或多个存储器。
附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。本领域技术人员可以理解,本公开的各个实施例和/或权利要求中记载的特征可以进行多种组合和/或结合,即使这样的组合或结合没有明确记载于本公开中。特别地,在不脱离本公开精神和教导的情况下,本公开的各个实施例和/或权利要求中记载的特征可以进行多种组合和/或结合。所有这些组合和/或结合均落入本公开的范围。
以上对本公开的实施例进行了描述。但是,这些实施例仅仅是为了说明的目的,而并非为了限制本公开的范围。尽管在以上分别描述了各实施例,但是这并不意味着各个实施例中的措施不能有利地结合使用。本公开的范围由所附权利要求及其等同物限定。不脱离本公开的范围,本领域技术人员可以做出多种替代和修改,这些替代和修改都应落在本公开的范围之内。

Claims (10)

1.一种文件加载方法,包括:
获取以第一文件名命名的源文件,其中,所述源文件的文件类型为第一文件类型;
对所述源文件进行编译,得到文件类型为第二文件类型的目标文件,其中,所述目标文件以所述第一文件名命名;以及
在目标项目中引用所述源文件的位置,将所述源文件替换为所述目标文件。
2.根据权利要求1所述的方法,其中,所述对所述源文件进行编译,得到文件类型为第二文件类型的目标文件包括:
对所述源文件进行编译,得到以第二文件名命名的机器码文件,其中,所述机器码文件的文件类型为所述第二文件类型;
将所述机器码文件的所述第二文件名替换为与所述机器码文件对应的所述源文件的所述第一文件名;以及
将具有所述第一文件名的所述机器码文件作为所述目标文件。
3.根据权利要求2所述的方法,其中,所述对所述源文件进行编译,得到以第二文件名命名的机器码文件包括:
将所述源文件输入至词法分析器,生成分析后的字符流文件;
将所述分析后的字符流文件输入至语法分析器,生成语法树文件;
将所述语法树文件输入至语义分析器,以判断所述语法树文件的逻辑是否正确;以及
在判断所述语法树文件的逻辑正确的情况下,将所述语法树文件输入至编译器,生成所述机器码文件。
4.根据权利要求1所述的方法,其中,在所述在目标项目中引用所述源文件的位置,将所述源文件替换为所述目标文件之后,还包括:
将所述目标文件转换为字节数组文件;
对所述字节数组文件进行合法性验证;
在验证合法的情况下,对所述字节数组文件进行编译并实例化,生成实例文件;以及
将所述实例文件加载至所述目标项目中。
5.根据权利要求4所述的方法,其中,所述在验证合法的情况下,对所述字节数组文件进行编译并实例化,生成实例文件包括:
对所述字节数组文件进行编译,生成未实例化的模块;以及
将所述未实例化的模块进行实例化,生成所述实例文件。
6.根据权利要求4或5所述的方法,其中,所述将所述实例文件加载至所述目标项目中还包括:
通过胶水文件对所述实例文件进行封装,得到胶水文件类;以及
将所述胶水文件类加载至所述目标项目中。
7.一种文件加载装置,包括:
获取模块,用于获取以第一文件名命名的源文件,其中,所述源文件的文件类型为第一文件类型;
编译模块,用于对所述源文件进行编泽,得到文件类型为第二文件类型的目标文件,其中,所述目标文件以所述第一文件名命名;以及
替换模块,用于在目标项目中引用所述源文件的位置,将所述源文件替换为所述目标文件。
8.根据权利要求7所述的装置,其中,所述编译模块包括:
第一编译子模块,用于对所述源文件进行编译,得到以第二文件名命名的机器码文件,其中,所述机器码文件的文件类型为所述第二文件类型;
替换子模块,用于将所述机器码文件的所述第二文件名替换为与所述机器码文件对应的所述源文件的所述第一文件名;以及
定义子模块,用于将具有所述第一文件名的所述机器码文件作为所述目标文件。
9.一种计算机系统,包括:
一个或多个处理器;
存储器,用于存储一个或多个程序,
其中,当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现权利要求1至5中任一项所述的方法。
10.一种计算机可读存储介质,其上存储有可执行指令,该指令被处理器执行时使处理器实现权利要求1至5中任一项所述的方法。
CN202011289598.2A 2020-11-17 2020-11-17 文件加载方法、装置、计算机系统和计算机可读存储介质 Active CN113778451B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202011289598.2A CN113778451B (zh) 2020-11-17 2020-11-17 文件加载方法、装置、计算机系统和计算机可读存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202011289598.2A CN113778451B (zh) 2020-11-17 2020-11-17 文件加载方法、装置、计算机系统和计算机可读存储介质

Publications (2)

Publication Number Publication Date
CN113778451A true CN113778451A (zh) 2021-12-10
CN113778451B CN113778451B (zh) 2024-06-18

Family

ID=78835310

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011289598.2A Active CN113778451B (zh) 2020-11-17 2020-11-17 文件加载方法、装置、计算机系统和计算机可读存储介质

Country Status (1)

Country Link
CN (1) CN113778451B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115878125A (zh) * 2022-11-11 2023-03-31 盐城金堤科技有限公司 生成类的扩展方法、装置、存储介质及电子设备

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105320523A (zh) * 2015-10-16 2016-02-10 北京恒华伟业科技股份有限公司 一种数据处理方法和装置
CN106250124A (zh) * 2016-07-25 2016-12-21 百富计算机技术(深圳)有限公司 功能模块跨平台运行的实现方法和装置
US20160371068A1 (en) * 2015-06-16 2016-12-22 Fujitsu Limited Computer that performs compiling, compiler program, and link program
CN108052327A (zh) * 2017-12-11 2018-05-18 北京奇虎科技有限公司 一种内核模块编译、加载方法及装置
CN108153529A (zh) * 2017-12-22 2018-06-12 杭州迪普科技股份有限公司 一种文件编译的方法及装置
CN108334325A (zh) * 2017-12-26 2018-07-27 努比亚技术有限公司 一种编译方法、计算机及计算机可读存储介质
CN110716715A (zh) * 2019-10-18 2020-01-21 恒生电子股份有限公司 一种应用程序开发方法、装置、设备及介质
CN111090425A (zh) * 2019-12-12 2020-05-01 支付宝(杭州)信息技术有限公司 一种程序封装方法、装置及电子设备

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20160371068A1 (en) * 2015-06-16 2016-12-22 Fujitsu Limited Computer that performs compiling, compiler program, and link program
CN105320523A (zh) * 2015-10-16 2016-02-10 北京恒华伟业科技股份有限公司 一种数据处理方法和装置
CN106250124A (zh) * 2016-07-25 2016-12-21 百富计算机技术(深圳)有限公司 功能模块跨平台运行的实现方法和装置
CN108052327A (zh) * 2017-12-11 2018-05-18 北京奇虎科技有限公司 一种内核模块编译、加载方法及装置
CN108153529A (zh) * 2017-12-22 2018-06-12 杭州迪普科技股份有限公司 一种文件编译的方法及装置
CN108334325A (zh) * 2017-12-26 2018-07-27 努比亚技术有限公司 一种编译方法、计算机及计算机可读存储介质
CN110716715A (zh) * 2019-10-18 2020-01-21 恒生电子股份有限公司 一种应用程序开发方法、装置、设备及介质
CN111090425A (zh) * 2019-12-12 2020-05-01 支付宝(杭州)信息技术有限公司 一种程序封装方法、装置及电子设备

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115878125A (zh) * 2022-11-11 2023-03-31 盐城金堤科技有限公司 生成类的扩展方法、装置、存储介质及电子设备
CN115878125B (zh) * 2022-11-11 2024-02-06 盐城天眼察微科技有限公司 生成类的扩展方法、装置、存储介质及电子设备

Also Published As

Publication number Publication date
CN113778451B (zh) 2024-06-18

Similar Documents

Publication Publication Date Title
US8707263B2 (en) Using a DSL for calling APIS to test software
US8615750B1 (en) Optimizing application compiling
US10331425B2 (en) Automated source code adaption to inject features between platform versions
US20130167123A1 (en) Application debugging
US10209968B2 (en) Application compiling
CN110532185B (zh) 测试方法、装置、电子设备和计算机可读存储介质
US9619360B2 (en) Code profiling of executable library for pipeline parallelization
US20150067653A1 (en) Automatic generation of analysis-equivalent application constructs
CN110865889A (zh) 组件间传递事件的方法和装置
US20200387361A1 (en) Application stack builder based on node features
CN111966396A (zh) 数据处理方法及装置、计算机系统和计算机可读存储介质
CN110737631A (zh) 一种基于Flink引擎的数据解析方法及装置
US9779014B2 (en) Resilient mock object creation for unit testing
US11288044B1 (en) System and method for interprocedural analysis
CN113778451B (zh) 文件加载方法、装置、计算机系统和计算机可读存储介质
CN112527302B (zh) 错误检测的方法及装置、终端和存储介质
CN111913741A (zh) 对象拦截方法、装置、介质及电子设备
US20130111431A1 (en) Validation of a system model including an activity diagram
US10521206B2 (en) Supporting compiler variable instrumentation for uninitialized memory references
CN114791885A (zh) 接口测试方法、装置、设备及介质
CN114047923A (zh) 错误代码定位方法、装置、存储介质以及电子设备
CN112596751A (zh) 应用程序安装包的编译方法、终端、服务器及存储介质
CN113032256A (zh) 自动化测试方法、装置、计算机系统和可读存储介质
CN112068814A (zh) 可执行文件的生成方法、装置、系统及介质
US8843897B2 (en) System and method for using an abstract syntax tree to encapsulate the descriptive assertions in an annotation based standard into a code based library

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