CN112346722A - 一种实现编译型嵌入式Python的方法 - Google Patents

一种实现编译型嵌入式Python的方法 Download PDF

Info

Publication number
CN112346722A
CN112346722A CN202011253208.6A CN202011253208A CN112346722A CN 112346722 A CN112346722 A CN 112346722A CN 202011253208 A CN202011253208 A CN 202011253208A CN 112346722 A CN112346722 A CN 112346722A
Authority
CN
China
Prior art keywords
python
function
type
file
code
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
CN202011253208.6A
Other languages
English (en)
Other versions
CN112346722B (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.)
Harbin Longzhida Technology Co.,Ltd.
Original Assignee
Suzhou 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 Suzhou University filed Critical Suzhou University
Priority to CN202011253208.6A priority Critical patent/CN112346722B/zh
Priority to US17/786,502 priority patent/US11740881B2/en
Priority to PCT/CN2020/140482 priority patent/WO2022099888A1/zh
Publication of CN112346722A publication Critical patent/CN112346722A/zh
Application granted granted Critical
Publication of CN112346722B publication Critical patent/CN112346722B/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/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/311Functional or applicative languages; Rewrite languages
    • 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
    • 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/436Semantic checking
    • G06F8/437Type checking
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/51Source to source

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Computational Linguistics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明实施例公开了一种实现编译型嵌入式Python的方法。该方法包括遍历Python源码的抽象语法树而获取程序的语义信息并根据所述语义信息生成对应的C++代码;对Python源码的进行类型注释,从而生成C++的变量定义和函数定义;采用翻译器对经过上述步骤处理过的Python源代码翻译成C++源文件;将所述C++源文件与嵌入式芯片相关的文件存储在一起而形成文件包,对所述文件包进行编译和链接并生成ASCII文本文件。本发明实施例提供的实现编译型嵌入式Python的方法基于类型注释和静态分析实现源码翻译器,并将翻译器集成至嵌入式平台中,实现了Python源文件的编辑、编译、链接和烧写。

Description

