CN116594622A - 基于类型推导与数据流分析的Python程序编译方法及系统 - Google Patents

基于类型推导与数据流分析的Python程序编译方法及系统 Download PDF

Info

Publication number
CN116594622A
CN116594622A CN202310347171.0A CN202310347171A CN116594622A CN 116594622 A CN116594622 A CN 116594622A CN 202310347171 A CN202310347171 A CN 202310347171A CN 116594622 A CN116594622 A CN 116594622A
Authority
CN
China
Prior art keywords
python
cpy
type
intermediate code
compiling
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
CN202310347171.0A
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.)
Nanjing University
Original Assignee
Nanjing University
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 Nanjing University filed Critical Nanjing University
Priority to CN202310347171.0A priority Critical patent/CN116594622A/zh
Publication of CN116594622A publication Critical patent/CN116594622A/zh
Pending legal-status Critical Current

Links

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
    • G06F8/427Parsing
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Abstract

本发明公开基于类型推导与数据流分析的Python程序编译方法及系统,属于计算机技术领域。该方法包括:对Python字节码进行控制流和数据流分析,并将所述Python字节码转换为基本块;遍历获得的所述基本块,将Python字节码转换为CPY中间代码,并使用内置方法替换Python API调用;使用类型推导算法推导出CPY中间代码中变量的类型信息,并根据类型推导结果选择静态或动态编译模式,将CPY中间代码转换为不同模式的LLVM中间代码;根据编译模式,调用LLVM链接器来链接已编译的模块或CPython库文件,以生成可执行文件。本发明用于静态编译动态类型语言程序,解决了动态类型语言程序运行效率低的问题,同时本发明采用了静态编译模式和动态编译模式,有效提升了程序的兼容性。

Description

