NEXT社区小课堂 | 第十三课:NEO Python编译器介绍(一)

NEXT社区 | 小课堂python

因为近期NEXT社区加入不少新的小伙伴,有在校大学生,有对区块链感兴趣的传统企业从业者。为了更方便、更系统的让NEXT社区的伙伴们了解NEO的技术知识,所以咱们开设了小课堂,每周3节,向你们普及NEO相关的知识要点!git

 

 

NEXT社区小课堂 | 第十三课github

NEO Python编译器介绍(一)算法

 


 

neo-boa编译器介绍app

 

neo-boa编译器可将Python文件编译为.avm格式,在NEO虚拟机中运行。NEO虚拟机可在NEO区块链上执行合约。区块链

编译器支持Python语言子集(Python语言子集与Python的关系相似于蟒蛇与蟒属的关系)。ui

 

一、目前功能this

·  将Python语言子集编译成.avm格式,在NEO虚拟机上运行spa

·  适用于Python3.4与3.53d

 

二、将来功能

·  编译更普遍的Python语言子集

·  适用于Python3.6

 

三、已支持的Python功能

下文为目前支持的Python功能一览。详细介绍请参见boa.tests.src目录中的案例

 

四、流控制

If、Else、Elif、While、Break、Methodcalls、Lamdbas、for x in

 

五、用于整数运算的算数运算符与相等运算符

ADD、SUB、MUL、DIV、ABS、LSHIFT、RSHIFT、AND、OR、XOR、MODULO、INVERT、GT、GTE、LT、LTE、EQ、NOTEQ

 

六、使用自定义内置功能进行列表建立。注意列表一经建立,其长度便不可更改。






from boa.code.builtins import list# this worksx = list(length=10)x[3] = 84# this also worksx = [1,3,65,23]# this does NOT workx = [ ]x.append(1)# 支持列表(building slices)操做x = [12,46,56]y = x[1:3]# 在可能的状况下,Python的某些__builtins__# 已经根据NEO虚拟机的特色以自定义的方式实现fromboa.code.builtins import rangexrange = range(1, 30)# this also worksfori in range(2, 21):i = i + 1

 

安装

 

一、使用pip

pipinstallneo-boa

 

二、手动安装

克隆存储库,进入项目目录后建立Python3虚拟环境,并经过如下指令激活。

python3 -mvenvvenvsourcevenv/bin/activate

 

或单独安装Python3.5​​​​​​​

virtualenv -p /usr/local/bin/python3.5venvsourcevenv/bin/activate

 

或单独安装Python3.5​​​​​​​

virtualenv -p /usr/local/bin/python3.5venvsourcevenv/bin/activate

 

接着,经过如下指令安装需求

pipinstall -rrequirements.txt

 

三、基本用途

编译器使用指南以下​​​​​​​

fromboa.compiler import CompilerCompiler.load_and_save('path/to/your/file.py')

 

四、许可证

· 开源MIT 

(Github地址:/CityOfZion/neo-python/blob/master/LICENSE.md)

· 主做者为localhuman