一种实现编译型嵌入式Python的方法
技术领域
本发明涉及计算机的技术领域,特别是涉及一种实现编译型嵌入式Python的方法。
背景技术
MicroPython是一款能够运行于Windows系统、Unix系统和部分微控制器上的超小型Python解释器,它把庞大的Python解释器压缩到256KB以内并且能够支持大部分的Python3功能。Python语言有着比C语言更优秀的可读性和可靠性,使用MicroPython能够有效提高编程效率。Python解释器占用较大的Flash空间和更多的计算资源,不适合用于开发有着低资源占用和高实时性要求的嵌入式应用。
目前,Cython和PyPy分别提出两种提高Python运行效率的工具,但是都只适用桌面系统编程领域,无法适用于微控制器。Cython提供的方法是用类Python语法编写或引用静态函数供Python解释器调用,本质上还是基于解释器因此不适合用于微控制器编程。PyPy提供了Python的即时编译技术(Just In Time,简称JIT),它在运行时会先把需要使用的函数翻译成本机代码从而提高运行效率,但是JIT本身的运行时间会占用总体运行时间,同时还会造成内存的巨大开销,因此JIT方法也不适合用于微控制器。
因此,针对上述技术问题,有必要提供一种能够满足实时性、可应用于微控制器的实现编译型嵌入式的Python方法。
发明内容
有鉴于此,本发明实施例的目的在于提供一种实现编译型嵌入式Python的方法。本发明实施例提供的实现编译型嵌入式Python的方法基于类型注释和静态分析实现源码翻译器,并将翻译器集成至嵌入式平台中,实现了Python源文件的编辑、编译、链接和烧写。
为了实现上述目的,本发明一实施例提供的技术方案如下:一种实现编译型嵌入式Python的方法,包括步骤S1:遍历Python源码的抽象语法树而获取程序的语义信息并根据所述语义信息生成对应的C++代码;步骤S2:对Python源码的进行类型注释,从而生成C++的变量定义和函数定义;步骤S3:采用翻译器对经过步骤S1和步骤S2处理过的Python源代码翻译成C++源文件;步骤S4:将所述C++源文件与嵌入式芯片相关的文件存储在一起而形成文件包,对所述文件包进行编译和链接并生成ASCII文本文件。
作为本发明的进一步改进,所述嵌入式芯片相关的文件包括头文件、启动文件和链接文件。
作为本发明的进一步改进,所述类型注释包括变量注释和函数注释,所述变量注释包括步骤:对Python源码中的单个变量赋值的同时给出所述变量的类型,从而生成对应的C++变量定义;所述函数注释包括步骤:对Python源码中的函数进行定义的同时给出所述函数中参数的类型和所述函数的返回值的类型,从而生成对应的C++函数定义。
作为本发明的进一步改进,所述翻译器的设计过程包括步骤S31:定义翻译内容的结构,所述结构包括头文件包含区、命名空间定义区和源码区;步骤S32:设计Python的类型至C++的类型的映射关系;步骤S33:采用自底向上的方法对抽象语法树进行语义分析并生成C++代码,将生成的C++代码按照所述翻译内容的结构进行拼接。
作为本发明的进一步改进,所述映射关系如下表所示,其中x,y∈T,T={int,float,str,bytes,bool}
Figure BDA0002772294700000021
Figure BDA0002772294700000031
作为本发明的进一步改进,所述步骤S33包括:步骤S331:采用自底向上的子节点访问的方式进行表达式翻译;步骤S332:将语句或者/和语句列表中的每行程序代码翻译成C++代码语句。
作为本发明的进一步改进,所述步骤S332的翻译过程中,需要先将所述语句区分为函数定义语句和非函数定义语句,并将所述函数定义语句所对应翻译成的C++代码语句填入其他作用域语句区域,将所述非函数定义语句所对应翻译成的C++代码语句填入所在作用域的函数体内。
作为本发明的进一步改进,所述抽象语法树为一个结点对象列表,每个对象包括多个子列表或者其他对象的引用,每个列表或者子列表包括任意数量的结点对象。
作为本发明的进一步改进,获取所述Python源码的抽象语法树的过程包括步骤:调用抽象语法树模块的parse()函数,采用dump()函数将parse()函数获取的Python源码的抽象语法树转化为自然语言形式。
作为本发明的进一步改进,将所述ASCII文本文件应用至嵌入式平台时,采用C或者其他语言封装模块实现IO操作。
本发明具有以下优点:
本发明实施例提供的实现编译型嵌入式的Python方法基于类型注释和静态分析实现了源码翻译器,并将翻译器集成到嵌入式平台中,实现了Python源文件的编辑、编译、链接和烧写,突破了现有技术无法将Python实时应用至嵌入式平台领域的缺陷。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的实现编译型嵌入式的Python方法的流程示意图;
图2为图1所示实施例中的另一种表达方式的流程示意图;
图3为应用本发明实施例提供的实现编译型嵌入式的Python方法在E-Python-AHL-GEC-IDE编译成功界面的示意图;
图4为图3所示实施例中的串口接收亮暗改变信息的界面示意图;
图5为图3所示实施例中的小灯亮起的实际图示。
具体实施方式
为了使本技术领域的人员更好地理解本发明中的技术方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
如图1和图2所示,本发明实施例提供的实现编译型嵌入式的Python方法的流程示意图。在该实施例中,实现编译型嵌入式的Python方法包括四个步骤,每个步骤的具体内容如下所示。
步骤S1:遍历Python源码的抽象语法树而获取程序的语义信息并根据所述语义信息生成对应的C++代码。
抽象语法树(Abstract Syntax Tree,简称AST)是源代码到目标代码的一种中间表示,用树状结构描述了程序构造。Python的AST可以表示为一个结点对象列表,每个对象包含多个子列表或其他对象的引用,每个列表或子列表包含任意数量的结点对象。Python的AST通过调用抽象语法树(ast)模块的parse()函数获取,并且可以使用dump()函数将其转为自然语言形式。表1展示了一个Python函数及其调用的抽象语法树。
表1.Python函数及其调用的抽象语法树
Figure BDA0002772294700000051
在表1中,其中根节点Module表示代码整体,列表body包含一个函数定义FunctionDef和一个表达式语句Expr。函数定义结点中有函数名name、参数列表args、函数体子列表body和返回值注释returns。表达式语句包括了一个函数调用结点Call,函数调用结点中有函数名func和参数列表args。
编译型嵌入式Python通过遍历Python源码的AST获取程序的语义信息,并根据其语义生成对应的C++代码。在遍历过程中主要处理的语法树结点及其表示的内容如表2所示。
表2 Python抽象语法树的结点类型和表示内容
Figure BDA0002772294700000061
步骤S2:对Python源码的进行类型注释,从而生成C++的变量定义和函数定义。
类型注释(Type Hints,又称类型提示或类型注解)是Python3.5版本之后加入的语法,它将变量或函数的类型信息写入源代码中,使得在语义分析阶段可以直接读出类型信息而不用再进行复杂的推导。该功能旨在开放Python代码来简化程序的静态分析、运行时类型检查和根据类型信息生成其他代码。
类型注释有变量注释和函数注释两种。变量注释是在对单个变量赋值的同时给出变量的类型,该类赋值语句又被成为带标注的赋值语句。函数注释是在函数定义时给出参数的类型和返回值的类型。表3给出了类型注释的例子,一个是int类型变量x的变量注释,另一个是返回值为int、参数为一个int的函数func的函数注释.
表3类型注释举例
Figure BDA0002772294700000071
编译型嵌入式Python利用类型注释来生成C++的变量定义和函数定义。对于变量,要求第一次出现必须是变量注释,从而能够生成对应的C++变量定义语句。对于函数,要求必须使用函数注释,从而生成参数和返回值类型与注释内容对应的函数定义和声明。
编译型嵌入式Python要求变量先定义类型后再使用,函数必须使用函数注释,示例如表3,对应的语法描述如下:
V::=va:type=value,
Figure BDA0002772294700000072
type::=B|Dict[B1,B2]|Set[B]
|List[B]|Tuple[B],
B::=int|float|str|bool|bytes
其中,V是变量va定义示使用的带标注的赋值语句语法;F是函数func的定义语法,stmt_list是函数体,
Figure BDA0002772294700000073
是参数列表,
Figure BDA0002772294700000074
是返回值类型;type和B定义了能够使用的类型。
步骤S3:采用翻译器对经过步骤S1和步骤S2处理过的Python源代码翻译成C++源文件。
翻译器的设计过程包括三个步骤,具体如下所示。
步骤S31:定义翻译内容的结构,所述结构包括头文件包含区、命名空间定义区和源码区。从Python代码的执行流程与C++的执行流程中抽取共性,可将翻译内容的结构分为头文件包含区、命名空间定义和源码区三部分,如表4所示。在头文件包含区中"builtin.h"必须被包含,该文件内声明了Python的内置函数的C++实现。命名空间用来模拟Python的模块。源码区必须包含当前模块的初始化函数<Module>_init(),该函数用于存放Python源文件中全局作用域内的代码翻译结果。
表4头文件和源文件的结构
Figure BDA0002772294700000081
步骤S32:设计Python的类型至C++的类型的映射关系。Python的类型分为基础类型和复合类型两种,基础类型包括了整型、浮点型、字符串、布尔型和字节数组,复合类型包括了列表类型、元组类型、集合类型和字典类型。设基础类型集为T={int,float,str,bytes,bool},设Python类型到C/C++的映射关系为f,映射关系如表5所示,其中x,y∈T。
表5基本类型映射关系
注释的类型 翻译后的类型
int int
float float
str string
bytes vector<char>
bool bool
List[x](列表类型) vector<f(x)>
Tuple[x](元组类型) vector<f(x)>
Set[x](集合类型) set<f(x)>
Dict[x,y](字典类型) map<f(x),f(y)>
步骤S33:采用自底向上的方法对抽象语法树进行语义分析并生成C++代码,将生成的C++代码按照所述翻译内容的结构进行拼接。翻译过程是自底向上对语法树进行语义分析并生成C++代码的过程,生成的代码最终按翻译文件的内容结构进行拼接。按表2中给出的结点类型可以分为表达式结点的翻译和语句结点的翻译两类过程。该步骤具体包括两个步骤,具体内容如下所示。
步骤S331:采用自底向上的子节点访问的方式进行表达式翻译。表达式翻译是语句翻译的基础,它将构成某种语句的Python表达式翻译成C++表达式后返回给语句翻译过程。表1已经描述了Python表达式结点的类型,一个表达式expr的形式化描述如下所示。
expr::=Compare|BoolOp|BinOp|UnaryOp
|Constant|Call|List|Tuple|Dict|Set
|Subscript|Name|Attribute
Compare::=expr1cop expr2,
where cop::=>|<|>=|<=|==|!=
BoolOp::=expr1bop expr2,where bop::=and|or
BinOp::=expr1dop expr2,
where dop::=+|-|*|/|**|//|<<|>>|&|^|\||%
UnaryOp::=uop expr1,where uop::=not|~|+|-
Call::=func(expr1,...,exprn),
where func::=Name|Attribute
List::=[expr1,...,exprn]
Tuple::=(expr1,...,exprn)
Dict::={expr11:expr12,...,exprn1:exprn2}
Set::={expr1,...,exprn}
Subscript::=expr[sub],
where sub::=expr|expr1:expr2|expr1:expr2:expr3
Name::=[_a-zA-Z][_a-zA-z0-9]*
Attribute::=Attribute.Name|Name
表达式由于存在递归定义,所以其翻译过程是一个自底向上的子结点访问过程,设表达式翻译函数名为visit_expr,则其内容就是将传入的表达式结点参数代入对应类型的访问函数中,如表6所示。
表6表达式翻译伪代码
Figure BDA0002772294700000101
Figure BDA0002772294700000111
限于篇幅,具体类型的表达式翻译过程不进行详细描述。
步骤S332:将语句或者/和语句列表中的每行程序代码翻译成C++代码语句。语句是关键字和表达式的有序排列,用来表示程序执行的操作,因此语句翻译过程是根据语法树结点内容对表达式与关键字的重新组合。Python中常用的语句有赋值类语句、程序结构控制类语句、函数定义语句、模块导入语句和表达式语句。设Python的单句语句为stmt,语句块为stmt_list,回车换行符为,语句和语句列表的形式化描述如下所示。
stmt::=Import|ImportFrom|Continue|Break|If
|While|For|FunctionDef|Expr|Assign
|AugAssign|AnnAssign|Return
stmt_list::=stmt\nstmt_list|stmt
type::=typeid|Dict[typeid1,typeid2]|Set[typeid]
|List[typeid]|Tuple[typeid]
typeid::=int|float|str|bool|bytes
Import::=import m1,...,mn,
where m::=Name
ImportFrom::=from m import c1,...,cn,
where m::=Name,c::=Name
Continue::=continue
Break::=break
If::=if expr:stmt_list1else:stmt_list2
|if expr:stmt_list
While::=while expr:stmt_list
For::=for expr1in expr2:stmt_list
FunctionDef::=def func(arg1:typea1,...,argn:typean)->
(typer1,...,typerm):stmt_list,
where arg::=Name
Expr::=expr
Assign::=id1,...,idn=expr1,...,exprk,
where id::=Name|Attribute,k<=n
AugAssign::=id op=expr,
where op::=+|-|*|/|//|**|<<|>>|%|&|^|or
AnnAssign::=id:type=expr,
where id::=Name
Return::=return expr1,expr2,...,exprn
在该步骤的翻译过程中,需要先将所述语句区分为函数定义语句和非函数定义语句,并将所述函数定义语句所对应翻译成的C++代码语句填入其他作用域语句区域,将所述非函数定义语句所对应翻译成的C++代码语句填入所在作用域的函数体内。设语句翻译函数名为visit_stmt,输入是一个语句列表L,输出是函数定义翻译列表func_result和其他语句翻译列表other,其伪代码描述如表7所示。
表7语句翻译伪代码
Figure BDA0002772294700000121
Figure BDA0002772294700000131
限于篇幅,本发明实施例主要描述流程控制类语句和函数定义语句的翻译过程。
1.流程控制类语句的翻译
Python的程序结构分为顺序结构、选择结构和循环结构三类。顺序结构即按从上到下的顺序执行两句行语句。选择结构使程序按某个条件执行分支程序,在Python中即为if语句,相比C++少了switch语句。循环结构使程序在某个条件内重复执行一段代码,在Python中有while和for两种循环。下面是选择结构和循环结构从Python语法翻译成C++语法的方法。
if语句由分支条件、if主体代码块和else代码块三部分构成。分支条件是一个表达式,主体代码块和else代码块都是语句列表。
翻译if语句需要将分支条件condition、主体代码块body和else代码块orelse代入对应的翻译函数,然后将翻译结果按C++语法拼接。对于任意的If语句结点i,翻译过程函数visit_if可以描述为:
Figure BDA0002772294700000132
c←visit_expr(condition),
b←visit_stmt(body),
o←visit_stmt(orelse),
Figure BDA0002772294700000133
while语句由循环控制条件和循环体代码块构成。循环控制条件是一个表达式,循环体代码块是语句列表。
翻译while语句需要将循环条件condition、循环体代码块body代入对应的翻译函数,然后将翻译结果按C++语法拼接。对于任意的While语句结点w,翻译过程函数visit_while可以描述为:
Figure BDA0002772294700000142
c←visit_expr(condition),
b←visit_stmt(body),
visit_while(w)=while(c){b}
for语句由循环变量、序列对象和循环体代码块构成。循环变量和序列对象都是表达式,循环体代码块是语句列表。
该类循环实现的是从序列对象seq第一个元素循环到最后一个元素,每次循环都用循环变量iter表示当前元素,与C++的迭代器相似。由于序列类型翻译后都使用STL容器类型来表示,因此for语句也是翻译成C++的迭代器语法。对于任意的For语句结点f,翻译过程函数visit_for可以描述为:
Figure BDA0002772294700000141
i←visit_expr(iter),
s←visit_expr(seq),
b←visit_stmt(body),
visit_for(f)=for(auto i=s.begin();i!=s.end();i++){b}
2.函数定义的翻译
函数定义由函数名func、参数列表args、返回值注释returns和函数内容body构成,嵌入式Python要求参数和返回值都必须加上类型注释,因此函数定义可以描述为:
FunctionDef::=def func(arg1:typea1,...,argn:typean)->
(typer1,...,typerm):\nstmt_list,
arg::=Name,
type::=typeid|Dict[typeid1,typeid2]|Set[typeid]
|List[typeid]|Tuple[typeid],
typeid::=int|float|str|bool|bytes
其中arg1:typea1~argn:typean是参数列表,typer1~typerm是返回值注释。
翻译函数定义需要将第一个返回值类型作为函数类型,将后面的返回值类型对应的引用类型插入到参数列表中。设按基本类型映射关系映射后的参数类型为ta1~tan,返回值类型为tr1~trn,f.stmt_list是函数内的语句块,函数定义的翻译函数visit_func可以描述为:
Figure BDA0002772294700000151
s←visit_stmt(f.stmt_list)
Figure BDA0002772294700000152
步骤S4:将所述C++源文件与嵌入式芯片相关的文件存储在一起而形成文件包,对所述文件包进行编译和链接并生成ASCII文本文件。
本发明实施例提供的实现编译型嵌入式的Python方法基于类型注释和静态分析实现了源码翻译器,并将翻译器集成到嵌入式平台中,实现了Python源文件的编辑、编译、链接和烧写,突破了现有技术无法将Python实时应用至嵌入式平台领域的缺陷。
由于Python不具有指针操作功能,不能直接按地址访问存储器,所以Python都是借助C或其他语言封装的模块实现IO操作。IO操作是嵌入式应用的基础,因此必须设计与C/C++的混合编程方法,从而实现嵌入式Python的IO操作。
在实现IO操作过程中,函数和变量的声明规则具体过程如下:函数和变量需要使用一个Python源文件声明,该文件第一行内容是"#Extern Definition",翻译器遇到该类源文件时,只对其生成标识符信息表而不进行内容翻译。函数和变量的声明语法需要符合上文编译型嵌入式Python中函数注释中的中的F和V,并且函数体的内容是"pass",表示空内容。设用来存放函数和变量声明的Python源文件(模块)名为Module.py,则其内容C可以描述如下所示:
C::=#Extern Definition\nS,
S::=DS|D,D::=F|V
在实现IO操作过程中,函数和变量的实现规则具体过程如下:函数和变量使用C++语法进行实现,需要使用一个扩展名为".cpp"的文件作为源文件,和一个文件名为"Module.hpp"的文件作为头文件。
(1)变量
全局变量的实现需要对Module.py中声明的变量按C++语法加上前缀"Py_"。设Module.py中有名称为v变量声明V,它的类型注释为type,经过类型映射后得到t,则该变量的在Module.hpp中的内容E和在源文件中的内容T可以描述为:
E::=extern t Py_v;
T::=t Py_v;
(2)函数
函数的实现需要对函数名、参数名添加"Py_"前缀,并且将第一个返回值作为函数类型,第二个以后的返回值的引用类型加入到参数列表中。
设Module.py中有函数名为func的函数声明F,有k个参数arg1~argk并且它们的类型经过映射后为t1~tk,有z个返回值,并且映射后的类型为r1~rz,函数内容为S(使用C++编写),则Module.hpp中需要的函数声明H和源文件中需要的函数实现C可以描述为:
H::=D;
C::=D{S}
Figure BDA0002772294700000161
在确定函数和变量的实现内容后,最后对这些内容按翻译文件的结构进行排布,即可完成混编的C++实现部分。表5描述了源文件和Module.hpp的内容,&符号表示文法的与运算,includes是混编中使用的其他文件中定义的函数、变量所需要包含的头文件语句列表。
表8混合编程的C++实现内容
Figure BDA0002772294700000171
在本发明实施例中,还将上述的ASCII文本文件应用至嵌入式平台进行了实验。在该实验中,嵌入式平台选取为STM32L431RC为硬件平台,将RT-Thread的操作系统API通过混合编程方法提供给嵌入式Python,并在该实时操作系统环境下实现了三盏小灯的闪烁。
STM32L431是基于高性能Cortex-M4内核的32位精简指令集超低功耗微控制器,工作频率最高达80MHz。它有256KB的Flash和64KB的RAM,并提供了一个低功耗RTC、一个通用32位定时器、一个专用于电机控制的16位PWM定时器、四个通用16位定时器和两个16位低功耗定时器。
实验实现的功能是在RT-Thread系统环境下,主线程创建红灯、绿灯和蓝灯三个线程,三个线程控制三色灯的颜色,并通过UART向PC机发送小灯亮暗状态。
实验使用基于苏州大学与ARM公司联合出品的嵌入式开发集成开发环境AHL-GEC-IDE改版的E-Python-AHL-GEC-IDE作为开发环境,编写程序并烧写到目标板上,如图3所示。编译成功后使用串口更新烧写到STM32中运行,可以看到三个线程交替执行,小灯交替改变亮暗,并向上位机发送亮暗状态改变信息,如图4所示。小灯亮起如图5所示。
通过实验,有效地证明了本发明实施例所提出的编译型嵌入式Python的方法可以在嵌入式平台上实现,能够符合嵌入式平台的实时性要求。
对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。
此外,应当理解,虽然本说明书按照实施方式加以描述,但并非每个实施方式仅包含一个独立的技术方案,说明书的这种叙述方式仅仅是为清楚起见,本领域技术人员应当将说明书作为一个整体,各实施例中的技术方案也可以经适当组合,形成本领域技术人员可以理解的其他实施方式。

