c++对象回收string类型成员时coredump_本体技术视点 | 虚拟机中引用性动态语言对象模型思考...

46e8759016352633fb312f08e1eb7a95.png

1

引言

Ontology 的 NeoVM 虚拟机新增加了 DCALL、HAS_KEY、KEYS 以及 VALUES 等几条新的指令。因此,基于 NeoVM 的引用性动态语言对象的设计理论上可行,这可使得当前语言的支持能更接近原生语义。对象模型设计的必要性Ontology NeoVM 对用户暴露的对象语义有4种,分别是 bytearray、array、struct 和 map。当前 Python、Go、C#编译器的实现都是直接复用这4种对象语义,这样一来就产生了几个问题:
  • 首先,高级语言的基本对象往往不止这几种对象语义,就会出现对象语义多对一的情况。

    不同对象的运算有不同的行为,导致的后果是必须要牺牲其中一种对象的语义。

  • 其次, 高级语言对象对应的底层对象,语义不一定是完全对等的。

综上,需要设计一个较通用的对象模型框架,以适应不同语言的语义对象,满足多语言智能合约的支持。以 Python 为例,Python 是引用性的动态类型语言,在编译时获取的信息量较少。当前 Ontology 的 Neptune 编译器已基本实现 Python 的运算逻辑及控制逻辑。静态类型的语言如 Go和C#等,在编译时即可处理类型检查、对象语义区分等问题。但对于 Python 这类动态类型的语言,如果没有较完备的对象内存模型,其表达能力是有限的,不能精确区分不同对象的语义。本文基于 Ontology NeoVM 提出一种引用性动态语言内存模型的设计,作为升级重构 Neptune 以及 Go 编译器和更精确实现其它语言编译器的理论分析。

2

对象模型

