CN114253554A - 一种代码处理方法、装置及存储介质 - Google Patents

一种代码处理方法、装置及存储介质 Download PDF

Info

Publication number
CN114253554A
CN114253554A CN202011066288.4A CN202011066288A CN114253554A CN 114253554 A CN114253554 A CN 114253554A CN 202011066288 A CN202011066288 A CN 202011066288A CN 114253554 A CN114253554 A CN 114253554A
Authority
CN
China
Prior art keywords
code
platform
target platform
module
instruction
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.)
Pending
Application number
CN202011066288.4A
Other languages
English (en)
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.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies 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 Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Priority to PCT/CN2021/117845 priority Critical patent/WO2022057743A1/zh
Priority to EP21868568.3A priority patent/EP4206904A4/en
Publication of CN114253554A publication Critical patent/CN114253554A/zh
Priority to US18/185,894 priority patent/US20230229410A1/en
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/53Decompilation; Disassembly
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/76Adapting program code to run in a different environment; Porting

Abstract

本申请公开了一种代码处理方法、装置及存储介质,包括:获取应用于源平台的基于低级语言的第一代码;对获取的第一代码进行反编译,得到中间表示IR;然后将该IR编译成应用于第一目标平台的基于低级语言的第二代码,其中,源平台与目标平台具有不同指令集。例如,可以将适用于x86平台的代码转换成适用于ARM平台的代码,无需由技术人员通过人工编写程序代码的方式实现软件代码的跨平台迁移。如此,可以实现将源平台的软件代码移植至目标平台上运行,从而可以降低构建第一目标平台的软件生态的难度。

Description