基于类型推导与数据流分析的Python程序编译方法及系统
技术领域
本发明属于计算机技术领域,尤其是编译原理、程序语言分析和程序优化领域,且特别是涉及一种基于类型推导与数据流分析的Python程序编译方法及系统。
背景技术
Python是一门流行的动态类型语言,目前被广泛应用于Web开发、机器学习等领域。Python以其简洁的语法、丰富的第三方库和优异的跨平台特性等优势,愈发受到开发者的青睐。与C/C++等静态类型语言相比,Python无需类型声明,只在运行时进行类型检查。此外,Python也提供了反射等动态特性,以在程序运行时动态地改变代码及逻辑结构,方便程序实现与调试,提高了开发效率。然而,Python简化了开发工作的同时,也增加了程序运行时的开销,导致了性能上的损失。例如,由于无需显式声明变量类型,将类型检查等工作延迟到运行时完成,导致了运行时开销比静态类型语言程序高。
CPython是用C语言实现的Python解释器,也是目前应用最广泛的Python实现方式。作为一门解释型语言,CPython不会直接将Python源代码编译为机器代码,而是先将Python源代码编译生成字节码对象,然后执行其中的字节码序列。与解释型语言不同,编译型语言在编译期间直接生成机器码,执行速度通常比解释型语言快。许多动态语言解释器采用即时编译等一系列优化技术,在运行时将程序编译生成机器码,以提高程序执行性能。例如,V8引擎是JavaScript的一个实现,其引入了即时编译技术,提高了JavaScript程序的执行效率。研究发现,在某些功能上,用Python编写的程序比用JavaScript编写的程序慢。一方面,CPython未采用即时编译等常见的优化技术;另一方面,Python最初关注的不是程序的执行速度,而是程序的灵活性与易用性。然而,随着Python的日益流行和用户数量的增加,Python的执行速度也愈发受到人们的关注。
CPython仅集成了较少的优化技术,但Python的其他实现及优化方式不断涌现。这些实现及优化方式可以分为三类方案,第一类是重新实现Python语言。例如,PyPy是用RPython编写的Python实现方式,提供了即时编译、优化的数据模型和垃圾回收机制。Jython和GraalPython是用Java编写的Python实现方式,旨在将Python程序运行在Java虚拟机上。IronPython是由C#编写的Python实现,运行在.Net平台上。第二类是对CPython的优化实现方式。例如,Pyston是Anaconda开发的,使用即时编译、缓存等多项优化技术。Cinder是Facebook开发的,提供了specialized、缓存等多项优化技术。第三类是Python的第三方库。例如,Numba是用于科学计算的第三方库,可提高程序的执行速度。Pyjion是微软推出的具有即时编译功能的第三方库,将Python程序编译为.Net平台上的机器码。
在上述Python实现及优化方案中,第一类方案对现有的Python生态支持较差,PyPy、Jython等Python实现无法直接使用现有的大部分Python第三方库。虽然在有限的应用领域中可以实现程序优化,但是这个方案仍存在一定的局限性。此外,现有的Python实现没有考虑使用LLVM作为后端。LLVM是模块化、可重用编译器和工具链技术的集合。基于LLVM中间代码,LLVM可以用于开发任何编程语言、任何指令集架构的后端,并实施相应的静态检查和优化工作。第二类方案能够在最大程度上兼容CPython提供的API,并提升程序的性能。但是,该方案必须依赖现有的CPython解释器,且优化过程依赖于对程序长时间的统计分析。对规模较小或运行时间较短的程序,只能收集有限的信息,因此优化的效果有限。第三类方案需要开发者通过特定的编程方式来使用第三方库所提供的功能,因此需要修改现有的代码。现有的优化技术对Python程序的兼容性以及第三方库的支持有限,并且没有充分地利用变量的类型信息和使用合适的类型推导算法来推导变量的类型。大部分场景下,变量仍然以Python对象的方式进行操作,对内存以及程序性能优化有限。此外,以第三方库形式的优化方案需要对原有的代码进行修改,增加了程序的开发与维护成本。
发明内容
本发明的目的在于,克服现有技术存在的技术缺陷,提供一种基于类型推导与数据流分析的Python程序编译方法及系统,来有效解决目前动态类型语言程序在运行效率和可移植性方面存在的问题。该方法可以提高动态类型语言程序在软件工程实践中的性能和可移植性,最终实现动态类型语言程序静态编译优化的目标。该方法利用高精度的类型推导技术和数据流分析等技术,将原有的Python字节码转换成一种新的中间代码——CPY中间代码。基于预定义的中间代码转换规则,该方法可以自动化地将CPY中间代码转换为LLVM中间代码,从而提高程序的性能与可移植性,实现Python程序的编译。
本发明具体采用如下技术方案:基于类型推导与数据流分析的Python程序编译方法,包括:
步骤SS1:控制流/数据流分析步骤,具体包括:对Python字节码进行控制流和数据流分析,并将所述Python字节码转换为基本块;
步骤SS2:CPY中间代码生成及类型推导步骤,具体包括:遍历所述步骤SS1获得的所述基本块,将Python字节码转换为CPY中间代码,并使用内置方法替换Python API调用;
步骤SS3:LLVM中间代码生成步骤,具体包括:使用类型推导算法推导出CPY中间代码中变量的类型信息,并根据类型推导结果选择静态或动态编译模式,将CPY中间代码转换为不同模式的LLVM中间代码;
步骤SS4:目标机器码生成及执行步骤,具体包括:根据编译模式,调用LLVM链接器来链接已编译的模块或CPython库文件,以生成可执行文件。
作为一种较佳的实施例,所述控制流/数据流分析步骤具体包括:CPY通过分析Python字节码进行控制流分析,从而构造控制流图(Control Flow Graph);基于所述控制流图,使用数据流分析来分析Python程序不同执行路径上Python对象在栈上的操作,以了解对象的生命周期;基于控制流与数据流分析结果,将Python程序划分为更细粒度的基本块,以便生成CPY中间代码以及类型推导中间代码中变量类型。
作为一种较佳的实施例,所述控制流/数据流分析步骤具体包括:
步骤SS11:起始状态;
步骤SS12:加载待编译的Python模块或Python程序;
步骤SS13:获取Python模块或Python程序的字节码及模块信息、加载全局符号表;
步骤SS14:对提取的Python字节码进行数据流及控制流分析;
步骤SS15:根据控制流分析结果,将Python字节码转换为更细粒度的基本块,并重新划分变量的作用域范围;
步骤SS16:结束状态。
作为一种较佳的实施例,所述CPY中间代码生成及类型推导步骤具体包括:遍历每一个基本块中的Python字节码并将其转换为CPY中间代码,实现从栈式机器表示转换成LLVM所使用的寄存器式机器表示,在转换过程中,使用活跃变量分析来插入变量的显式析构指令del,以确保不会发生内存泄漏,此过程还会重写无类型的CPY中间代码,以替换内置函数调用,例如,使用内置的print函数替换对CPython print API调用,避免在变量传入CPython API以及获取返回值时需要进行类型转换等操作,从而降低函数调用的开销;使用CPA(Cartesian Product Algorithm)类型推导算法来生成和求解CPY中间代码的约束,以获取CPY中间代码中每个变量的类型;将类型推导的结果输出给LLVM中间代码生成步骤,选择不同的编译模式生成LLVM中间代码。
作为一种较佳的实施例,所述CPY中间代码生成及类型推导步骤具体包括:
步骤SS21:起始状态;
步骤SS22:遍历每个基本块,根据当前字节码的种类选择预定义的转换规则,并将所述字节码转换为CPY中间代码;
步骤SS23:重写CPY中间代码,使用内置的函数替换CPython API调用函数,以减少对CPython API的调用次数;
步骤SS24:调用CPA类型推导算法来推导CPY中间代码中所有中间变量的类型;
步骤SS25:结束状态。
作为一种较佳的实施例,所述LLVM中间代码生成步骤具体包括:如果CPA类型推导算法能够从CPY中间代码中推导出每个变量的类型,并用CPY内置类型进行表示,将尝试使用静态模式编译中间代码,生成LLVM中间代码;如果类型推导失败,CPA类型推导算法会将CPY中间代码中每个变量标注为Python对象类型,此时,将使用动态模式编译中间代码,生成LLVM中间代码,动态模式将模拟CPython虚拟机执行过程,调用CPython API来操作Python对象。
作为一种较佳的实施例,所述LLVM中间代码生成步骤具体包括:
步骤SS31:起始状态;
步骤SS32:判断是否能够静态确定CPY中间代码中全部变量的类型以及这些类型是否被CPY编译方法支持,若能确定全部变量的类型,则以静态模式进行编译,执行步骤SS33,否则,以动态模式进行编译,执行步骤SS35;
步骤SS33:启动静态编译模式,使用内置的数据类型以及API表示CPY中间代码;
步骤SS34:根据预定义的规则,将CPY中间代码转换成LLVM中间代码,执行步骤SS37;
步骤SS35:启动动态编译模式,将CPY中间代码中的所有变量标注为Python对象类型;
步骤SS36:根据预定义规则,将CPY中间代码转换成LLVM中间代码,并在LLVM中间代码中声明需要调用的CPython API;
步骤SS37:结束状态。
作为一种较佳的实施例,所述目标机器码生成及执行步骤具体包括:根据编译模式,LLVM链接器会在编译LLVM中间代码时选择链接本地的CPY模块或者CPython库文件,生成可执行文件并执行。
作为一种较佳的实施例,所述目标机器码生成及执行步骤具体包括:
步骤SS41:起始状态;
步骤SS42:判断当前编译模式,若是静态编译模式,执行步骤SS43,若是动态编译模式,执行步骤SS44;
步骤SS43:LLVM链接器加载已经编译好的模块,执行步骤SS45;
步骤SS44:LLVM链接器加载CPython库文件,执行步骤SS45;
步骤SS45:进行符号解析,LLVM链接器将LLVM中间代码编译为目标机器码;
步骤SS46:获取目标机器代码执行入口,并初始化所述目标机器代码的运行时环境,若是动态编译模式,需初始化CPython库;
步骤SS47:执行目标机器代码,输出执行结果;
步骤SS48:结束状态。
本发明还提出基于类型推导与数据流分析的Python程序编译系统,包括:
控制流/数据流分析模块,具体执行:对Python字节码进行控制流和数据流分析,并将所述Python字节码转换为基本块;
CPY中间代码生成及类型推导模块,具体执行:遍历所述控制流/数据流分析模块获得的所述基本块,将Python字节码转换为CPY中间代码,并使用内置方法替换Python API调用;
LLVM中间代码生成模块,具体执行:使用类型推导算法推导出CPY中间代码中变量的类型信息,并根据类型推导结果选择静态或动态编译模式,将CPY中间代码转换为不同模式的LLVM中间代码;
目标机器码生成及执行模块,具体执行:根据编译模式,调用LLVM链接器来链接已编译的模块或CPython库文件,以生成可执行文件。
本发明所达到的有益效果:本发明用于静态编译动态类型语言程序,解决了动态类型语言程序运行效率低的问题。本发明采用了静态编译模式和动态编译模式,有效提升了程序的兼容性。基于LLVM框架,本发明还提高了程序的可移植性和优化效率,从而更好地提升了程序的运行性能。
附图说明
图1为本发明实施中的基于类型推导与数据流分析的Python程序编译方法的流程图。
图2为图1中数据流/控制流分析的流程图。
图3为图1中CPY中间代码生成及类型推导流程图。
图4为图1中LLVM中间代码生成流程图。
图5为图1中目标机器码生成及执行流程图。
图6为本发明实施中的静态编译模式流程图。
图7为本发明实施中的动态编译模式流程图。
具体实施方式
下面结合附图对本发明作进一步描述。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本发明的保护范围。
实施例1:图1为本发明实施的基于类型推导与数据流分析的Python程序编译方法的流程图,本发明提出基于类型推导与数据流分析的Python程序编译方法,包括下列S1~S4步骤。
S1:控制流/数据流分析。CPY加载待编译的Python程序或模块,提取模块名称、字节码以及当前模块所处的程序的上下文。这些信息可用于标识编译模块及链接器链接过程。然后,CPY使用控制流和数据流技术分析当前字节码并构建基本块。构建好基本块后,即可分析Python程序栈上变量的生命周期并管理堆上资源。
S2:CPY中间代码生成及类型推导。CPY遍历基本块,根据字节码种类,将其转换为相应的CPY中间代码,并尝试重写中间代码。此过程主要使用CPY内置API替换Python API,以降低函数调用开销。基于此,CPY使用CPA类型推导技术来推导中间代码中每个变量的类型,并尝试用内置类型表示这些变量的类型。
S3:LLVM中间代码生成。CPY中间代码的类型推导结果会决定中间代码的编译模式。如果CPA能够推导出所有变量的类型,那么就会选择静态模式编译CPY中间代码。这是因为CPython API调用开销较大,例如参数对象类型判断,对象方法获取和临时对象使用等。在静态模式中,CPY使用类型本地表示替换Python对象,并调用CPY内置方法操作这些本地表示变量。相反,如果存在无法静态类型推导的变量,则会选择动态编译模式。在动态模式中,变量仍被视为Python对象。在生成的LLVM中间代码中,CPY会插入对Python对象操作的CPython API。
S4:目标机器码生成及执行。LLVM将生成的LLVM中间代码编译并链接,生成目标机器代码并执行。对于静态模式生成LLVM中间代码,链接器需要链接待编译模块中依赖的CPY库或其他被依赖的Python模块;对于动态模式生成的LLVM中间代码,链接器需要链接CPython库文件,以便正常调用其中的CPython API函数。在此基础上,LLVM将中间代码编译为特定平台的目标机器代码并执行,输出预期结果。
图2为控制流/数据流分析的流程图。对于Python模块或程序,CPY会提取其字节码信息,进行控制流/数据流分析,并对其进行基本块划分。具体步骤如下:步骤1:起始状态;步骤2:加载待编译的Python模块或Python程序;步骤3:获取字节码及模块信息,加载全局符号表;步骤4:对提取的Python字节码进行控制流及数据流分析;步骤5:根据控制流分析结果,将Python字节码转换为更细粒度的基本块,重新划分变量的作用域范围;步骤6:结束状态。
图3为CPY中间代码生成及类型推导的流程图。经过控制流/数据流分析并划分基本块后,将基本块中Python字节码转换为CPY中间代码并重写。接下来,使用类型推导算法来推导CPY中间代码中变量的类型。具体步骤如下:步骤1:起始状态;步骤2:遍历每一个基本块,根据当前字节码的种类选择预定义的转换规则,将其转换为CPY中间代码,例如将Python的函数调用转换为CPY call调用;步骤3:尝试重写生成的CPY中间代码,使用内置的函数替换Python内置函数调用,以减少对Python API调用次数;步骤4:调用类型推导模块推导CPY中间代码中的所有中间变量的类型;步骤5:结束状态。
图4为LLVM中间代码生成的流程图。根据生成的CPY中间代码及类型推导结果,选择静态编译模式或动态编译模式。具体步骤如下:步骤1:起始状态;步骤2:判断是否能够静态确定中间代码中全部的变量类型以及这些类型能否被CPY支持。例如,程序中导入了未知模块的全局变量或者是其他语言实现的接口,CPY可能推导出其类型,但是无法用CPY内置类型表示,则类型推导失败。若能够静态地确定所有变量的类型,则启用静态编译模式,执行步骤3,否则启用动态编译模式,执行步骤5;步骤3:启动静态编译模式,使用内置的数据类型以及API表示CPY中间代码;步骤4:根据预定义的规则,将CPY中间代码转换成LLVM中间代码,执行步骤7;步骤5:启动动态编译模式,将CPY中间代码中的所有变量标注为Python对象类型;步骤6:根据预定义规则,将CPY中间代码转换成LLVM中间代码,并在LLVM中间代码中声明需要调用的CPython API;步骤7:结束状态。
图5为目标机器码生成及执行的流程图。根据LLVM中间代码及编译模式,使用LLVM将中间代码转换为机器码。接下来,初始化运行时环境,执行机器码,并输出运算结果。具体步骤如下:步骤1:起始状态;步骤2:判断当前编译模式,若是静态编译模式,执行步骤3。若是动态编译模式,执行步骤4;步骤3:LLVM链接器加载已经编译好的模块,执行步骤5;步骤4:LLVM链接器加载CPython库文件,执行步骤5;步骤5:进行符号解析,LLVM将LLVM中间代码编译为目标机器码;步骤6:获取目标机器代码执行入口,并初始化其运行时环境,若是动态编译模式,需初始化CPython库;步骤7:执行目标机器代码,输出执行结果;步骤8:结束状态。
图6为静态编译模式的流程图。CPY使用CPA类型推导技术成功地推导出每个中间代码变量的类型,并用CPY内置类型进行了表示。接下来,CPY试图将中间代码编译为使用本地表示与CPY内置库的LLVM中间代码。具体步骤如下:步骤1:起始状态;步骤2:输入CPY中间代码;步骤3:使用CPA类型推导算法来推导CPY中所有变量的类型;步骤4:使用CPY内置类型表示中间代码中变量的类型;步骤5:使用内置的类型方法替换原有的CPython API;步骤6:加载并编译当前待编译模块依赖的模块;步骤7:编译当前模块,生成LLVM中间代码;步骤8:LLVM链接器链接所有依赖的模块,生成目标代码;步骤9:设置入口位置,初始化运行环境,管理堆栈空间;步骤10:结束状态。
图7为动态编译模式的流程图。由于CPY使用的CPA类型推导技术无法推导出每个中间代码变量的类型,因此,所有中间代码变量类型都被标注为Python对象类型。在CPY模拟Python程序执行流程的过程中,生成了LLVM中间代码,并插入了依赖的CPython API。具体步骤如下:步骤1:起始状态;步骤2:输入CPY中间代码;步骤3:使用CPA类型推导算法来推导CPY中间代码中所有变量的类型;步骤4:类型推导失败,将中间代码中所有变量的类型标注为Python对象类型;步骤5:加载模块依赖的CPython API;步骤6:编译当前模块,生成LLVM中间代码;步骤7:模拟CPython执行流程,插入异常处理片段;步骤8:LLVM链接器链接当前模块以及CPython库文件;步骤9:设置入口位置,初始化运行环境;步骤10:结束状态。
实施例2:本发明还提出基于类型推导与数据流分析的Python程序编译系统,包括:
控制流/数据流分析模块,具体执行:对Python字节码进行控制流和数据流分析,并将所述Python字节码转换为基本块;
CPY中间代码生成及类型推导模块,具体执行:CPY中间代码生成及类型推导步骤,具体包括:遍历所述控制流/数据流分析模块获得的所述基本块,将Python字节码转换为CPY中间代码,并使用内置方法替换Python API调用;
LLVM中间代码生成模块,具体执行:使用类型推导算法推导出CPY中间代码中变量的类型信息,并根据类型推导结果选择静态或动态编译模式,将CPY中间代码转换为不同模式的LLVM中间代码;
目标机器码生成及执行模块,具体执行:根据编译模式,调用LLVM链接器来链接已编译的模块或CPython库文件,以生成可执行文件。
综上所述,本发明用于静态编译动态类型语言程序,解决了动态类型语言程序运行效率低的问题。本发明采用了静态编译模式和动态编译模式,有效提升了程序的兼容性。基于LLVM框架,本发明还提高了程序的可移植性和优化效率,从而更好地提升了程序的运行性能。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
最后应当说明的是:以上实施例仅用以说明本发明的技术方案而非对其限制,尽管参照上述实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解:依然可以对本发明的具体实施方式进行修改或者等同替换,而未脱离本发明精神和范围的任何修改或者等同替换,其均应涵盖在本发明的权利要求保护范围之内。