Claims (10)

1.一种实现编译型嵌入式Python的方法,其特征在于,所述方法包括:
步骤S1:遍历Python源码的抽象语法树而获取程序的语义信息并根据所述语义信息生成对应的C++代码;
步骤S2:对Python源码的进行类型注释,从而生成C++的变量定义和函数定义;
步骤S3:采用翻译器对经过步骤S1和步骤S2处理过的Python源代码翻译成C++源文件;
步骤S4:将所述C++源文件与嵌入式芯片相关的文件存储在一起而形成文件包,对所述文件包进行编译和链接并生成ASCII文本文件。
2.根据权利要求1所述的实现编译型嵌入式Python的方法,其特征在于,所述嵌入式芯片相关的文件包括头文件、启动文件和链接文件。
3.根据权利要求1所述的实现编译型嵌入式Python的方法,其特征在于,所述类型注释包括变量注释和函数注释,
所述变量注释包括步骤:对Python源码中的单个变量赋值的同时给出所述变量的类型,从而生成对应的C++变量定义;
所述函数注释包括步骤:对Python源码中的函数进行定义的同时给出所述函数中参数的类型和所述函数的返回值的类型,从而生成对应的C++函数定义。
4.根据权利要求1所述的实现编译型嵌入式Python的方法,其特征在于,所述翻译器的设计过程包括:
步骤S31:定义翻译内容的结构,所述结构包括头文件包含区、命名空间定义区和源码区;
步骤S32:设计Python的类型至C++的类型的映射关系;
步骤S33:采用自底向上的方法对抽象语法树进行语义分析并生成C++代码,将生成的C++代码按照所述翻译内容的结构进行拼接。
5.根据权利要求4所述的实现编译型嵌入式Python的方法,其特征在于,所述映射关系如下表所示,其中x,y∈T,T={int,float,str,bytes,bool}
注释的类型 翻译后的类型 int int float float str string bytes vector<char> bool bool List[x](列表类型) vector<f(x)> Tuple[x](元组类型) vector<f(x)> Set[x](集合类型) set<f(x)> Dict[x,y](字典类型) map<f(x),f(y)>
6.根据权利要求4所述的实现编译型嵌入式Python的方法,其特征在于,所述步骤S33包括:
步骤S331:采用自底向上的子节点访问的方式进行表达式翻译;
步骤S332:将语句或者/和语句列表中的每行程序代码翻译成C++代码语句。
7.根据权利要求6所述的实现编译型嵌入式Python的方法,其特征在于,所述步骤S332的翻译过程中,需要先将所述语句区分为函数定义语句和非函数定义语句,并将所述函数定义语句所对应翻译成的C++代码语句填入其他作用域语句区域,将所述非函数定义语句所对应翻译成的C++代码语句填入所在作用域的函数体内。
8.根据权利要求1所述的实现编译型嵌入式Python的方法,其特征在于,所述抽象语法树为一个结点对象列表,每个对象包括多个子列表或者其他对象的引用,每个列表或者子列表包括任意数量的结点对象。
9.根据权利要求8所述的实现编译型嵌入式Python的方法,其特征在于,获取所述Python源码的抽象语法树的过程包括步骤:调用抽象语法树模块的parse()函数,采用dump()函数将parse()函数获取的Python源码的抽象语法树转化为自然语言形式。
10.根据权利要求1所述的实现编译型嵌入式Python的方法,其特征在于,将所述ASCII文本文件应用至嵌入式平台时,采用C或者其他语言封装模块实现IO操作。
CN202011253208.6A 2020-11-11 2020-11-11 一种实现编译型嵌入式Python的方法 Active CN112346722B (zh)