一种代码处理方法、装置及存储介质
本申请要求于2020年9月21日提交中国知识产权局、申请号为202010996387.6、申请名称为“一种代码处理方法、装置及存储介质”的中国专利申请的优先权,其全部内容通过引用结合在本申请中。
技术领域
本申请实施例涉及代码处理技术领域,尤其涉及一种代码处理方法、装置及存储介质。
背景技术
x86平台,是一种英特尔公司主导开发的通用计算平台,具体是对一系列基于Intel 8086且向后兼容的中央处理器指令集架构的泛指。自1978年面世以来,x86平台,经过多年积累,演化出庞大且复杂的指令集。
实际应用中,开发人员通常会基于x86平台开发出能够应用于x86平台的各种软件,由此构建出了庞大的软件生态群。因此,目前很多应用软件可能仅能只能适用于x86平台,而无法适用于其它平台,如ARMv8平台(一种由ARM公司发布的支持64位指令集的处理器架构)等。
在构建ARMv8平台或者其它平台的软件生态时,通常是由技术人员根据该平台的代码规则(如指令集等)编写软件代码,以使得开发出的软件能够适用于该平台。但是,这种为该平台开发新软件的难度通常较高,软件开发效率较慢,这就使得构建ARMv8平台或者其它平台的软件生态的难度较高。为此,目前亟需一种能够降低构建平台软件生态难度的方法。
发明内容
本申请实施例提供一种代码处理方法、装置及存储介质,用以降低构建平台的软件生态的难度。
第一方面,本申请实施例提供一种代码处理方法,通过将源平台的软件代码移植至第一目标平台上,来降低构建平台的软件生态的难度,该源平台与第一目标平台属于不同平台,具体可以是具有不同的指令集。具体实现时,可以先获取应用于源平台的基于低级语言的第一代码,该第一代码例如可以是基于汇编语言或者机器语言的代码,并且能够被源平台所识别;然后,可以对获得的第一代码进行反编译,得到第一中间表示(intermediate representation,IR),该第一IR可以是与第一目标平台相关的IR,也可以是与第一目标平台无关的IR;接着,可以对该第一IR进行编译,得到应用于第一目标平台的基于低级语言的代码,而所得到的代码能够被第一目标平台所识别并运行,从而实现将源平台上的软件代码移植到第一目标平台。
同时,上述对软件代码进行反编译以及编译的过程,无需开发人员参与,从而可以实现开发人员与软件代码的隔离,降低开发人员接触软件代码的可能性。而对于软件运营商,可以根据在移植到第一目标平台的软件代码进行优化和二次开发,便于软件运营商对移植到第一目标平台的软件代码进行维护。
其中,源平台例如可以是x86平台,而第一目标平台可以是ARM平台,具体是ARMv8平台等。当然,实际应用中,源平台可以是任意平台,而第一目标平台可以是与源平台不同的任意一种平台。
上述方法可以应用于本地,也可以应用于云端。其中,当应用于本地时,具体可以是应用于本地的终端或者服务器等,而当应用于云端时,具体可以是作为云服务的形式呈现给用户。
在一种可能的实施方式中,可以将源平台的第一代码,移植到任意目标平台。具体的,以分别移植到第一目标平台以及第二目标平台为例,除了可以通过上述反编译以及编译过程,得到应用于第一目标平台的基于低级语言的代码之外,也可以是在反编译过程中,根据第一代码得到第二平台对应的IR,该第二目标平台对应的IR与第一IR不同,所适用的目标平台不同,第一目标平台与第二目标平台具有不同的指令集,并且,第二目标平台与源平台也具有不同的指令集。即,当将源平台上的软件代码移植至任意平台上时,均可以采用上述反编译以及编译过程进行实现。
在一种可能的实施方式中,可以是向用户呈现目标平台选择界面,该目标平台选择界面可以呈现多个目标平台的候选,可供用户进行目标平台的选择。然后,可以响应用户针对于目标平台的选择操作,从多个目标平台中确定出用户所选择的目标平台,例如上述第一目标平台,可以是根据用户在目标平台选择界面上执行的选择操作进行确定的。
在一种可能的实施方式中,在对第一代码进行反编译的过程中,可以先获取第一代码额注解信息,该注解信息例如可以包括该第一代码中参数的类型、数量、跳转地址种类中的任意一种或者多种。这样,在进行反编译时,可以根据该注解信息对第一代码进行反编译,得到第一IR。以注解信息中的参数类型为例,假设第一代码中的参数的长度为64位,则在对第一代码进行反编译时所得到的第一IR中,参数的长度仍然可以是64位(如浮点型),而不会变更为32位等(如整型),如此,可以使得反编译前后参数的类型保持一致,降低第一IR中出现逻辑错误的可能。
在一种可能的实施方式中,在对第一代码进行反编译过程中,还可以对初始得到的IR进行优化。具体的,在对第一代码进行反编译后,可以得到第二IR,通常情况下,该第二IR可能具有一定的优化空间,比如,所生成的第二IR中对于数据的读取方式为每次读取64比特的数据,而第一目标平台具有一次性读取128比特的能力,可以将第二IR中的数据读取方式优化为每次读取128比特数据。具体实现时,可以根据第一目标平台,如根据第一目标平台的硬件/逻辑能力等,对第二IR进行优化,从而得到上述第一IR。这样,在后续对第一IR进行编译后,可以得到更高效的代码。
在一种可能的实施方式中,还可以进一步生成并呈现提示信息,该提示信息可以用于针对待检查项进行提示,其中,待检查项可以是基于第一目标平台与源平台之间的差异生成。比如,该提示信息,具体可以是通过高亮方式进行显示的源平台的指令以及与该指令具有相同语义的第一目标平台的指令,以便由用户基于该提示信息确定基于源平台的指令翻译得到的第一目标平台的指令是否准确。
在一种可能的实施方式中,当上述方法应用于云端时,用户可以向云端提供第一代码,比如,用户可以通过终端或者客户端等向云端发送包含第一代码的代码处理请求,以使得云端获取第一代码;相应的,云端在接收到的第一代码进行相应的反编译以及编译处理后,可以将得到的应用于第一目标平台的基于低级语言的代码发送给用户,以使得用户获得其所需的代码。
在一种可能的实施方式中,在对第一代码进行反编译时,具体可以是根据源平台对应的指令语义库对第一代码进行反编译。例如,该指令语义库中可以包含多条源平台的指令所具有的语义,这样,在反编译过程中,可以遍历第一代码中的各条指令,并根据该指令语义库识别出该指令所具有语义,从而可以根据所识别出的指令语义将第一代码反编译成相应的编译器IR。
在一种可能的实施方式中,指令语义库还可以被用户进行修改,比如,用户可以向该指令语义库中添加单指令流多数据流(Single Instruction Multiple Data,SIMD)指令等,以用于识别出第一代码中的SIMD指令,从而可以在反编译过程中,针对于第一代码中的SIMD指令进行相应的反编译处理,以使得第一IR中包含向量化语义的指令。相应的,终端或者服务器可以响应用户针对于指令语义库的修改操作,对指令语义库进行相应的修改。
在一种可能的实施方式中,在嵌入汇编场景中,需要移植的软件代码中可以同时包括基于低级语言的第一代码以及基于高级语言的变量,因此,终端或者服务器在获取第一代码时,还获取基于高级语言的变量,从而在对第一代码进行反编译时,可以将第一代码翻译成包含函数的第一IR,该函数中包括形参,而该形参所对应的实参可以是变量。即,在反编译过程中,可以将基于高级语言的变量作为实参传递给函数中的形参。
在一种可能的实施方式中,在将第一代码翻译成包含函数的第一IR时,具体可以是确定该第一代码中各个指令串的语义,从而可以根据语义与函数之间的对应关系,确定该第一代码中各个指令串的语义所对应的函数,进而可以生成包含该函数的第一IR。
在一种可能的实施方式中,在对第一代码进行反编译之前,还可以对第一代码中的变量进行重定位,这样,对第一代码进行反编译后,所得到的第一IR中的各个变量可以具有不同的逻辑地址,以第一IR中包含的第一变量以及第二变量为例,第一变量可以具有第一逻辑地址,而第二变量可以具有第二逻辑地址,而第一逻辑地址与第二逻辑地址为不同的逻辑地址。具体实现时,可以在对第一代码进行反编译之前,为第一代码中的第一变量配置预设的第一逻辑地址,为第一代码中的第二变量配置预设的第二逻辑地址,其中,该第一逻辑地址以及第二逻辑地址均可以是抽象的逻辑地址。
在一种可能的实施方式中,由于源平台与第一目标平台之间可能在函数调用约定或者SIMD指令可能存在差异,因此,在对第一代码进行反编译时,具体可以是根据第一目标平台的函数调用约定或者第一目标平台的SIMD指令对第一代码进行反编译,从而使得最终得到的代码能够满足第一目标平台的函数调用约定或者SIMD指令要求。实际应用中,具体可以是根据第一目标平台与源平台之间在函数调用约定或者SIMD指令上的差异,进行反编译处理。
在一种可能的实施方式中,当第一代码中包括SIMD指令时,可以是采用直接向量化的方式对第一代码进行反编译。具体的,可以先生成目标平台的基于低级语言的第三代码,该第三代码能够用于描述第一代码中SIMD指令的向量化语义;示例性的,该第三代码例如可以是包括intrinsic函数的代码。然后,可以对该第三代码进行反编译,得到具有向量化标记的第一目标平台的SIMD指令的所对应的第一IR,此时,该第一IR与第一目标平台存在关联。
在一种可能的实施方式中,当第一代码中包括SIMD指令时,可以是采用间接向量化得到方式对第一代码进行反编译。具体实现时,可以先生成基于高级语言的第四代码,该第四代码能够用于描述第一代码中SIMD指令的向量化语义;然后,可以对该第四代码进行编译,得到具有向量化标记的第一IR。然后,在编译阶段,可以对具有向量化标记的IR进行自动向量化编译,生成应用于第一目标平台基于低级语言的代码,该代码可以包括第一目标平台的SIMD指令。如此,实现了第一代码中的SIMD指令的间接向量化处理。
第二方面,本申请实施例还提供了一种代码处理方法,在实现软件代码移植的过程中,可以获取应用于源平台的基于低级语言的第一代码,然后,可以根据该第一代码输出第二代码,其中,第二代码为能够应用于第一目标平台的基于低级语言的代码,并且,该第二代码是对获取的第一代码进行处理得到的,例如可以是对第一代码先进行反编译再进行编译而得到,而源平台与第一目标平台具有不同指令集。如此,根据源平台的第一代码可以得到应用于第一目标平台的第二代码,而所得到的第二代码能够被第一目标平台所识别并运行,从而实现将源平台上的软件代码移植到第一目标平台。
同时,上述对第一代码的处理过程,可以无需开发人员参与,从而可以实现开发人员与软件代码的隔离,降低开发人员接触软件代码的可能性。而对于软件运营商,可以根据在移植到第一目标平台的软件代码进行优化和二次开发,便于软件运营商对移植到第一目标平台的软件代码进行维护。
其中,源平台例如可以是x86平台,而第一目标平台可以是ARM平台,具体是ARMv8平台等。当然,实际应用中,源平台可以是任意平台,而第一目标平台可以是与源平台不同的任意一种平台。
在一种可能的实施方式中,在输出第二代码时,具体可以是通过代码显示界面呈现该第二代码,这样,用户可以在该代码显示界面上查看到翻译后的代码,从而可以在该翻译后的代码的基础上进行二次开发、优化等操作。
在一种可能的实施方式中,对第一代码的处理过程可以应用于云端,则在获取第一代码时,具体可以是接收来自用户的第一代码;比如,用户可以通过终端或者客户端等向云端发送代码处理请求,该代码处理请求中可以携带有该第一代码等,当然,用户也可以是通过其它方式向云端提供第一代码等。这样,云端在对第一代码进行处理并得到第二代码后,在输出第二代码时,具体可以是向用户输出该第二代码,比如,可以是呈现在用户所使用的终端的代码显示界面等。
在一种可能的实施方式中,在对第一代码进行处理之前,还可以呈现目标平台选择界面,该目标平台选择界面可以呈现多个目标平台的候选,可供用户进行目标平台的选择。然后,可以响应用户针对于目标平台的选择操作,从多个目标平台中确定出用户所选择的目标平台,例如上述第一目标平台,可以是根据用户在目标平台选择界面上执行的选择操作进行确定的。
在一种可能的实施方式中,在对第一代码进行处理时,具体可以是先获取源平台对应的指令语义库,并利用该指令语义库对第一代码进行处理,如指令语义库中可以包含多条源平台的指令所具有的语义,这样,在对第一代码进行处理时,可以遍历第一代码中的各条指令,并根据该指令语义库识别出该指令所具有语义,从而可以根据所识别出的指令语义将第一代码反编译成相应的编译器IR。
在一种可能的实施方式中,用户还可以对源平台对应的指令语义库进行修改,比如,用户可以向该指令语义库中添加SIMD指令等,以用于识别出第一代码中的SIMD指令等。则,可以响应于用户执行的针对该指令语义库的修改操作,对源平台对应的指令语义库进行修改。这样,在对第一代码进行反编译的过程中,可以根据修改后的指令语义库进行反编译。
在一种可能的实施方式中,在根据第一代码得到第二代码后,还可以生成并呈现提示信息,该提示信息用于针对待检查项进行提示,其中,待检查项基于所述第一目标平台与所述源平台之间的差异生成。比如,该提示信息,具体可以是通过高亮方式进行显示的源平台的指令以及与该指令具有相同语义的第一目标平台的指令,以便由用户基于该提示信息确定基于源平台的指令翻译得到的第一目标平台的指令是否准确。
在一种可能的实施方式中,不仅可以输出第二代码,还可以呈现对第一代码进行反编译而得到的第一IR,相应的,所输出的第二代码,则是对第一IR进行编译得到。这样,用户可以对呈现的第一IR进行调试、观察等操作,并进行相应的分析。
在一种可能的实施方式中,还可以呈现第二IR,该第二IR是对所述第一代码进行反编译得到,具体的,在反编译过程中,可以先根据第一代码反编译得到第二IR,然后,再对该第二IR进行优化,可以得到第一IR。这样,经过优化处理后所得到的第一IR,可以在代码执行阶段更加高效。,比如,所生成的第二IR中对于数据的读取方式为每次读取64比特的数据,而第一目标平台具有一次性读取128比特的能力,可以将第二IR中的数据读取方式优化为每次读取128比特数据,从而在读取相同数量的数据时,可以无需执行两次的数据读取操作。
在一种可能的实施方式中,输出的第一IR,还可以被用户修改,比如,当用户在确定输出的第一IR中存在逻辑错误或者存在可以优化的代码时,可以对该第一IR进行修改。则,终端或者服务器响应于针对该第一IR的修改操作,可以得到修改后的第一IR,从而可以根据修改后的第一IR进行编译,可以得到相对较优的第三代码,该第三代码为应用于第一目标平台的基于低级语言的代码,从而可以将该第三代码呈现给用户。
在一种可能的实施方式中,当根据第一代码生成应用于第二目标平台的基于低级语言的代码时,对第一代码进行反编译时,可以将第一代码反编译成第三IR,而后续可以通过对该第三IR进行编译,得到应用于第二目标平台的低级语言代码。其中,不同目标平台所对应的IR可以不同,从而可以针对于不同的目标平台,生成不同的IR以及代码。
在一种可能的实施方式中,用户还可以对输出的第二代码进行修改,比如,用户可以在输出的第二代码的基础上,进行二次开发和优化等。相应的,通过响应用户针对该第二代码的修改操作,可以得到修改后的第二代码,同时,可以实时向用户呈现修改后的第二代码,以便于用户进行查看。
在一种可能的实施方式中,在获取第一代码时,不仅可以获取应用于源平台的基于低级语言的第一代码,还可以同时获取基于高级语言的变量。比如,在嵌入汇编场景中,不仅包含作为低级语言的汇编语言代码,还可以包括高级语言的变量,如C/C++语言的变量等。
第三方面,基于与第一方面的方法实施例同样的发明构思,本申请实施例提供了一种计算装置。该装置具有实现上述第一方面的各实施方式对应的功能。该功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。该硬件或软件包括一个或多个与上述功能相对应的模块。
第四方面,基于与第二方面的方法实施例同样的发明构思,本申请实施例提供了二种计算装置。该装置具有实现上述第二方面的各实施方式对应的功能。该功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。该硬件或软件包括一个或多个与上述功能相对应的模块。
第五方面,本申请实施例提供一种计算装置,包括:处理器和存储器;该存储器用于存储指令,当该计算装置运行时,该处理器执行该存储器存储的该指令,以使该装置执行上述第一方面或第一方面的任一实现方式中的代码处理方法。需要说明的是,该存储器可以集成于处理器中,也可以是独立于处理器之外。装置还可以包括总线。其中,处理器通过总线连接存储器。其中,存储器可以包括可读存储器以及随机存取存储器。
第六方面,本申请实施例提供一种计算装置,包括:处理器和存储器;该存储器用于存储指令,当该计算装置运行时,该处理器执行该存储器存储的该指令,以使该装置执行上述第二方面或第二方面的任一实现方式中的代码处理方法。需要说明的是,该存储器可以集成于处理器中,也可以是独立于处理器之外。装置还可以包括总线。其中,处理器通过总线连接存储器。其中,存储器可以包括可读存储器以及随机存取存储器。
第七方面,本申请实施例还提供一种可读存储介质,所述可读存储介质中存储有程序或指令,当其在计算机上运行时,使得上述第一方面或第一方面的任一实现方式中的代码处理方法被执行。
第八方面,本申请实施例还提供一种可读存储介质,所述可读存储介质中存储有程序或指令,当其在计算机上运行时,使得上述第二方面或第二方面的任一实现方式中的代码处理方法被执行。
第九方面,本申请实施例还提供一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述第一方面或第一方面的任一实现方式中的任意代码处理方法。
第十方面,本申请实施例还提供一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述第二方面或第二方面的任一实现方式中的任意代码处理方法。
另外,第三方面至十方面中任一种实现方式所带来的技术效果可参见第一方面中不同实现方式所带来的技术效果,或者可参见第二方面中不同实现方式所带来的技术效果,此处不再赘述。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。
图1为本申请实施例中一示例性系统架构示意图;
图2为本申请实施例中一种代码处理方法的流程示意图;
图3为本申请实施例中一种嵌入汇编场景的代码示意图;
图4为本申请实施例中一种参数化翻译的流程示意图;
图5为本申请实施例中对函数的参数进行调整的示意图;
图6为本申请实施例中优化前与优化后的IR示意图;
图7为本申请实施例中一种目标平台选择界面的示意图;
图8为本申请实施例中一种用户801与计算设备802进行交互的示意图;
图9为本申请实施例中一种计算装置的结构示意图;
图10为本申请实施例中另一种计算装置的结构示意图;
图11为本申请实施例中一种计算装置的硬件结构示意图;
图12为本申请实施例中又一种计算装置的硬件结构示意图。
具体实施方式
在构建平台的软件生态时,通常是由技术人员编写出能够在该平台上运行的软件。但是,这种人工编写软件程序代码的方式,不仅软件开发效率低,而且,编写程序代码容易出现各种程序错误,这使得开发软件的难度较高,从而使得构建平台软件生态的难度也较高。
为此,本申请实施例提供了一种代码处理方法,可以是将其它平台上的软件移植到本平台上,从而丰富能够在本平台上成功运行的软件,以此降低构建本平台的软件生态的难度。具体实现时,可以将源平台(即上述其它平台)的软件代码进行反编译,得到编译器的内部表示(intermediate representation,IR),然后再将该IR编译成应用于目标平台(上述本平台)的基于低级语言的代码,从而可以该代码可以成功运行在目标平台,如此,可以实现将源平台的软件移植至目标平台上运行。当然,源平台与目标平台为不同的平台,这两个平台之间的区别至少是具有不同的指令集。
并且,上述对软件代码进行反编译以及编译的过程,无需开发人员参与,从而可以实现开发人员与软件代码的隔离,降低开发人员接触软件代码的可能性。而对于软件运营商,可以根据在移植到目标平台的软件代码进行优化和二次开发,便于软件运营商对移植到目标平台的软件代码进行维护。
作为一种示例,上述代码处理方法可以应用于图1所示的系统架构中。如图1所示,该系统架构100包括反编译模块101以及编译模块102。对于应用于源平台103上的代码1,反编译模块101对其进行反编译,得到IR,再将反编译得到的IR传递给编译模块102,并由编译模块102将该IR编译成应用于目标平台104的基于低级语言的代码2,这样,所得到的代码2可以在目标平台104上运行。
实际应用中,该反编译模块101可以是基于软件的功能模块;或者也可以是由具有反编译功能的设备实现,如反编译器等。类似的,编译模块102可以是由具有编译功能的设备实现,如编译器等。反编译模块101以及编译模块102可以被部署于目标平台104,也可以是被部署于终端105或服务器106等。示例性的,当反编译模块101以及编译模块102被部署于终端105以及服务器106时,可以是将反编译模块101部署于服务器106上,而编译模块部署于终端105等;或者,反编译模块101以及编译模块102均可以部署于位于云端的服务器106中,此时,在软件移植过程中,终端105可以向云端(具体可以是云端的服务器106)发送软件代码,例如可以是想云端发送代码处理请求,该代码处理请求中包括需要移植的软件代码;然后,云端(服务器106)进行上述反编译以及编译处理后,可以得到应用于目标平台的基于低级语言的代码,并将该代码发送给终端105。这样,终端105可以获得能够应用于目标平台的软件代码,实现了软件移植。当然,实际应用中,服务器106也可以是本地服务器。
为使本申请的上述目的、特征和优点能够更加明显易懂,下面将结合附图对本申请实施例中的各种非限定性实施方式进行示例性说明。显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。
如图2所示,为本申请实施例中一种代码处理方法的流程示意图,该方法可以应用于上述目标平台104,或者可以是应用于计算设备,该计算设备例如可以是上述终端105或服务器106,并且,该计算设备可以包括反编译模块101以及编译模块102,该方法具体可以是包括:
S201:获取应用于源平台基于低级语言的第一代码。
实际应用中,软件在源平台上运行时,该软件的程序代码通常被编译成该源平台所能直接识别的低级语言的代码。其中,低级语言,是指机器能够直接识别的程序语言或指令代码,具体可以是汇编语言或机器语言等。机器语言是采用二进制代码进行表示的语言。机器语言是计算机唯一可以识别和执行的语言。汇编语言则是为了解决机器语言难以理解和记忆的缺点,采用易于理解和记忆的名称和符号表示机器指令中的操作码的语言。汇编语言采用符号代替机器语言的二进制代码,因此汇编语言实质上是一种符号语言。
相对于低级语言而言,还存在一种独立于机器,面向过程或对象的高级语言。高级程序语言通常接近于自然语言,而且可以使用数学表达式,因而具有更强的表达能力,可以方便地表示数据的运算和程序的控制结构,能够更好的描述各种算法,如C、C++、Java等语言。高级语言,可以适用于不同的平台,如适用于x86指令集架构的平台(一种英特尔公司主导开发的通用计算平台,以下简称x86平台),也可以适用于高级精简指令集机器(advancedRISC machines,ARM)架构的平台(以下简称ARM平台)、一种精简指令集架构(PerformanceOptimization With Enhanced RISC–Performance Computing)架构的平台等。通常情况下,高级程序语言不能直接被机器识别和执行。开发人员可以通过编译程序如编译器对基于高级语言的代码文件进行编译,以便能够被机器识别和执行。
本实施例中,所获取的第一代码,可以是基于低级语言的代码,并且,该代码能够适用于源平台。例如,所获取的第一代码,可以是基于该源平台对应的汇编语言进行汇编所得到的“.obj”格式的文件或者其它格式文件的代码。
或者,在其它可能的实施方式中,在获取第一代码的同时,可以同时获取基于高级语言的变量。例如,在图3所示的嵌入汇编场景中,所获取的第一代码为“movdqa%%xmm4,16(%0)”等格式的汇编语言代码,而基于高级语言的变量具体为“"r"(&ff_inverse[0]),"r"(&ff_inverse[8])”中的“&ff_inverse[0]”以及“&ff_inverse[8]”。其中,嵌入汇编通常是为了提高代码执行效率以及执行处理器的专有指令所采用的编码方式。则,对该嵌入汇编代码进行汇编处理后,可以得到诸如“.obj”格式文件的第一代码。
示例性的,本实施例中的第一代码,可以是对源平台上软件的整个汇编语言的程序代码进行汇编处理后所得到“obj”格式的代码;或者是对部分程序代码进行汇编处理后所得到“obj”格式的代码,比如该软件的多个代码文件中的其中一个代码文件等;或者,也可以是一个代码文件中的一段代码,如对图3所示的代码块进行编译所得到的代码等,即本实施例中可以对软件代码进行局部反编译处理等。
本实施例中,第一代码所应用的源平台以及第一代码移植到的目标平台并不相同,具体可以是具有不同的指令集。源平台与目标平台可以是属于不同类型的平台。例如,源平台可以是x86平台,而目标平台可以是ARMv8平台(由ARM公司发布的支持64位指令集的处理器架构);或者,源平台与目标平台可以是也可以是属于同一类型下的两个不同平台,源平台可以是x86平台下的Pentium II,而目标平台可以是x86平台下的Pentium III(引入了新的SSE指令集),或者源平台可以是支持32位的x86平台,而目标平台可以是支持64位的x86-64平台等。
S202:对获取的第一代码进行反编译,得到第一IR。
本实施例中,将应用于源平台的第一代码,移植至目标平台上运行的过程中,可以先利用反编译模块101对该第一代码进行反编译,具体可以是对输入的第一代码进行词法分析、语法分析以及语义分析,并将其转换成编译器IR,该编译器IR即为第一代码对应的反编译结果。其中,编译器IR,可以表征第一代码的语义和语法结构,其可以被认为是另一种高级语言。
作为一种示例,可以仅获取基于低级语言的第一代码,此时,反编译模块101可以将第一代码反编译为编译器IR。而在其它示例中,也可以是在获取基于低级语言的第一代码的同时,还获取基于高级语言的变量,此时,反编译模块101对第一代码进行反编译时,还需要对高级语言的变量进行参数化翻译处理,以避免第一代码中高级语言的变量信息发生丢失。
具体的,参见如图4所示的参数化翻译流程:
S401:对于混合代码块中基于低级语言的指令串,反编译模块101可以根据该指令串的语义,将该指令串翻译成包括函数的编译器第一IR,该第一IR中包含的函数所表达的语义与该指令串的语义相符。比如,当指令串为“ADD%x%y”时,对该指令串进行翻译得到的编译器IR中所包括的函数可以是用于求和的函数。
在一种翻译指令串的示例性实施方式中,反编译模块101可以预先获取指令语义与函数之间的对应关系,比如,可以预先将其保存在反编译模块101中。然后,反编译模块101可以确定该混合代码块中基于低级语言的指令串的语义,该指令串可以包括一条或者多条指令,则反编译模块可以确定该指令串中每条指令的语义。接着,反编译模块201根据该指令串中各条指令的语义,通过查找语义与函数之间的对应关系,确定该指令串中每条指令的语义所对应的函数,从而根据所确定出的函数可以进一步生成包含该函数的第一IR。
作为一种示例,反编译模块101可以通过查找源平台对应的指令语义库(如由技术人员预先对源平台的指令进行语义标记并将指令以及指令语义导入反编译模块101等),确定该指令串中每条指令的语义。该指令语义库中包括源平台的多条指令,并且每条指令的语义被预先完成语义标注。当第一代码中指令A与指令语义库中的指令a具有相同的语法结构时,可以确定该指令语义库中指令a的语义即为第一代码中指令A的语义。实际应用中,也可以是采用其它方式确定每条指令的语义,本实施例对此并不进行限定。
S402:反编译模块101在确定指令串对应的函数时,可以为该函数创建虚拟寄存器作为参数。
S403:反编译模块101为翻译过程中所确定的函数引用上述创建的虚拟寄存器,并将该虚拟寄存器作为函数的形参。
S404:反编译模块101建立高级语言的变量与函数中形参之间的对应关系,以便将该混合代码中基于高级语言的变量作为实参传递给语义函数中的形参。
示例性的,反编译模块101可以统计混合代码块中高级语言的变量,如此可以得到由多个高级语言的变量构成的列表,然后根据形参在IR中的位置以及编译器的调用约定,将列表中的变量与函数中的形参进行对应。比如,可以将列表中的第一个变量与IR中第一个函数的第一个形参对应,将列表中的第二个变量与IR中该第一个函数的第二个形参对应等。
这样,在反编译过程中,高级语言的变量信息可以是以实参保留在函数中,而不会发生信息丢失,从而实现在嵌入汇编场景下,反编译过程前后的代码信息保持一致。
实际应用中,反编译模块101可以先区分需要进行反编译的代码是仅包括基于低级语言的第一代码,还是同时包括第一代码以及高级语言变量。在一种可能的实施方式中,反编译模块101可以先检测需要进行反编译的代码的编译命令以及该代码的文件类型,以确定该第一代码是基于高级语言的代码还是基于低级语言的代码。进一步的,当基于编译命令以及文件类型确定该代码为基于低级语言的代码时,反编译模块101还可以进一步根据该代码中的语法,确定该代码是全部基于低级语言的第一代码,还是既包含低级语言的第一代码也包含高级语言的变量的混合代码块,如由C/C++语言与汇编语言(低级语言)组成的嵌入汇编代码等。
进一步的,若第一代码包括基于低级语言的第二代码以及基于高级语言的变量的混合代码块,反编译模块101在对第一代码进行反编译过程中,针对于第一代码中的高级语言变量,可以进行上述参数化翻译过程。
本实施例中,第一代码中通常包括至少一个函数调用。被调用的函数实质是一个变量。例如,在函数y=a+b*c中,函数y实质是一个变量。在一些可能的实现方式中,函数的函数体中还关联有其它变量。例如,函数y还关联有变量a、b和c。基于此,函数关联的变量包括函数本身和函数体中关联的变量,如函数y关联的变量包括y和a、b、c。由于第一代码中,函数关联的变量的地址是相对地址,也即各变量的地址是不确定的,为此,在基于源平台对应的指令语义库将第一代码中指令翻译成编译器的第一IR之前,反编译模块101还可以对IR中的变量(区别于高级语言的变量)进行重定位,从而确定第一代码中各变量的绝对地址。
示例性的,以第一代码中包含第一变量以及第二变量为例,反编译模块101在进行反编译之前,可以为第一代码中的第一变量配置预设的第一逻辑地址,为第一代码中的第二变量配置预设的第二逻辑地址,并且,第一逻辑地址与第二逻辑地址可以不同。具体实现时,反编译模块可以访问重定位表,该重定位表中存储有多个变量(包括第一变量以及第二变量)的逻辑地址信息,反编译模块101根据重定向表中的逻辑地址信息,确定第一变量以及第二变量分别对应的逻辑地址(也即为该变量对应的绝对地址),并将该逻辑地址与变量的符号关联。其中,为第一变量以及第二变量所配置的地址信息,可以是虚假的逻辑地址信息。然后,反编译模块101可以利用源平台对应的指令语义库对完成变量的地址配置的第一代码进行反编译,得到编译器的第一IR。这样,在之后的编译阶段,该变量的逻辑地址会被重新编译成目标平台的重定位信息,即在编译阶段,该编译器的第一IR中的变量可以指向具体的逻辑地址。
实际应用中,源平台与目标平台之间除了指令集不同以外,可能还存在其它差异,比如,源平台与目标平台之间可能存在函数调用约定差异或单指令流多数据流(SingleInstruction Multiple Data,SIMD)指令差异等。因此,在一些实施方式中,反编译模块101在对第一代码进行反编译时,可以先确定源平台与目标平台之间的差异,并根据该差异对第一代码进行反编译。其中,源平台与目标平台之间的差异,可以是由技术人员预先通过比较源平台与目标平台的函数调用约定或SIMD指令确定该差异,再将其导入反编译模块101中,本实施例对此并不进行限定。
在其它可能的实施方式中,反编译模块101也可以直接根据目标平台的函数调用约定或SIMD指令对第一代码进行反编译等,本实施例对此并不进行限定。如此,经过上述差异化处理或者直接基于目标平台的信息进行反编译,可以使得所得到的IR中的函数调用或SIMD指令能够符合目标平台的函数调用约定以及SIMD指令。
为便于理解,以下以根据目标平台与源平台之间的函数调用约定差异对第一代码中的参数进行调整为例进行示例性说明。
具体地,函数的参数存储在寄存器或者存储在内存的栈中。不同平台中参数的存储方式不同。反编译模块101可以根据源平台和目标平台的函数调用规则的差异,调整源代码块中函数的寄存器信息或栈信息。例如,反编译模块101可以将存储在寄存器中的参数进行调整,将其存储在栈中;或者是将存储在栈中的参数进行调整,将其存储在寄存器中。
在对寄存器信息或栈信息进行调整之前,反编译模块101可以先利用解码(decode)工具,例如intel xed对源代码块进行解码,得到指令控制流。然后反编译模块101可以针对指令控制流执行数据流分析算法,以对活跃的寄存器和栈进行分析,从而得到源代码块中函数的参数类型和数量。其中,参数类型主要用于指示参数存储于寄存器或者是存储于栈。
为了便于理解,下面分别对寄存器分析和栈分析的过程进行详细说明。
首先,本实施例定义如下几种数据集:
Use[n]:set of variables used by n;
Def[n]:set of variables defined by n;
In[n]:variables live on entry to n;
Out[n]:variables live on exit to n;
其中,variables表示变量对应的寄存器。In[n]和Out[n]分别表示输入和输出对应的寄存器的集合,Def[n]和Use[n]分别表示定义和使用对应的寄存器的集合。
反编译模块101可以遍历源代码块中的区块(block),构造每个block的use集和def集。具体构造过程如下:
a)按照block中指令执行顺序,遍历block中指令;
b)如果指令的operand的type为Register且action为kActionRead,则将加入use集;
c)如果指令的operand的type为Register且action为kActionWrite,则将加入def集;
d)如果指令的operand type为Address,则将其base_reg和index_reg加入use集;
反编译模块101可以根据上述集合建立数据流分析方程,如下所示:
Figure BDA0002713844960000111
Figure BDA0002713844960000121
其中,n表征一个block,符号
Figure BDA0002713844960000122
表示符号右边的集合为符号左边的集合的子集。succ[n]表示block中仍然有效的寄存器。
反编译模块101可以通过不动点算法对上述方程求解,如下所示:
Figure BDA0002713844960000123
经过不动点算法,函数入口的in集与Calling Convention规定的入参Reg取交集即为入参寄存器;函数出口的out集与Calling Convention规定的出参Reg取交集,即为可能的返回值寄存器。
反编译模块101在进行栈分析时,可以使用基于扩展栈指针寄存器(rex-extendedstack pointer,RSP)的算法或者基于扩展基指针寄存器(rex-extended base pointer,RBP)的算法对指令控制流进行分析实现。
反编译模块101使用基于RSP的算法进行分析的过程具体可以包括如下步骤:
a.基于function prelogue部分(entry basic block)查看RSP是否有偏移,并记录偏移值off;
其中,反编译模块101可以通过sub指令或者push指令判断偏移。反编译模块101还记录与RSP关联的寄存器。
b.遍历所有block的所有指令,查找操作数Operand Type为kTypeAddress,action为kActionRead,base_reg=RSP(关联寄存器),内存偏移(dispalcement,dis)为正数的使用场景。该参数即为第(dis-off)/8个栈参数,然后统计参数总数S。
c.对于符合b规则的情况下,进一步区分参数类型:
如果同指令的其他寄存器操作数为整型寄存器(RXX),且指令为非浮点->整型类型转换相关指令,判断该栈参数为整型。如果同指令的其他寄存器操作数为浮点寄存器(XMM),且指令为非整型->浮点类型转换相关指令,判断该栈参数为浮点。
反编译模块101使用基于RBP的算法进行分析的过程具体可以包括如下步骤:
a.遍历所有block的所有指令,查找操作数Operand Type为kTypeAddress,action为kActionRead,base_reg=RBP,dis为正数的使用场景。该参数即为第(dis-8)/8个栈参数,统计参数总数X。
b.对于符合a规则的情况下,进一步区分参数类型:
如果同指令的其他寄存器操作数为整型寄存器(RXX),且指令为非浮点->整型类型转换相关指令,判断该栈参数为整型,如果同指令的其他寄存器操作数为浮点寄存器(XMM),且指令为非整型->浮点类型转换相关指令,判断该栈参数为浮点。
在一些可能的实现方式中,反编译模块101可以同时执行上述两个算法,然后对两个算法确定的参数总数S取最大值。
在获得参数总数和参数类型后,反编译模块101可以根据函数调用规则的差异调整参数的存储位置。具体是反编译模块101根据函数调用规则的差异,对入参寄存器和栈进行跨平台处理,例如将寄存器中的若干参数入栈、对栈指针进行切换等等,使得不同平台下的运行时的入参寄存器和栈空间视角一致。
为了便于理解,下面结合一具体示例进行说明。
参见图5所示的对函数的参数进行调整的示意图,该示例中,函数test包括i0至i9共计10个参数。在x86平台下的运行时中,参数i0至i5存储在寄存器中,i6至i9存储在栈中。在ARM平台下的运行时中,参数i0至i7存储在寄存器中,i8至i9存储在栈中。反编译模块101可以将参数i6、i7入栈,并切换栈指针,从而使得不同平台下的运行时的入参寄存器和栈空间视角一致。
该方法通过利用编译器活跃寄存器分析和栈分析,得到精确入参寄存器和栈入参,减少不必要的函数调用约定的寄存器转换。
进一步的,当源平台与目标平台属于不同类别的平台时,如源平台与目标平台分别为x86平台和ARM平台等,反编译模块101在对第一代码进行反编译之前,还可以先获取该第一代码对应的注解信息,该第一代码的注解信息例如可以包括第一代码中参数的类型、数量、以及跳转地址的种类(汇编代码内部或外部跳转等)中的任意一种或多种,从而反编译模块101在对第一代码进行反编译时,可以根据该注解信息,确定编译器IR中参数的类型、数量、跳转地址类型。其中,该第一代码中的注解信息,可以是在对汇编语言的代码进行编译过程中生成,用于携带汇编语言的相关信息。以注解信息中的参数类型为例,假设第一代码中的参数的长度为64位,则在对第一代码进行反编译时所得到的第一IR中,参数的长度仍然可以是64位(如浮点型),而不会变更为32位等(如整型),如此,根据注解信息对第一代码进行反编译,可以使得反编译前后参数的类型保持一致,降低第一IR中出现逻辑错误的可能。
当然,在其它可能的实施方式中,反编译模块101在对第一代码进行反编译时,也可以无需考虑注解信息,比如,当源平台与目标平台之间为同一类型平台时,这两个平台之间的相似度较高,差异较小,如源平台与目标平台之间,对于同一指令语义的汇编语言,仅是指令格式存在差异等,反编译模块101不借助第一代码的注解信息也可以直接对该第一代码进行反编译。
进一步的,用于对指令串进行翻译的指令语义库中,还可以包括向量化指令语义,如SIMD指令语义(该SIMD指令可以同时对一组数据中的每个数据分别执行相同的操作以实现空间上的并行处理)等,该向量化指令语义可以用于对第一代码中的部分指令进行向量化翻译,从而得到该指令所对应的向量化IR。
通常情况下,向量化的代码(指令)来可以用来替代循环执行结构,这使得程序代码更为简洁,并且,代码执行效率也更高。比如,当第一代码中包括SIMD指令(用于对多个数据进行求和)时,若反编译模块101在对该SIMD指令不进行向量化处理,则反编译后所得到的第一IR中,其对应的代码执行过程为从一组数据中逐个执行读数据并求和的串行操作,而对该SIMD指令进行向量化处理后,反编译后所得到的第一IR中,其对应的代码执行过程为从一组数据中读取全部数据,并对该组的所有数据进行并行求和计算。
以第一代码中包括SIMD指令为例,反编译模块101在对第一代码进行翻译时,对于第一代码中的其它指令,可以根据该指令的语义,翻译成包括相应函数的IR;而对于第一代码中的SIMD指令,可以对该SIMD指令进行向量化翻译,得到具有向量化标记的第一IR。实际应用中,该向量化标记,例如可以是第一IR中的特殊符号,如“^”、“!”、“<”等符号。示例性的,技术人员可以预先向导入的指令语义库中添加源平台的SIMD指令的语义,从而在编译阶段,反编译模块101可以根据该指令语义库识别出第一代码中SIMD指令的语义。
其中,反编译模块101可以直接或者间接将第一代码中的SIMD指令翻译成具有向量化标记的IR。
在一种直接向量化的实施方式中,反编译模块101可以生成包括应用于目标平台的基于低级语言的的第三代码,该第三代码例如可以是包括目标平台对应的intrinsic函数的低级语言代码,该intrinsic函数可以对语言扩展或平台相关的能力进行包装并定义在C/C++等高级语言头文件中,这样,所生成的与目标平台相关的第三代码可以用于描述源平台的SIMD指令的向量化语义。然后,反编译模块101可以对该第三代码进行反编译,得到具有向量化标记的目标平台的SIMD指令所对应的第一IR。这样,后续编译器对该第一IR进行编译后,可以得到该目标平台的SIMD指令。
在一种间接向量化的实施方式中,反编译模块101可以生成与目标平台无关的基于高级语言的第四代码,该第四代码可以用于描述SIMD指令的向量化语义。然后,反编译模块101可以对基于高级语言的第四代码进行反编译,得到与平台无关的并且带有向量化标记的第一IR。这样,后续编译器可以对该第一IR进行自动向量化编译,生成目标平台的SIMD指令。
S203:将反编译得到的第一IR编译成应用于目标平台的基于低级语言的第二代码,该源平台与目标平台之间具有不同的指令集。
具体实现时,可以由编译模块102对得到的第一IR进行编译,得到能够在目标平台上运行的第二代码,当然,该第二代码为目标平台所支持的低级语言代码,如目标平台对应的汇编代码等。
通常情况下,对第一代码进行反编译所得到的IR,可能具有一定的优化空间。比如,当反编译模块101并没有基于目标平台的能力对第一代码进行反编译时,由于不同平台的能力通常存在差异,因此,为了使得反编译得到的IR可以适用于多种平台,反编译模块101可以是基于多个平台的最低能力对第一代码进行反编译,这使得反编译模块101还可以根据目标平台所具有的较高能力对所得到的IR进行优化,以使得目标平台在执行该IR对应的代码时,代码执行效率相对更高。其中,平台的能力可以包括平台所支持的数据读取速度、数据访存方式等。
举例来说,假设已有的各个平台在读取数据时,一部分平台能够一次性读取64bit(比特)的数据,而另一部分平台能够一次性读取128bit的数据。因此,反编译模块101在对第一代码进行反编译后,所得到的IR可以是如图6上方所示代码,如果目标平台基于该代码在读取数据时,每次仅读取64bit的数据,但是,目标平台实际上可以具有一次性读取128bit数据的能力,这使得目标平台在读取128位数据时,需要分两次进行读取,这就降低了代码执行效率。为此,反编译模块101可以根据目标平台能一次性读取128bit的能力,将图6上方所示的代码优化为图6下方所示的代码,以使得目标平台在基于该代码读取数据时,每次可以读取128bit的数据。
基于此,在进一步可能的实施方式中,反编译模块101可以对第一代码进行反编译,生成第二IR,然后,再根据该第一目标平台,对该第二IR进行优化,得到第一IR。比如,反编译模块101可以在对第一代码进行反编译并得到第二IR后,还可以确定该第二IR中各(句)指令串的语义,并根据语义与编译优化规则之间的对应关系,确定第二IR中各指令串的语义所对应的编译优化规则,从而基于所确定出的编译优化规则对第二IR进行优化,得到第一IR,从而编译模块102在进行编译时,可以是对优化得到的第一IR进行编译。
对第一IR进行编译后,可以得到“.obj”格式或者其它格式的二进制文件,从而可以根据该二进制文件生成应用于目标平台的汇编语言代码。这样,经过上述过程处理所得到的汇编语言代码能够适用于目标平台,从而能够在目标平台上成功运行,实现将源平台的代码移植到目标平台。
本实施例中,目标平台可以是区别于源平台的任意一个平台,即反编译模块101以及编译模块102可以将第一代码变换为适用于任意一个平台的基于低级语言的代码。具体的,为便于描述,以下将上述目标平台可以称之为第一目标平台,则反编译模块101以及编译模块102不仅可以基于上述过程,将源平台的第一代码,变换为适用于第一目标平台的低级语言代码,还可以类似过程,将源平台的第二代码,变换为适用于第二目标平台的低级语言代码,其中,第二目标平台、第一目标平台以及源平台互不相同,具体是具有不同的指令集。
实际应用中,可以是针对于用户的需求,确定所软件代码所要移植的目标平台。在一种示例性的具体实施方式中,可以向用户呈现目标平台选择界面,例如可以在终端的显示屏幕上呈现如图7所示的目标平台选择界面,该目标平台选择界面可以提供多个不同的候选目标平台,如图7所示的目标平台1、目标平台2、……、目标平台N(N为大于1的正整数)。用户可以在该目标平台选择界面上,根据实际需求从呈现的多个候选平台中执行针对于目标平台的选择操作,从多个目标平台中确定出上述第一目标平台或者第二目标平台,从而经过上述类似过程可以将第一代码变换为适用于第一目标平台或者第二目标平台的基于低级语言的代码。例如,用户可以是利用鼠标点击下拉菜单按钮,呈现多个目标平台,然后,用户将光标移动至所期望选择的目标平台,并通过点击鼠标实现对目标平台的选择,从而确定出第一目标平台。
进一步的,基于用户所选择的目标平台,目标平台选择界面上还可以呈现该目标平台的相关信息,比如,如图7所示,对于用户选中的目标平台,还可以呈现该目标平台的数据处理能力、所适用的硬件类型、所需的硬件环境等。
另外,在经过上述反编译以及编译过程,得到应用于第一目标平台的基于低级语言的代码后,还可以针对于该代码生成相应的提示信息,该提示信息可以用于指示源平台与第一目标平台之间的差异,然后,可以在该用户选择目标平台的界面上呈现该提示信息,以对用户做出提示。比如,可以提示用户第一代码中指令与第一目标平台的代码中的指令之间的对应关系,如通过特定颜色对两个平台的代码指令进行高亮显示等。实际应用中,该提示信息也可以是呈现在其它界面,不局限于上述目标平台选择界面,本实施例对于如何呈现提示信息以及呈现提示信息的具体实现方式并不进行限定。
为便于理解,下面从人机交互的角度对本申请实施例的技术方案进行描述。参见图8所示的用户801与计算设备802交互的流程示意图。其中,计算设备802具体可以是云端设备,如云端的服务器等,或者是本地的终端/服务器等。如图8所示,该流程具体可以包括:
S801:计算设备802向用户801呈现目标平台选择界面,该目标平台选择界面中提供多个候选的目标平台。
本实施例中,计算设备802可以支持将软件代码移植到多种不同的目标平台,则,计算设备802可以先向用户呈现目标平台选择界面,并在该目标平台选择界面上呈现计算设备802所支持的能够移植的目标平台,以供用户进行选择。其中,不同平台之间至少具有不同的指令集。
S802:计算设备802根据用户针对目标平台的选择操作,从多个目标平台中确定出第一目标平台。
S803:用户801向计算设备802发送应用于源平台的基于低级语言的第一代码。
其中,用户801具体可以是通过终端或者客户端等媒介,实现将第一代码发送给计算设备802。
本实施例中,第一代码可以是基于“.obj”格式的二进制文件,或者是基于其它格式的二进制文件。在其它实施例中,用户也可以是向计算设备802发送源平台的汇编语言代码,这样,计算设备802在接收到汇编语言代码后,可以先对该汇编语言代码进行汇编处理,得到“.obj”格式或者其它格式的二进制文件。
S804:计算设备802在代码显示界面呈现第二代码,该第二代码为应用于第一目标平台的基于低级语言的代码。
其中,第二代码是通过对第一代码进行处理得到的,具体的,第二代码可以是由计算设备802对第一代码进行反编译以及编译处理而得到,其具体实现可参见前述实施例中的相关之处描述,在此不做赘述。
并且,计算设备802在得到第二代码后,可以在相应的代码显示界面上呈现该第二代码,以使得用户801能够查看到处理得到的第二代码具体如何。
本实施例中,第二代码可以是“obj”格式或者其它格式的二进制文件。在其它可能的实施例中,第二代码也可以是基于够适用于第一目标平台的其它语言的代码,例如可以是适用于第一目标平台的汇编语言代码,该汇编语言代码可以对第一代码进行反编译以及编译后生成的“obj”格式文件进行转换得到的。
S805:计算设备802呈现提示信息。
本实施例中,计算设备802可以对用户801进行提示,如提示第一代码中的指令与第二代码中的指令之间的对应关系;或者提示用户801在代码移植过程中所可能出现的问题。本实施例中,对于计算设备802呈现提示信息的内容以及具体实现并不进行限定。
S806:用户801对计算设备802呈现的第二代码进行修改。
示例性的,用户801在查看第二代码或者提示信息后,可以对第二代码进行更改,如通过提示信息或者查看第二代码发现第二代码中出现逻辑漏洞时,可以对第二代码进行修改,以解决该逻辑漏洞问题。
S807:计算设备802呈现修改后的第二代码。
实际应用中,用户801还可以继续对修改后的第二代码进行进一步修改,直至代码符合用户的预期。
S808:计算设备802呈现第一IR或第二IR。
计算设备802在对第一代码进行反编译的过程中,可以先根据第一代码反编译得到第二IR,然后,通过对该第二IR的进一步优化,可以得到第一IR。则,计算设备802可以将反编译过程中所得到的第一IR或第二IR呈现给用户801。
这样,用户801可以查看计算设备802所呈现的第一IR或第二IR,并可以对该第一IR或第二IR进行调试,从而计算设备802可以根据调试后的第一IR或者第二IR,得到相应的应用于第一目标平台的基于低级语言的代码。
在进一步可能的实施方式中,本实施例还可以包括:
S809:用户801对源平台对应的指令语义库进行修改。
在反编译过程中,计算设备802通常是根据源平台对应的指令语义库对第一代码进行反编译,而用户可以通过查看第二代码、提示信息或者IR,对反编译过程中所使用的指令语义库进行调整,如向指令语义库中新增源平台对应的SIMD指令的语义等,以便基于调整后的指令语义库对第一代码进行反编译时,所得到的IR或者应用于第一目标平台上的代码能够更优。
值得注意的是,对于本实施例中,计算设备802对于第一代码的反编译、编译及其相关过程,可以参见前述实施例的相关之处描述,在此不做赘述。
上文中结合图1至图8,详细描述了本申请所提供的代码处理方法,下面将结合图9至图10,描述根据本申请所提供的计算装置。
与上述方法同样的发明构思,本申请实施例还提供一种计算装置,该装置可以实现上述图2所示的实施例中计算设备的功能。参见图9所示,该装置900可以包括:
获取模块901,用于获取应用于源平台的基于低级语言的第一代码;
反编译模块902,用于对所述第一代码进行反编译,得到第一中间表示IR;
编译模块903,用于将所述第一IR编译成应用于第一目标平台的基于低级语言的第二代码,所述源平台与所述第一目标平台具有不同指令集。
在一种可能的实施方式中,所述反编译模块902,还用于对所述第一代码进行反编译,得到第二目标平台对应的IR,所述第一IR与所述第二目标平台对应的IR不同,所述第一目标平台与所述第二目标平台具有不同指令集。
在一种可能的实施方式中,所述装置900还包括:
呈现模块904,用于呈现目标平台选择界面;
确定模块905,用于响应针对于目标平台的选择操作,从多个目标平台中确定出所述第一目标平台。
在一种可能的实施方式中,所述反编译模块902,具体用于:
获取所述第一代码的注解信息,所述注解信息包括所述第一代码中参数的类型、数量、跳转地址种类中的任意一种或者多种;
根据所述注解信息,对所述第一代码进行反编译,得到所述第一IR。
在一种可能的实施方式中,所述反编译模块902,具体用于:
对所述第一代码进行反编译,得到第二IR;
根据所述第一目标平台,对所述第二IR进行优化,得到所述第一IR。
在一种可能的实施方式中,所述装置900还包括:
生成模块906,用于生成提示信息,所述提示信息用于针对待检查项进行提示,所述待检查项基于所述第一目标平台与所述源平台之间的差异生成;
呈现模块904,用于呈现所述提示信息。
在一种可能的实施方式中,所述装置应用于云端,所述获取模块901,具体用于接收来自用户的第一代码;
所述装置900还包括:通信模块907,用于向所述用户发送应用于第一目标平台的基于低级语言的第二代码。
在一种可能的实施方式中,所述反编译模块902,具体用于根据所述源平台对应的指令语义库,对所述第一代码进行反编译。
在一种可能的实施方式中,所述装置900还包括:
修改模块908,用于响应于针对所述指令语义库的修改操作,对所述指令语义库进行修改。
在一种可能的实施方式中,所述获取模块901,具体用于获取应用于源平台的基于低级语言的第一代码以及基于高级语言的变量;
所述反编译模块902,具体用于将所述第一代码翻译成包括函数的第一IR,所述函数中包括形参,所述形参对应的实参为所述变量。
在一种可能的实施方式中,所述第一IR包括第一变量以及第二变量,所述第一变量具有第一逻辑地址,所述第二变量具有第二逻辑地址,所述第一逻辑地址与所述第二逻辑地址不同。
在一种可能的实施方式中,所述反编译模块902,具体用于根据所述目标平台函数调用约定或单指令流多数据流SIMD指令,对所述第一代码进行反编译。
本实施例中的计算装置900,对应于图2所示的代码处理方法,因此,对于本实施例计算装置900中各个功能模块的具体实现及其所具有的技术效果,可以参见图2所示实施例中的相关之处描述,在此不做赘述。
此外,本申请实施例还提供了另外一种计算装置,该装置可以实现上述图8所示的实施例中计算设备802的功能。参见图10所示,该装置1000可以包括:
获取模块1001,用于获取应用于源平台的基于低级语言的第一代码;
输出模块1002,用于输出第二代码,所述第二代码为应用于第一目标平台的基于低级语言的代码,所述第二代码是对所述第一代码进行处理得到的,所述源平台与所述第一目标平台具有不同指令集。
在一种可能的实施方式中,所述输出模块1002,具体用于通过代码显示界面呈现所述第二代码。
在一种可能的实施方式中,所述装置应用于云端,所述获取模块1001,具体用于接收来自用户的第一代码;
所述输出模块1002,具体用于向所述用户输出所述第二代码。
在一种可能的实施方式中,所述装置1000还包括:
呈现模块1003,用于呈现目标平台选择界面;
确定模块1004,用于响应针对于目标平台的选择操作,从多个目标平台中确定出所述第一目标平台。
在一种可能的实施方式中,所述获取模块1001,还用于获取所述源平台对应的指令语义库,所述指令语义库用于对所述第一代码进行处理。
在一种可能的实施方式中,所述装置1000还包括:
修改模块1005,用于响应于针对所述指令语义库的修改操作,对所述指令语义库进行修改。
在一种可能的实施方式中,所述装置1000还包括:
生成模块1006,用于生成提示信息,所述提示信息用于针对待检查项进行提示,所述待检查项基于所述第一目标平台与所述源平台之间的差异生成;
呈现模块1003,用于呈现所述提示信息。
在一种可能的实施方式中,所述装置1000还包括:
呈现模块1003,用于呈现第一中间表示IR,所述第一IR是对所述第一代码进行反编译得到,所述第二代码是对所述第一IR进行编译得到。
在一种可能的实施方式中,所述呈现模块1003,还用于呈现第二IR,所述第二IR是对所述第一代码进行反编译得到,所述第一IR是根据所述第一目标平台对所述第一IR进行优化得到。
在一种可能的实施方式中,所述装置1000还包括:
修改模块1005,用于响应于针对所述第一IR的修改操作,得到修改后的第一IR;
所述呈现模块1003,还用于呈现第三代码,所述第三代码为应用于第一目标平台的基于低级语言的代码,所述第三代码是对所述修改后的第一IR进行编译得到的。
在一种可能的实施方式中,所述呈现模块1003,还用于呈现第三IR,所述第三IR是对所述第一代码进行反编译得到,所述第三IR用于生成应用于第二目标平台的基于低级语言的代码,所述第三IR与所述第一IR不同。
在一种可能的实施方式中,装置1000还包括:
修改模块1005,用于响应于针对所述第二代码的修改操作,得到修改后的第二代码;
所述输出模块1002,还用于输出所述修改后的第二代码。
在一种可能的实施方式中,所述获取模块1001,具体用于获取应用于源平台的基于低级语言的第一代码以及基于高级语言的变量。
本实施例中的计算装置1000,对应于图8所示的代码处理方法,因此,对于本实施例计算装置1000中各个功能模块的具体实现及其所具有的技术效果,可以参见图8所示实施例中的相关之处描述,在此不做赘述。
此外,本申请实施例还提供一种计算装置,如图11所示,装置1100中可以包括通信接口1110、处理器1120。可选的,装置1100中还可以包括存储器1130。其中,存储器1130可以设置于装置1100内部,还可以设置于装置1100外部。示例性地,上述图2所示实施例中各个动作均可以由处理器1120实现。处理器1120可以通过通信接口1110获取应用于源平台的第一代码,并用于实现图2中所执行的任一方法。在实现过程中,处理流程的各步骤可以通过处理器1120中的硬件的集成逻辑电路或者软件形式的指令完成图2中执行的方法。为了简洁,在此不再赘述。处理器1120用于实现上述方法所执行的程序代码可以存储在存储器1130中。存储器1130和处理器1120连接,如耦合连接等。
本申请实施例的一些特征可以由处理器1120执行存储器1230中的程序指令或者软件代码来完成/支持。存储器1230上在加载的软件组件可以从功能或者逻辑上进行概括,例如,图9所示的获取模块901、反编译模块902、编译模块903、呈现模块904、确定模块905生成模块906、以及修改模块908。而通信模块907的功能可以由通信接口1110实现。
本申请实施例中涉及到的任一通信接口可以是电路、总线、收发器或者其它任意可以用于进行信息交互的装置。比如装置1100中的通信接口1110,示例性地,该其它装置可以是与该装置1100相连的设备,比如,可以是提供第一代码的用户终端等。
此外,本申请实施例还提供一种计算装置,如图12所示,装置1200中可以包括通信接口1210、处理器1220。可选的,装置1200中还可以包括存储器1230。其中,存储器1230可以设置于装置1200内部,还可以设置于装置1200外部。示例性地,上述图8所示实施例中各个动作均可以由处理器1220实现。处理器1220可以通过通信接口1210获取应用于源平台的第一代码,并用于实现图8中所执行的任一方法。在实现过程中,处理流程的各步骤可以通过处理器1220中的硬件的集成逻辑电路或者软件形式的指令完成图8中执行的方法。为了简洁,在此不再赘述。处理器1220用于实现上述方法所执行的程序代码可以存储在存储器1230中。存储器1230和处理器1220连接,如耦合连接等。
本申请实施例的一些特征可以由处理器1220执行存储器1230中的程序指令或者软件代码来完成/支持。存储器1230上在加载的软件组件可以从功能或者逻辑上进行概括,例如,图10所示的获取模块1001、输出模块1002、呈现模块1003、确定模块1004、修改模块1005以及生成模块1006。
本申请实施例中涉及到的任一通信接口可以是电路、总线、收发器或者其它任意可以用于进行信息交互的装置。比如装置1200中的通信接口1210,示例性地,该其它装置可以是与该装置1200相连的设备,比如,可以是提供第一代码的用户终端等。
本申请实施例中涉及的处理器可以是通用处理器、数字信号处理器、专用集成电路、现场可编程门阵列或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件,可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合本申请实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
本申请实施例中的耦合是装置、模块或模块之间的间接耦合或通信连接,可以是电性,机械或其它的形式,用于装置、模块或模块之间的信息交互。
处理器可能和存储器协同操作。存储器可以是非易失性存储器,比如硬盘(harddisk drive,HDD)或固态硬盘(solid-state drive,SSD)等,还可以是易失性存储器(volatile memory),例如随机存取存储器(random-access memory,RAM)。存储器是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。
本申请实施例中不限定上述通信接口、处理器以及存储器之间的具体连接介质。比如存储器、处理器以及通信接口之间可以通过总线连接。所述总线可以分为地址总线、数据总线、控制总线等。
基于以上实施例,本申请实施例还提供了一种计算机存储介质,该存储介质中存储软件程序,该软件程序在被一个或多个处理器读取并执行时可实现上述任意一个或多个实施例提供代理边缘侧设备或边缘侧设备或云中心执行的方法。所述计算机存储介质可以包括:U盘、移动硬盘、只读存储器、随机存取存储器、磁碟或者光盘等各种可以存储程序代码的介质。
基于以上实施例,本申请实施例还提供了一种芯片,该芯片包括处理器,用于实现上述实施例所涉及的代理边缘侧设备的功能或者边缘侧设备的功能或者云中心的功能,例如用于实现图3~图4中代理边缘侧设备所执行的方法,用于实现图3~图4中边缘侧设备所执行的方法,或者用于实现图3~图4中云中心所执行的方法。可选地,所述芯片还包括存储器,所述存储器,用于处理器所执行必要的程序指令和数据。该芯片,可以由芯片构成,也可以包含芯片和其他分立器件。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的术语在适当情况下可以互换,这仅仅是描述本申请的实施例中对相同属性的对象在描述时所采用的区分方式。
显然,本领域的技术人员可以对本申请实施例进行各种改动和变型而不脱离本申请实施例的范围。这样,倘若本申请实施例的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