Claims (10)

1.基于类型推导与数据流分析的Python程序编译方法,其特征在于,包括:
步骤SS1:控制流/数据流分析步骤,具体包括:对Python字节码进行控制流和数据流分析,并将所述Python字节码转换为基本块;
步骤SS2:CPY中间代码生成及类型推导步骤,具体包括:遍历所述步骤SS1获得的所述基本块,将Python字节码转换为CPY中间代码,并使用内置方法替换Python API调用;
步骤SS3:LLVM中间代码生成步骤,具体包括:使用类型推导算法推导出CPY中间代码中变量的类型信息,并根据类型推导结果选择静态或动态编译模式,将CPY中间代码转换为不同模式的LLVM中间代码;
步骤SS4:目标机器码生成及执行步骤,具体包括:根据编译模式,调用LLVM链接器来链接已编译的模块或CPython库文件,以生成可执行文件。
2.根据权利要求1所述的基于类型推导与数据流分析的Python程序编译方法,其特征在于,所述控制流/数据流分析步骤具体包括:CPY通过分析Python字节码进行控制流分析,从而构造控制流图;基于所述控制流图,使用数据流分析来分析Python程序不同执行路径上Python对象在栈上的操作,以了解对象的生命周期;基于控制流与数据流分析结果,将Python程序划分为更细粒度的基本块,以便生成CPY中间代码以及类型推导中间代码中变量类型。
3.根据权利要求2所述的基于类型推导与数据流分析的Python程序编译方法,其特征在于,所述控制流/数据流分析步骤具体包括:
步骤SS11:起始状态;
步骤SS12:加载待编译的Python模块或Python程序;
步骤SS13:获取Python模块或Python程序的字节码及模块信息、加载全局符号表;
步骤SS14:对提取的Python字节码进行数据流及控制流分析;
步骤SS15:根据控制流分析结果,将Python字节码转换为更细粒度的基本块,并重新划分变量的作用域范围;
步骤SS16:结束状态。
4.根据权利要求1所述的基于类型推导与数据流分析的Python程序编译方法,其特征在于,所述CPY中间代码生成及类型推导步骤具体包括:遍历每一个基本块中的Python字节码并将其转换为CPY中间代码,实现从栈式机器表示转换成LLVM所使用的寄存器式机器表示,在转换过程中,使用活跃变量分析来插入变量的显式析构指令del,以确保不会发生内存泄漏,此过程还会重写无类型的CPY中间代码,以替换内置函数调用;使用CPA类型推导算法来生成和求解CPY中间代码的约束,以获取CPY中间代码中每个变量的类型;将类型推导的结果输出给LLVM中间代码生成步骤,选择不同的编译模式生成LLVM中间代码。
5.根据权利要求4所述的基于类型推导与数据流分析的Python程序编译方法,其特征在于,所述CPY中间代码生成及类型推导步骤具体包括:
步骤SS21:起始状态;
步骤SS22:遍历每个基本块,根据当前字节码的种类选择预定义的转换规则,并将所述字节码转换为CPY中间代码;
步骤SS23:重写CPY中间代码,使用内置的函数替换CPython API调用函数,以减少对CPython API的调用次数;
步骤SS24:调用CPA类型推导算法来推导CPY中间代码中所有中间变量的类型;
步骤SS25:结束状态。
6.根据权利要求1所述的基于类型推导与数据流分析的Python程序编译方法,其特征在于,所述LLVM中间代码生成步骤具体包括:如果CPA类型推导算法能够从CPY中间代码中推导出每个变量的类型,并用CPY内置类型进行表示,将尝试使用静态模式编译中间代码,生成LLVM中间代码;如果类型推导失败,CPA类型推导算法会将CPY中间代码中每个变量标注为Python对象类型,此时,将使用动态模式编译中间代码,生成LLVM中间代码,动态模式将模拟CPython虚拟机执行过程,调用CPython API来操作Python对象。
7.根据权利要求6所述的基于类型推导与数据流分析的Python程序编译方法,其特征在于,所述LLVM中间代码生成步骤具体包括:
步骤SS31:起始状态;
步骤SS32:判断是否能够静态确定CPY中间代码中全部变量的类型以及这些类型是否被CPY编译方法支持,若能确定全部变量的类型,则以静态模式进行编译,执行步骤SS33,否则,以动态模式进行编译,执行步骤SS35;
步骤SS33:启动静态编译模式,使用内置的数据类型以及API表示CPY中间代码;
步骤SS34:根据预定义的规则,将CPY中间代码转换成LLVM中间代码,执行步骤SS37;
步骤SS35:启动动态编译模式,将CPY中间代码中的所有变量标注为Python对象类型;
步骤SS36:根据预定义规则,将CPY中间代码转换成LLVM中间代码,并在LLVM中间代码中声明需要调用的CPython API;
步骤SS37:结束状态。
8.根据权利要求1所述的基于类型推导与数据流分析的Python程序编译方法,其特征在于,所述目标机器码生成及执行步骤具体包括:根据编译模式,LLVM链接器会在编译LLVM中间代码时选择链接本地的CPY模块或者CPython库文件,生成可执行文件并执行。
9.根据权利要求8所述的基于类型推导与数据流分析的Python程序编译方法,其特征在于,所述目标机器码生成及执行步骤具体包括:
步骤SS41:起始状态;
步骤SS42:判断当前编译模式,若是静态编译模式,执行步骤SS43,若是动态编译模式,执行步骤SS44;
步骤SS43:LLVM链接器加载已经编译好的模块,执行步骤SS45;
步骤SS44:LLVM链接器加载CPython库文件,执行步骤SS45;
步骤SS45:进行符号解析,LLVM链接器将LLVM中间代码编译为目标机器码;
步骤SS46:获取目标机器代码执行入口,并初始化所述目标机器代码的运行时环境,若是动态编译模式,需初始化CPython库;
步骤SS47:执行目标机器代码,输出执行结果;
步骤SS48:结束状态。
10.基于类型推导与数据流分析的Python程序编译系统,其特征在于,包括:
控制流/数据流分析模块,具体执行:对Python字节码进行控制流和数据流分析,并将所述Python字节码转换为基本块;
CPY中间代码生成及类型推导模块,具体执行:遍历所述控制流/数据流分析模块获得的所述基本块,将Python字节码转换为CPY中间代码,并使用内置方法替换Python API调用;
LLVM中间代码生成模块,具体执行:使用类型推导算法推导出CPY中间代码中变量的类型信息,并根据类型推导结果选择静态或动态编译模式,将CPY中间代码转换为不同模式的LLVM中间代码;
目标机器码生成及执行模块,具体执行:根据编译模式,调用LLVM链接器来链接已编译的模块或CPython库文件,以生成可执行文件。
CN202310347171.0A 2023-04-03 2023-04-03 基于类型推导与数据流分析的Python程序编译方法及系统 Pending CN116594622A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310347171.0A CN116594622A (zh) 2023-04-03 2023-04-03 基于类型推导与数据流分析的Python程序编译方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310347171.0A CN116594622A (zh) 2023-04-03 2023-04-03 基于类型推导与数据流分析的Python程序编译方法及系统