Priority Applications (3)

Application Number Priority Date Filing Date Title
CN202011253208.6A CN112346722B (zh) 2020-11-11 2020-11-11 一种实现编译型嵌入式Python的方法
US17/786,502 US11740881B2 (en) 2020-11-11 2020-12-29 Method for implementing compiled embedded Python
PCT/CN2020/140482 WO2022099888A1 (zh) 2020-11-11 2020-12-29 一种实现编译型嵌入式Python的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202011253208.6A CN112346722B (zh) 2020-11-11 2020-11-11 一种实现编译型嵌入式Python的方法

Publications (2)

Publication Number Publication Date
CN112346722A true CN112346722A (zh) 2021-02-09
CN112346722B CN112346722B (zh) 2022-04-19

Family

ID=74363337

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011253208.6A Active CN112346722B (zh) 2020-11-11 2020-11-11 一种实现编译型嵌入式Python的方法

Country Status (3)

Country Link
US (1) US11740881B2 (zh)
CN (1) CN112346722B (zh)
WO (1) WO2022099888A1 (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113126976A (zh) * 2021-04-08 2021-07-16 复旦大学 基于语法制导编辑器生成器的跨界服务长尾变化应变方法
CN113626006A (zh) * 2021-10-11 2021-11-09 深圳市中科先见医疗科技有限公司 基于RT Thread操作系统的图像处理方法及设备
CN113641389A (zh) * 2021-08-31 2021-11-12 广东九联科技股份有限公司 基于OpenCPU的软件升级方法、装置及设备
CN113821204A (zh) * 2021-08-30 2021-12-21 济南浪潮数据技术有限公司 一种组件生成方法、装置、电子设备及可读存储介质
CN116149671A (zh) * 2023-04-23 2023-05-23 中国科学院软件研究所 用于翻译智能合约语言的方法和装置、电子设备

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20080216060A1 (en) * 2002-11-20 2008-09-04 Vargas Byron D System for translating diverse programming languages
CN101414265A (zh) * 2008-12-02 2009-04-22 南京大学 一种基于向量处理器的在线编译方法
CN106537332A (zh) * 2014-06-13 2017-03-22 查尔斯斯塔克德拉珀实验室公司 软件分析系统和方法
CN110275709A (zh) * 2018-03-15 2019-09-24 阿里巴巴集团控股有限公司 针对动态语言的处理及优化方法、装置、设备及存储介质
CN111459500A (zh) * 2020-06-17 2020-07-28 北京机电工程研究所 基于海鹰翼辉操作系统的安全编译方法及装置

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7010580B1 (en) * 1999-10-08 2006-03-07 Agile Software Corp. Method and apparatus for exchanging data in a platform independent manner
US8032877B2 (en) * 2006-10-20 2011-10-04 International Business Machines Corporation Compiler neutral linking solution for C++ code
CN102902540A (zh) 2012-09-25 2013-01-30 浙江创佳数字技术有限公司 嵌入式自动化开发方法
CN104182267B (zh) 2013-05-21 2019-10-25 南京中兴新软件有限责任公司 编译方法、解释方法、装置及用户设备
US10545730B2 (en) * 2018-05-07 2020-01-28 Red Hat, Inc. Automatically generating code for application programming interfaces
US10831456B1 (en) * 2019-05-31 2020-11-10 The Mathworks, Inc. External code integrations within a computing environment
CN111249736B (zh) 2020-01-16 2023-03-21 网易(杭州)网络有限公司 代码处理方法及装置
CN111142876B (zh) 2020-04-02 2020-08-18 华控清交信息科技(北京)有限公司 一种编译处理方法、装置和用于编译处理的装置

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20080216060A1 (en) * 2002-11-20 2008-09-04 Vargas Byron D System for translating diverse programming languages
CN101414265A (zh) * 2008-12-02 2009-04-22 南京大学 一种基于向量处理器的在线编译方法
CN106537332A (zh) * 2014-06-13 2017-03-22 查尔斯斯塔克德拉珀实验室公司 软件分析系统和方法
CN110275709A (zh) * 2018-03-15 2019-09-24 阿里巴巴集团控股有限公司 针对动态语言的处理及优化方法、装置、设备及存储介质
CN111459500A (zh) * 2020-06-17 2020-07-28 北京机电工程研究所 基于海鹰翼辉操作系统的安全编译方法及装置

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
何炯: "《将Python嵌入到C/C++应用程序中的编程方法》", 《武汉市经济管理干部学院学报》 *
孟繁超: "《基于Python的嵌入式开发工具的设计与实现》", 《中国优秀硕士论文全文数据库信息科技辑》 *

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113126976A (zh) * 2021-04-08 2021-07-16 复旦大学 基于语法制导编辑器生成器的跨界服务长尾变化应变方法
CN113126976B (zh) * 2021-04-08 2022-06-21 复旦大学 基于语法制导编辑器生成器的跨界服务长尾变化应变方法
CN113821204A (zh) * 2021-08-30 2021-12-21 济南浪潮数据技术有限公司 一种组件生成方法、装置、电子设备及可读存储介质
CN113821204B (zh) * 2021-08-30 2024-02-23 济南浪潮数据技术有限公司 一种组件生成方法、装置、电子设备及可读存储介质
CN113641389A (zh) * 2021-08-31 2021-11-12 广东九联科技股份有限公司 基于OpenCPU的软件升级方法、装置及设备
CN113641389B (zh) * 2021-08-31 2024-02-09 广东九联科技股份有限公司 基于OpenCPU的软件升级方法、装置及设备
CN113626006A (zh) * 2021-10-11 2021-11-09 深圳市中科先见医疗科技有限公司 基于RT Thread操作系统的图像处理方法及设备
CN116149671A (zh) * 2023-04-23 2023-05-23 中国科学院软件研究所 用于翻译智能合约语言的方法和装置、电子设备

Also Published As

Publication number Publication date
US20230075927A1 (en) 2023-03-09
WO2022099888A1 (zh) 2022-05-19
US11740881B2 (en) 2023-08-29
CN112346722B (zh) 2022-04-19

Similar Documents

Publication Publication Date Title
CN112346722B (zh) 一种实现编译型嵌入式Python的方法
Chow A portable machine-independent global optimizer--Design and measurements
US8332828B2 (en) System for translating diverse programming languages
US5371747A (en) Debugger program which includes correlation of computer program source code with optimized object code
US9965259B2 (en) System for translating diverse programming languages
Renggli et al. Embedding languages without breaking tools
US8656372B2 (en) System for translating diverse programming languages
JPH08115209A (ja) ソース・コード作成システム及び方法
US8464232B2 (en) Compiler compiler system with syntax-controlled runtime and binary application programming interfaces
KR950006609B1 (ko) 다중 패스코드 발생에 있어서 템플리트를 이용한 다중 언어 최적화 컴파일러
US20130152061A1 (en) Full fidelity parse tree for programming language processing
EP0520708B1 (en) Method and apparatus for converting high level form abstract syntaxes into an intermediate form
Paulson A compiler generator for semantic grammars
Chambers et al. An efficient implementation of SELF, a dynamically-typed object-oriented language based on prototypes
Fritzson et al. Meta-programming and language modeling with MetaModelica 1.0
CN113138755A (zh) 一种json序列化和反序列化的优化方法及系统
US11714609B2 (en) Automatic generation of source code implementing a regular expression
CN114791811A (zh) 一种基于元函数模板的汇编器实现方法
CN115454438A (zh) 基于对照表的hlsl着色器源码转换为glsl着色器源码的方法
Racordon From ASTs to machine code with LLVM
CN111767033A (zh) 用于机械臂程序开发的编程系统及功能扩展方法
Kornerup et al. Interpretation and code generation based on intermediate languages
Bose Instruction set design for support of high-level languages
JP2003050700A (ja) プログラム変換方法
Fegaras CSE 5317/4305: Design and Construction of Compilers

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right

Effective date of registration: 20240613

Address after: 230000 room 1414, building D, Yinhe happiness Plaza, intersection of Luzhou Avenue and Fuzhou Road, Baohe District, Hefei City, Anhui Province

Patentee after: Hefei keyiguo Information Technology Co.,Ltd.

Country or region after: China

Address before: 215000 8 Ji Xue Road, Xiangcheng District, Suzhou, Jiangsu.

Patentee before: SOOCHOW University

Country or region before: China

TR01 Transfer of patent right

Effective date of registration: 20240618

Address after: Room 202, 2nd Floor, Unit 2, Building 20, No. 366 Xinjiang Street, Pingfang District, Harbin City, Heilongjiang Province, 150000

Patentee after: Harbin Longzhida Technology Co.,Ltd.

Country or region after: China

Address before: 230000 room 1414, building D, Yinhe happiness Plaza, intersection of Luzhou Avenue and Fuzhou Road, Baohe District, Hefei City, Anhui Province

Patentee before: Hefei keyiguo Information Technology Co.,Ltd.

Country or region before: China