Claims (56)

1.一种代码处理方法,其特征在于,所述方法包括:
获取应用于源平台的基于低级语言的第一代码;
对所述第一代码进行反编译,得到第一中间表示IR;
将所述第一IR编译成应用于第一目标平台的基于低级语言的第二代码,所述源平台与所述第一目标平台具有不同指令集。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
对所述第一代码进行反编译,得到第二目标平台对应的IR,所述第一IR与所述第二目标平台对应的IR不同,所述第一目标平台与所述第二目标平台具有不同指令集。
3.根据权利要求1或2所述的方法,其特征在于,所述方法还包括:
呈现目标平台选择界面;
响应针对于目标平台的选择操作,从多个目标平台中确定出所述第一目标平台。
4.根据权利要求1至3任一项所述的方法,其特征在于,所述对所述第一代码进行反编译,得到第一中间表示IR,包括:
获取所述第一代码的注解信息,所述注解信息包括所述第一代码中参数的类型、数量、跳转地址种类中的任意一种或者多种;
根据所述注解信息,对所述第一代码进行反编译,得到所述第一IR。
5.根据权利要求1至4任一项所述的方法,其特征在于,所述对所述第一代码进行反编译,得到第一中间表示IR,包括:
对所述第一代码进行反编译,得到第二IR;
根据所述第一目标平台,对所述第二IR进行优化,得到所述第一IR。
6.根据权利要求1至5任一项所述的方法,其特征在于,所述方法还包括:
生成提示信息,所述提示信息用于针对待检查项进行提示,所述待检查项基于所述第一目标平台与所述源平台之间的差异生成;
呈现所述提示信息。
7.根据权利1至6任一项所述的方法,其特征在于,所述方法应用于云端,所述获取第一代码,包括:
接收来自用户的第一代码;
所述方法还包括:
向所述用户发送所述第二代码。
8.根据权利要求1至7任一项所述的方法,其特征在于,所述对所述第一代码进行反编译,包括:
根据所述源平台对应的指令语义库,对所述第一代码进行反编译。
9.根据权利要求8所述的方法,其特征在于,所述方法还包括:
响应于针对所述指令语义库的修改操作,对所述指令语义库进行修改。
10.根据权利要求1至9任一项所述的方法,其特征在于,所述获取应用于源平台的基于低级语言的第一代码,包括:
获取应用于源平台的基于低级语言的第一代码以及基于高级语言的变量;
所述对所述第一代码进行反编译,包括:
将所述第一代码翻译成包括函数的第一IR,所述函数中包括形参,所述形参对应的实参为所述变量。
11.根据权利要求1至10任一项所述的方法,其特征在于,所述第一IR包括第一变量以及第二变量,所述第一变量具有第一逻辑地址,所述第二变量具有第二逻辑地址,所述第一逻辑地址与所述第二逻辑地址不同。
12.根据权利要求1至11任一项所述的方法,其特征在于,所述对所述第一代码进行反编译,包括:
根据所述目标平台函数调用约定或单指令流多数据流SIMD指令,对所述第一代码进行反编译。
13.一种代码处理方法,其特征在于,所述方法包括:
获取应用于源平台的基于低级语言的第一代码;
输出第二代码,所述第二代码为应用于第一目标平台的基于低级语言的代码,所述第二代码是对所述第一代码进行处理得到的,所述源平台与所述第一目标平台具有不同指令集。
14.根据权利要求13所述的方法,其特征在于,所述输出第二代码,包括:
通过代码显示界面呈现所述第二代码。
15.根据权利要求13或14所述的方法,其特征在于,所述方法应用于云端,所述获取第一代码,包括:
接收来自用户的第一代码;
所述输出所述第二代码,包括:
向所述用户输出所述第二代码。
16.根据权利要求13至15任一项所述的方法,其特征在于,所述方法还包括:
呈现目标平台选择界面;
响应针对于目标平台的选择操作,从多个目标平台中确定出所述第一目标平台。
17.根据权利要求13至16任一项所述的方法,其特征在于,所述方法还包括:
获取所述源平台对应的指令语义库,所述指令语义库用于对所述第一代码进行处理。
18.根据权利要求17所述的方法,其特征在于,所述方法还包括:
响应于针对所述指令语义库的修改操作,对所述指令语义库进行修改。
19.根据权利要求13至18任一项所述的方法,其特征在于,所述方法还包括:
生成提示信息,所述提示信息用于针对待检查项进行提示,所述待检查项基于所述第一目标平台与所述源平台之间的差异生成;
呈现所述提示信息。
20.根据权利要求13至19任一项所述的方法,其特征在于,所述方法还包括:
呈现第一中间表示IR,所述第一IR是对所述第一代码进行反编译得到,所述第二代码是对所述第一IR进行编译得到。
21.根据权利要求20所述的方法,其特征在于,所述方法还包括:
呈现第二IR,所述第二IR是对所述第一代码进行反编译得到,所述第一IR是根据所述第一目标平台对所述第一IR进行优化得到。
22.根据权利要求20或21所述的方法,其特征在于,所述方法还包括:
响应于针对所述第一IR的修改操作,得到修改后的第一IR;
呈现第三代码,所述第三代码为应用于第一目标平台的基于低级语言的代码,所述第三代码是对所述修改后的第一IR进行编译得到的。
23.根据权利要求20至22任一项所述的方法,其特征在于,所述方法还包括:
呈现第三IR,所述第三IR是对所述第一代码进行反编译得到,所述第三IR用于生成应用于第二目标平台的基于低级语言的代码,所述第三IR与所述第一IR不同。
24.根据权利要求13至23任一项所述的方法,其特征在于,方法还包括:
响应于针对所述第二代码的修改操作,得到修改后的第二代码;
输出所述修改后的第二代码。
25.根据权利要求13至24任一项所述的方法,其特征在于,所述获取应用于源平台的基于低级语言的第一代码,包括:
获取应用于源平台的基于低级语言的第一代码以及基于高级语言的变量。
26.一种代码处理装置,其特征在于,所述装置包括:
获取模块,用于获取应用于源平台的基于低级语言的第一代码;
反编译模块,用于对所述第一代码进行反编译,得到第一中间表示IR;
编译模块,用于将所述第一IR编译成应用于第一目标平台的基于低级语言的第二代码,所述源平台与所述第一目标平台具有不同指令集。
27.根据权利要求26所述的装置,其特征在于,所述反编译模块,还用于对所述第一代码进行反编译,得到第二目标平台对应的IR,所述第一IR与所述第二目标平台对应的IR不同,所述第一目标平台与所述第二目标平台具有不同指令集。
28.根据权利要求25或26所述的装置,其特征在于,所述装置还包括:
呈现模块,用于呈现目标平台选择界面;
确定模块,用于响应针对于目标平台的选择操作,从多个目标平台中确定出所述第一目标平台。
29.根据权利要求26至28任一项所述的装置,其特征在于,所述反编译模块,具体用于:
获取所述第一代码的注解信息,所述注解信息包括所述第一代码中参数的类型、数量、跳转地址种类中的任意一种或者多种;
根据所述注解信息,对所述第一代码进行反编译,得到所述第一IR。
30.根据权利要求26至29任一项所述的装置,其特征在于,所述反编译模块,具体用于:
对所述第一代码进行反编译,得到第二IR;
根据所述第一目标平台,对所述第二IR进行优化,得到所述第一IR。
31.根据权利要求26至30任一项所述的装置,其特征在于,所述装置还包括:
生成模块,用于生成提示信息,所述提示信息用于针对待检查项进行提示,所述待检查项基于所述第一目标平台与所述源平台之间的差异生成;
呈现模块,用于呈现所述提示信息。
32.根据权利26至31任一项所述的装置,其特征在于,所述装置应用于云端,所述获取模块,具体用于接收来自用户的第一代码;
所述装置还包括:通信模块,用于向所述用户发送应用于第一目标平台的基于低级语言的第二代码。
33.根据权利要求26至32任一项所述的装置,其特征在于,所述反编译模块,具体用于根据所述源平台对应的指令语义库,对所述第一代码进行反编译。
34.根据权利要求33所述的装置,其特征在于,所述装置还包括:
修改模块,用于响应于针对所述指令语义库的修改操作,对所述指令语义库进行修改。
35.根据权利要求26至34任一项所述的装置,其特征在于,所述获取模块,具体用于获取应用于源平台的基于低级语言的第一代码以及基于高级语言的变量;
所述反编译模块,具体用于将所述第一代码翻译成包括函数的第一IR,所述函数中包括形参,所述形参对应的实参为所述变量。
36.根据权利要求26至35任一项所述的装置,其特征在于,所述第一IR包括第一变量以及第二变量,所述第一变量具有第一逻辑地址,所述第二变量具有第二逻辑地址,所述第一逻辑地址与所述第二逻辑地址不同。
37.根据权利要求26至36任一项所述的装置,其特征在于,所述反编译模块,具体用于根据所述目标平台函数调用约定或单指令流多数据流SIMD指令,对所述第一代码进行反编译。
38.一种代码处理装置,其特征在于,所述装置包括:
获取模块,用于获取应用于源平台的基于低级语言的第一代码;
输出模块,用于输出第二代码,所述第二代码为应用于第一目标平台的基于低级语言的代码,所述第二代码是对所述第一代码进行处理得到的,所述源平台与所述第一目标平台具有不同指令集。
39.根据权利要求38所述的装置,其特征在于,所述输出模块,具体用于通过代码显示界面呈现所述第二代码。
40.根据权利要求38或39所述的装置,其特征在于,所述装置应用于云端,所述获取模块,具体用于接收来自用户的第一代码;
所述输出模块,具体用于向所述用户输出所述第二代码。
41.根据权利要求38至40任一项所述的装置,其特征在于,所述装置还包括:
呈现模块,用于呈现目标平台选择界面;
确定模块,用于响应针对于目标平台的选择操作,从多个目标平台中确定出所述第一目标平台。
42.根据权利要求38至41任一项所述的装置,其特征在于,所述获取模块,还用于获取所述源平台对应的指令语义库,所述指令语义库用于对所述第一代码进行处理。
43.根据权利要求42所述的装置,其特征在于,所述装置还包括:
修改模块,用于响应于针对所述指令语义库的修改操作,对所述指令语义库进行修改。
44.根据权利要求38至43任一项所述的装置,其特征在于,所述装置还包括:
生成模块,用于生成提示信息,所述提示信息用于针对待检查项进行提示,所述待检查项基于所述第一目标平台与所述源平台之间的差异生成;
呈现模块,用于呈现所述提示信息。
45.根据权利要求38至44任一项所述的装置,其特征在于,所述装置还包括:
呈现模块,用于呈现第一中间表示IR,所述第一IR是对所述第一代码进行反编译得到,所述第二代码是对所述第一IR进行编译得到。
46.根据权利要求45所述的装置,其特征在于,所述呈现模块,还用于呈现第二IR,所述第二IR是对所述第一代码进行反编译得到,所述第一IR是根据所述第一目标平台对所述第一IR进行优化得到。
47.根据权利要求45或46所述的装置,其特征在于,所述装置还包括:
修改模块,用于响应于针对所述第一IR的修改操作,得到修改后的第一IR;
所述呈现模块,还用于呈现第三代码,所述第三代码为应用于第一目标平台的基于低级语言的代码,所述第三代码是对所述修改后的第一IR进行编译得到的。
48.根据权利要求45至47任一项所述的装置,其特征在于,所述呈现模块,还用于呈现第三IR,所述第三IR是对所述第一代码进行反编译得到,所述第三IR用于生成应用于第二目标平台的基于低级语言的代码,所述第三IR与所述第一IR不同。
49.根据权利要求38至48任一项所述的装置,其特征在于,装置还包括:
修改模块,用于响应于针对所述第二代码的修改操作,得到修改后的第二代码;
所述输出模块,还用于输出所述修改后的第二代码。
50.根据权利要求38至49任一项所述的装置,其特征在于,所述获取模块,具体用于获取应用于源平台的基于低级语言的第一代码以及基于高级语言的变量。
51.一种计算装置,其特征在于,所述装置包括存储器和处理器,所述存储器,用于存储软件指令;所述处理器调用所述存储器存储的软件指令,以执行上述权利要求1至12中任一所述的方法。
52.一种计算装置,其特征在于,所述装置包括存储器和处理器,所述存储器,用于存储软件指令;所述处理器调用所述存储器存储的软件指令,以执行上述权利要求13至25中任一所述的方法。
53.一种计算机可读存储介质,其特征在于,包括指令,所述指令用于实现如权利要求1至12中任一项所述的方法。
54.一种计算机可读存储介质,其特征在于,包括指令,所述指令用于实现如权利要求13至25中任一项所述的方法。
55.一种计算机程序产品,其特征在于,当其在计算机上运行时,使得计算机执行如权利要求1至12中任一项所述的方法。
56.一种计算机程序产品,其特征在于,当其在计算机上运行时,使得计算机执行如权利要求13至25中任一项所述的方法。
CN202011066288.4A 2020-09-21 2020-09-30 一种代码处理方法、装置及存储介质 Pending CN114253554A (zh)