Publications (1)

Publication Number Publication Date
CN116594622A true CN116594622A (zh) 2023-08-15

Family

ID=87606903

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310347171.0A Pending CN116594622A (zh) 2023-04-03 2023-04-03 基于类型推导与数据流分析的Python程序编译方法及系统

Country Status (1)

Country Link
CN (1) CN116594622A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116795378A (zh) * 2023-08-18 2023-09-22 宁波数益工联科技有限公司 基于代码动态编译的流程编排执行方法及装置

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116795378A (zh) * 2023-08-18 2023-09-22 宁波数益工联科技有限公司 基于代码动态编译的流程编排执行方法及装置
CN116795378B (zh) * 2023-08-18 2023-11-21 宁波数益工联科技有限公司 基于代码动态编译的流程编排执行方法及装置

Similar Documents

Publication Publication Date Title
CN111770113B (zh) 一种执行智能合约的方法、区块链节点和节点设备
EP0905617B1 (en) Method for generating a java bytecode data flow graph
US7725883B1 (en) Program interpreter
US6314560B1 (en) Method and apparatus for a translation system that aggressively optimizes and preserves full synchronous exception state
US7409678B2 (en) Compiler, compilation and storage
US20080222616A1 (en) Software translation
US9524175B2 (en) Target typing of overloaded method and constructor arguments
US20110126179A1 (en) Method and System for Dynamic Patching Software Using Source Code
CN111770116B (zh) 一种执行智能合约的方法、区块链节点、存储介质
US8056061B2 (en) Data processing device and method using predesignated register
CN111770205B (zh) 一种执行智能合约的方法、区块链节点、系统和存储介质
US20160246622A1 (en) Method and system for implementing invocation stubs for the application programming interfaces embedding with function overload resolution for dynamic computer programming languages
CN111770204B (zh) 一种执行智能合约的方法、区块链节点和存储介质
CN111768184A (zh) 一种执行智能合约的方法及区块链节点
CN111815310A (zh) 一种执行智能合约的方法、区块链节点和存储介质
CN116594622A (zh) 基于类型推导与数据流分析的Python程序编译方法及系统
CN111768183A (zh) 一种执行智能合约的方法、区块链节点和存储介质
US8117604B2 (en) Architecture cloning for power PC processors
CN113220326B (zh) 智能合约升级方法及区块链系统
CN111770202B (zh) 一种执行智能合约的方法、区块链节点和存储介质
CN113220327B (zh) 智能合约升级方法及区块链系统
WO2008108665A1 (en) A computer implemented translation method
US7774767B2 (en) System and method for compiler interprocedural optimization having support for object files in libraries
JP2022522880A (ja) プログラム論理の表現を生成する方法、逆コンパイル装置、再コンパイルシステムおよびコンピュータプログラム製品
Farvardin et al. A new backend for Standard ML of New Jersey

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