理论上,底层指令的语义模型需要足够简单抽象,才能满足不同类型语言语义的实现。而且很难有一套指令架构,能满足所有语言语义的运行要求。所以绝大多数高级语言都是重新定义特定的语义模型,构建在特定虚拟机之上运行。而相对底层的语言如 Rust,C 和 C++等则直接编译后运行在 CPU 上。内存对象模型最佳的方式是不直接使用 Ontology NeoVM 的内置语义对象,而是重新根据语言特性设计其对象模型,更精准的语义对开发者更友好。但是重写设计对象语义的代价在于,相同的逻辑实现,会产生数倍于当前实现编译生成的字节码,且编译器的实现会更复杂。当前按照 Python 一切皆对象的语义设计,所有对象使用 map 或者 array 实现。为简化表达,这里假设使用 map 实现对象。map 的第一个 key 为内置的__type__或用编码表示,编译器会检查属性 key 字段不属于系统预留字段。在 Python 中,基本对象类型为:Number、string、List、Tuple、Set、Dict;基本运算符为[](subscript), +/-/*/%///以及 le 等。而这些运算符号是相应对象的成员属性。在运行时,可通过 type 字段,对运算符做不同的语义区分。同样的, 函数也是对象。各对象可用如下结构表示:
{"__type__":"function", "offset":xxx}{"__type__":"int", "__value__":value}{"__type__":"string", "__value__":value}{"__type__":"list", "__value__":lsitvalue}{"__type__":"map", "__value__":mapvalue}
在具体的实现中, 由于字符串会占用较大的字节码空间或影响性能,对于全局结构,可以静态映射为整数表示。

3

符号表及重定位

为实现动态类型, 符号表需要保存在运行时环境,即全局运行时对象环境。对于加减乘除等运算,使用对象类型结合运算符名的修饰方式可确定函数对象;而对于对象的其他成员函数,使用对象名结合成员函数名修饰方式。而重定位的时机是编译完成时,所有的函数偏移已确定。在系统构建好全局对象后,立即跳转到重定位函数去处理需要重定位的符号信息。当需要访问对象时,可以正确获取对象的偏移,如函数调用为伪代码:
function args # 可支持动态参数的参数栈结构global object # 获取全局运行时对象push function object index # 将函数对象编码压栈pickitem     # 获取函数对象。pick function object offset # 获取函数偏移DCALL # 跳转

4

全局对象的静态映射

由于直接使用符号索引,会导致字节码增大,且 ARRAY 字节码的处理性能相对 map 更高,所以编译时尽量减少符号的压栈,而使用静态符号表的方式,将全局或局部变量,映射为 index,减少字节码的生成,提高性能。同时,在编译时检查出更多的语法错误,如未定义,重复定义等。全局对象可保存在 array 结构中:
[funcobj, classobj, intobj,  stringobj....]

5

成员对象访问及对象继承处理

如上所述,全局对象保存在全局运行时环境中,而局部对象保存在函数的局部运行时环境中,某个对象的成员变量在访问之前,该对象已从运行时环境中取出。所以,在当访问成员变量时,根据索引成员变量的 key 即可获取。由于是动态类型,无法在编译时根据信息映射为 index 整数,只能直接使用变量名。伪码如下:
push class objectpush member object  # 编译器根据成员对象名,生成指令dup                  # 复制一份作为临时变量has_Key object        # 判断是否存在jmpifnot label0     # 如果不存在跳转到label0  get inherit object  # 获取继承对象,如果不存在继承继承,则运行时报错swaplebal0:Pickitem            # 如果是函数访问,则需要生成DCALL指令

6

运算符实现及重载

由于对象模型的变换,所有的运算符逻辑不能直接使用 NeoVM 的指令逻辑,需要用对应对象的逻辑实现。每个运算符的语义和特定的对象绑定。编译时通过ast获取运算符。对于不同的对象,编译时生成不同的对象运算符函数;运行时根据对象类型的不同跳转到相应的对象处理函数。比如 string 对象的加法和int对象加法,是两个不同的函数实现。所以根据以上方法,任何对象,都可以重载 add 函数,实现对象的新的加法语义定义。其他运算类似。对于系统内建类型,如 Int、string、list、map。都需要在编译时生成内建的运算符处理函数。

7

控制逻辑

控制逻辑与对象语义关系不大,但是控制指令在判断时需要将对象转换成 Ontology NeoVM 的 Boolean 或 big.int。

8

NeoVM Service 处理

NeoVM service 返回的数据都是 Ontology NeoVM 语义上的, 所以需要根据返回类型的不同,构造为当前设计的对象类型。对 Syscall 的翻译,不能直接使用 Syscall + servicename 的方式。后面还需要加上对应的对象类型构造。而对于 syscall 传入参数是,也需要复原成 Ontology NeoVM 底层语义的对象。

9

结论

由于语言语义的多样性,仅仅直接复用 Ontology NeoVM 原生语义,是不能很好的实现支持语言原生语义的。对象模型的设计,可以使得智能合约支持的语言语义更加精确,扩展能力更强,通过优化不断地接近原生语义,对现有的内建对象 int、 string、list、map 支持更丰富精确的原生语义,对开发者更友好。但是,这同时会产生数倍于当前编译器生成的字节码,而且编译器的实现更加复杂。

上期回顾

下列选项表述正确的是? 

A. Ontology Wasm 只支持使用 Rust 语言开发 

B. Ontology-wasm-cdt-rust 已经封装了链上数据增删改查的操作方法

C. 在使用 Rust 进行 Ontology Wasm 合约开发时,开发者需要自己实现与本体区块链交互的接口 

D. ontio_std 库不提供链上数据的模拟

恭喜@康有为【深耕区块链】@强子 @星钻1  率先答对,请私信后台收件地址

本期互动

下列哪个说法不正确?

A. Ontology NeoVM 对用户暴露的对象语义有4种,分别是 bytearray、array、struct 和 map

B. 当前 Ontology 的 Neptune 编译器已基本实现 Python 的运算逻辑及控制逻辑

C. 内存对象模型最佳的方式是不直接使用 Ontology NeoVM 的内置语义对象,而是重新根据语言特性设计其对象模型

D. 对象模型的设计不会使得相关编译器的实现更加复杂

请将答案私信后台,前三位抢答对的小伙伴可以收到本体记事本一个噢~


步骤1:关注「本体研究院」官方账号;

点击文章最上方蓝色字

6c2a9aa60471b8659fb031e9d77c6278.png

或在微信搜索框内查找“本体研究院”

07e1f2e2a3f870f1ddc3ad44dbd8178e.png

或 ontologyresearch

140ba01744e96f268f6079257d07000b.png

点击关注

1ee3616003c6b0379e79a662aca93e2c.png

步骤2:将答案填写至对话框并发送

499269d447013fa2e24717679d4441e3.png

46958a09b4671aca3aa0772e02275628.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1856. 子数组最小乘积的最大值(前缀和 + 单调栈)

文章目录1. 题目2. 解题1. 题目 一个数组的 最小乘积 定义为这个数组中 最小值 乘以 数组的 和 。 比方说,数组 [3,2,5] (最小值是 2)的最小乘积为 2 * (325) 2 * 10 20 。 给你一个正整数数组 nums ,请你返回 nums 任意 非空…

【Python基础知识-pycharm版】第二节-赋值/数据类型/时间点/运算符/字符串

python第二节链式赋值_系列解包赋值内置数据类型时间表示unix时间点多点坐标绘出折线图运算符字符串部分来源:1.https://blog.csdn.net/wys103158/article/details/964882382.https://www.cnblogs.com/jack-zh/p/10810569.html3.http://c.biancheng.net/view/4258.h…

python第k序元素查找列表_【Python】第8次练习:列表——程序填空题 -合并队列、列表元素零的移动、列表逆序输出、第K序元素查找...

【Python】第8次练习:列表——程序填空题 -合并队列、列表元素"零"的移动、列表逆序输出、第K序元素查找1、程序填空题 -合并队列题目:某班男女两队同学各若干人,男生已按身高由低到高存放在列表中,女生身高需输入到一个…

大数据应用项目创新大赛_全国高校大数据应用创新大赛

2015年国务院发布《促进大数据发展行动纲要》,标志着大数据战略正式上升为国家战略。为配合国家大数据战略,加快产业人才培养,教育部增设了“数据科学与大数据技术”本科专业和“大数据技术与应用”高职专业,并得到各高校的积极响…

LeetCode 1859. 将句子排序

文章目录1. 题目2. 解题1. 题目 一个 句子 指的是一个序列的单词用单个空格连接起来,且开头和结尾没有任何空格。每个单词都只包含小写或大写英文字母。 我们可以给一个句子添加 从 1 开始的单词位置索引 ,并且将句子中所有单词 打乱顺序 。 比方说&a…

【Maven入门教程】Maven的基本概念

一、POM(Project Object Model)项目对象模型 Pom在Maven中是一个XML文件,位于项目的根目录下,其包含着项目构建所需要的必要信息,Pom还支持继承,当一个项目中拥有多个模块时,子模块可以继承父模…

java 拦截器_Spring的春天来啦——百战Java课程更新(2019.09.06)

百战程序员运营400天,课程突破10000节,周周有新课更新,保持行业领先,九大专业运营。注册人数突破70万人,超级VIP用户累计8358人。百战程序员,由50专家、精英讲师组成课程研究院,根据市场发展和企…

【Python基础知识-pycharm版】第三节-列表

Python 第三节-列表序列-列表列表创建的四种方式创建列表的增加和删除列表元素访问和技术列表排序二维列表表格数据的存取和读取序列-列表 常用的序列结构:字符串 元祖 字典 集合 列表对象大小可变,根据需要随时增加或缩小 列表创建的四种方式 一、基…

LeetCode 1860. 增长的内存泄露(等差数列)

文章目录1. 题目2. 解题1. 题目 给你两个整数 memory1 和 memory2 分别表示两个内存条剩余可用内存的位数。 现在有一个程序每秒递增的速度消耗着内存。 在第 i 秒(秒数从 1 开始),有 i 位内存被分配到 剩余内存较多 的内存条(如…

错误 Every derived table must have its own alias

错误 派生表必须要加一个 别名转载于:https://www.cnblogs.com/w8104254/p/4358947.html

argumentoutofrangeexception:长度不能小于0_数组长度属性背后的魔力有哪些?

开发人员每天都会处理数组。作为集合,要查询的重要属性是项目数:Array.prototype.length。在JavaScript中,length它并不总是指示现有元素的数量(对于稀疏数组),并且修改此属性可能会删除元素。让我们揭开这…

python线程池模块_python并发编程之进程池,线程池,协程(Python标准模块--concurrent.futures(并发未来))...

需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池。其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉只要你用并发,就会有锁的问题,但是你不能一直去自己加锁吧那么…

【Python基础知识-pycharm版】第四节-元组

元组元组的创建元组的元素访问和计数生成器推导式创建元组列表属于可变序列,可以任意修改列表中的元素,元组属于不可变序列,不能修改元组中的元素。因此,元组没有增加元素、修改元素、删除元素相关的方法。 因此,我们只…

人员离职it检查_?「市安委会第十七检查组」值班人员擅离职守,变压器房随意出入...

近日,市安委会第十七检查组深入浮山县隆顺矿业有限公司,细心查摆,全面梳理企业存在的安全隐患。日前,我们召开了安全生产工作会议,传达了市县相关要求和有关领导的指示批示,要求全体干部职工进一步提高安全…

LeetCode 1861. 旋转盒子(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个 m x n 的字符矩阵 box ,它表示一个箱子的侧视图。箱子的每一个格子可能为: # 表示石头* 表示固定的障碍物. 表示空位置 这个箱子被 顺时针旋转 90 度 ,由于重力原因,部分石头的位置会发…

学习需要记录才行啊

前些天学的现在又差不多忘了...比如计算机开机过程,指令执行过程,浏览器输入网址回车后到显示网页发生了什么等等... 接下去打算系统复习下操作系统,看了清华的公开课看了一半了,没做笔记,等看现代操作系统时再做笔记吧…

quartz.net隔一天执行一次_你知多少年的轮回,中秋和国庆在同一天吗?喜相逢必备“蟹”逅礼...

中秋节与国庆节上演“喜相逢”怎么会这样呢?天文学专业人士表明发生这类情形主要是闰月的原因天津市天文学会理事赵之珩说,我国的阴历规定大月30天,小月29天,1年12个月共354或355天,比一个回归年的天数少十一天上下&am…

【Python基础知识-pycharm版】第五节-字典\集合

第五节-字典\集合\控制语句字典字典的创建字典元素的访问字典元素添加、修改、删除序列解包表格数据使用字典和列表存储,并实现访问字典核心底层原理(重要)集合集合相关操作字典 字典是“键值对”的无序可变序列,字典中的每个元素…

英语在线听力翻译器_英语翻译_在线英语听力室

英语动画:考研英语翻译-新东方唐静 13[全屏观看] 点击右键- 另存为 可保存这个Flash影片...英语动画:考研英语翻译-新东方唐静 12[全屏观看] 点击右键- 另存为 可保存这个Flash影片...英语动画:考研英语翻译-新东方唐静 11[全屏观看] 点击右键…

java使用原生语句操作mongo_Java 中 MongoDB 使用指南

MongoDB是当今非常流行的一款NoSQL数据库&#xff0c;本文介绍如何使用MongoDB的Java驱动来操作MongoDB。一、引入MongoDB Java Driver包如果需要操作MongoDB的Java项目是一个Maven项目&#xff0c;可以在依赖中加上以下的配置。<dependencies><dependency><gro…