Priority Applications (3)

Application Number Priority Date Filing Date Title
PCT/CN2021/117845 WO2022057743A1 (zh) 2020-09-21 2021-09-11 一种代码处理方法、装置及存储介质
EP21868568.3A EP4206904A4 (en) 2020-09-21 2021-09-11 CODE PROCESSING METHOD AND DEVICE AND STORAGE MEDIUM
US18/185,894 US20230229410A1 (en) 2020-09-21 2023-03-17 Code processing method and apparatus, and storage medium

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
CN2020109963876 2020-09-21
CN202010996387 2020-09-21

Publications (1)

Publication Number Publication Date
CN114253554A true CN114253554A (zh) 2022-03-29

Family

ID=80790748

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011066288.4A Pending CN114253554A (zh) 2020-09-21 2020-09-30 一种代码处理方法、装置及存储介质

Country Status (1)

Country Link
CN (1) CN114253554A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115809063A (zh) * 2022-12-05 2023-03-17 星环信息科技(上海)股份有限公司 一种存储过程编译方法、系统、电子设备和存储介质

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115809063A (zh) * 2022-12-05 2023-03-17 星环信息科技(上海)股份有限公司 一种存储过程编译方法、系统、电子设备和存储介质
CN115809063B (zh) * 2022-12-05 2023-08-22 星环信息科技(上海)股份有限公司 一种存储过程编译方法、系统、电子设备和存储介质