(Github地址:https://github.com/localhuman)

 

五、boa.compiler.Compiler

下文将介绍Compiler的具体实现细则。

 

六、classboa.compiler.Compiler[source]

主编译器接口类

经过下列程序加载python文件,编译为.avm格式,并与python文件存储在一个地方。



fromboa.compiler import CompilerCompiler.load_and_save(‘path/to/your/file.py’)# return the compiler object for inspectioncompiler = Compiler.load(‘path/to/your/file.py’)# retrieve the default module for inpectiondefault_module = compiler.default# retreive the default/entry method for the smartcontractentry_method = default_module.main

 

七、defaule

取回默认或“入口”模块。

返回值:默认反回值为boa.code.Module对象,异常时无返回值

 

八、staticinstance()[source]

取回当前编译器对象的实例(若有),不然建立一个实例

返回值:编译器对象的单个实例

 

九、staticload(path)[source]

调用load来加载需编译但无需写为.avm格式的Python文件

参数:path–Python文件的编译路径

返回值:编译器实例

用途:经过下述程序返回编译器对象进行检查

 

fromboa.compiler import Compilercompiler = Compiler.load(‘path/to/your/file.py’)

 

十、staticload_and_save(path, output_path=None)[source]

调用load_and_save来加载需编译为.avm格式的Python文件,并保存结果。

默认状况下,最终生成的.avm文件将与源文件存储在一个地方。

 

参数:

· path——Python文件的编译路径

· output_path——已编译的.avm文件的可选保存路径

 

返回值:返回编译器实例

用途:经过下述代码返回编译器对象进行检查

fromboa.compiler import Compiler

Compiler.load_and_save(‘path/to/your/file.py’)

 

十一、write()[source]

返回值:已编译的Python程序的字节串

 

十二、staticwrite_file(data, path)[source]

经过指定路径将输出数据存储至文件系统

参数:

· data——待写入磁盘的数据字节串

· path——文件写入路径

 

1三、boa.code.module.Module

下文将介绍Module的具体实现细则。

 

1四、classboa.code.module.Module(path, module_name=”, is_sys_module=False, items_to_import=None)[source]

模块是包含代码对象的顶层组件。例如,在path/to/my/file.py的编译过程当中,file.py中包含的项目即为模块。一个可执行项可包含多个模块。上述案例中的“默认”或“入口”模块即为file.py。

 

调用Compiler.load_and_save(‘path/to/file.py’)时会专门为file.py建立一个模块。若file.py导入了其余任何功能,那些模块也会被添加至可执行项中,并置于Module.loaded_modules属性中。

 

在模块被当作方法处理,方法被当作基本块处理,基本块被处理为标记后,主模块或default模块的write()方法即被调用,将可执行项写为字节串,返回磁盘并存储。

 

若是您想检查模块内容,可以使用Compiler.load(‘path/to/file.py’),该功能将返回一个编译器实例。获取该实例后,您即可以访问编译器的default模块,从而访问该默认模块中装入的其余模块。

 

各模块(以及各方法对象)均包含byteplay3对象bp的引用,该对象包含可在Python解释器中显示的指令集。

 

您可对具有bp属性的任意对象调用print(module.bp.code),结果将输出一段Python解释器代码。



fromboa.compiler import Compilermodule = Compiler.load(‘./boa/tests/src/AddTest1.py’).defaultprint(module.bp.code)LOAD_CONST <byteplay3.Code object at 0x10cc3d6a0>LOAD_CONST ‘Main’MAKE_FUNCTION 0STORE_NAME MainLOAD_CONST NoneRETURN_VALUE

 

对可执行项进行处理与标记化后,便会生成虚拟机标记集,虚拟机标记虽与byteplay3标记相相似,但仍存在显著区别。这些标记均包含在该模块的all_vm_tokens属性中。

 

您可调用module.to_s()来查看该程序,由于该程序已根据NEO虚拟机的特色进行了标记化。

>>> module.to_s()LOAD_FASTLOAD_CONSTBINARY_MULTIPLSTORE_FASTLOAD_FASTLOAD_CONSTBINARY_ADD        LOAD_FASTLOAD_CONSTBINARY_TRUE_DIVIDESTORE_FASTLOAD_FASTLOAD_CONSTBINARY_SUBTRACTSTORE_FASTb''LOAD_FASTLOAD_FASTBINARY_ADDLOAD_FASTBINARY_ADDLOAD_FASTBINARY_ADDNOP

 

1五、add_method(method)[source]

在模块中添加方法以下:

Parameters: method (boa.code.method.Method) ——模块中待添加的方法对象

返回值:显示是否已添加该方法

返回值类型:布尔值

 

1六、build()[source]

将bp.code对象拆分红行,并合并多行,生成不一样的项目。

 

1七、link_methods()[source]

关联各方法地址

 

1八、main

返回该模块的默认方法

返回值:该模块的默认方法

返回值类型:boa.code.method.Method

 

1九、method_by_name(method_name)[source]

在模块的methods列表中查找方法名称:param method_name:

待查找的方法名称:typemethod_name: str

返回值:方法(若有)

返回值类型:boa.code.method.Method

 

20、module_path

返回该模块的文件路径

返回值:模块路径

返回值类型:str

 

2一、orderered_methods

方法序列表

返回值:该模块中的方法序列表

返回值类型:列表

 

2二、process_action(lineset)[source]

处理模块中的动做,样本以下,其目的相似于建立下列事件:


fromboa.blockchain.vm.Neo.Action import RegisterAction# Register the action.onRefund = RegisterAction(‘refund’,’to_address’,’amount’)# Dispatch an action.onRefund(my_address,100)

 

参数:lineset (list) – 包含应用程序调用注册功能的行集

 

2三、process_import(import_item)[source]

处理该模块中的导入语句

Parameters: import_item (boa.code.items.Import subclass) –

 

2四、process_method(lineset)[source]

处理包含byteplay3代码对象的行集

参数:lineset (list) – 需处理与添加的行集

 

2五、process_smart_contract_app_registration(lineset)[source] 

在智能合约中调用另外一个智能合约时处理智能合约应用程序注册事宜:


fromboa.blockchain.vm.Neo.App import RegisterAppCall# register the contractotherContract = RegisterAppCall(‘contract_hash’,’param1′,’param2′)# call the contractresult = otherContract(a,b )

 

参数:lineset (list) – 包含应用程序调用注册功能的行集

 

2六、split_lines()[source]

将模块中的行集拆分红可编译的对象集

 

2七、to_s()[source]

该方法的目的在于以可读/标记化的格式打印可执行项的输出值,样本以下:

 

>>> from boa.compiler import Compiler
>>> module = Compiler.load('./boa/tests/src/LambdaTest.py').default>>> module.write()>>> module.to_s()LOAD_CONSTSTORE_FASTLOAD_FASTCALL_FUNCTION  Main.<locals>.q_1[<boa.code.pytoken.PyToken object at 0x10cb53c50>]STORE_FASTb''mNOP RETURN_VALUE    b''LOAD_FAST   xLOAD_CONSTBINARY_ADD   NOP       RETURN_VALUE

 

2八、tokenize()[source]

将boa.code.pytoken.PyToken对象集转化为boa.code.vmtoken.VMToken对象。

 

2九、total_lines

获取该方法的总行(即区块)数

返回值:总行数

返回值类型:int

 

30、total_module_variables

获取局部变量总数

返回值:该模块中的变量总数

返回值类型:int

 

3一、vm_tokens

返回该方法中的虚拟机标记列表

返回值:该方法中的虚拟机标记列表

返回值类型:列表

 

3二、write()[source]

将标记器当前的状态写为字节串

返回值:当前标记器的字节串

返回值类型:字节

 

 

原文连接:https://github.com/localhuman/neo-python

 

 

往期精彩内容

NEXT社区小课堂 | 第五课:NEO-共识算法dBFT源码解析

NEXT社区小课堂 | 第八课:若是往错误的NEO地址转帐会发生什么

NEXT社区小课堂 | 第十课:如何正确理解NEO平台上的GAS(NeoGas)

NEXT社区小课堂 | 第十一课:NEO中数字的表达和运算

 

 

  联系咱们  

微博:https://weibo.com/u/6724929880

官网:https://neonext.club/

QQ群:612334080

电报:https://t.me/neonextop

twitter:https://twitter.com/NE0NEXT

 

扫码关注NEO NEXT官方公众号

获取更多一手社区资讯

相关文章
相关标签/搜索