Similar Documents

Publication Publication Date Title
US8756590B2 (en) Binding data parallel device source code
CN100555218C (zh) 用于改善片上仿真系统中高级语言的仿真速度的装置和方法
CN102402451B (zh) 用户定义类型的编译时边界检查
JPH07122854B2 (ja) プログラム翻訳方法
CN107273176B (zh) 一种适配硬件架构的编译方法及装置
US20110093837A1 (en) Method and apparatus for enabling parallel processing during execution of a cobol source program using two-stage compilation
US8869126B2 (en) Method and apparatus enabling multi threaded program execution for a Cobol program including OpenMP directives by utilizing a two-stage compilation process
CN109564540A (zh) 用于jit编译器的调试工具
CN104134039A (zh) 病毒查杀方法、客户端、服务器以及病毒查杀系统
CN102364433B (zh) 在ARM处理器上实现Wine构建工具移植的方法
CN111767116A (zh) 面向机械臂程序开发编程语言的虚拟机及对汇编文件的运行方法
CN111459499A (zh) 程序编译方法及装置、计算机存储介质、电子设备
US7441237B2 (en) System and method for extending a compiler through a composer
CN114253554A (zh) 一种代码处理方法、装置及存储介质
CN109284222B (zh) 软件单元、数据处理系统中的项目测试方法、装置及设备
US20090228869A1 (en) Annotating exception information in a computer program
US20230113783A1 (en) Cross-platform code conversion method and device
WO2022057743A1 (zh) 一种代码处理方法、装置及存储介质
CN114816436A (zh) 一种基于反汇编的源码解析装置
Sorgatz Dynamic Modules: User’s Manual and Programming Guide for MuPAD 1.4
CN111767033A (zh) 用于机械臂程序开发的编程系统及功能扩展方法
WO2022068559A1 (zh) 一种代码处理方法、装置及设备
Wang MPIRace: A Static Data Race Detector for MPI Programs
Maliavko et al. Functionally Imperative Programming Language El and its Implementation
Sunayana et al. Survey of Non-English Language Compilers:(Exploring the Diversity of Programming Languages)

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