防止最小运行时上的垃圾对象积累的制作方法

文档序号:36713413发布日期:2024-01-16 12:10阅读:20来源:国知局
本公开涉及计算机编程语言编译器。更具体来说,本公开涉及用于防止最小运行时上的垃圾对象积累的计算机实施技术。
背景技术
::1、计算机是用于执行各种各样任务的非常强大的工具。计算机程序是用于使用计算机系统来实现定制处理任务的通用机制。典型程序是编译成可执行形式的一组经编程指令(源代码)。然后,可执行形式由计算机系统执行以实现任务。例如,一组c编程语言指令可被编译成一组x86处理器可执行指令。然后,所述一组处理器可执行指令可由x86兼容处理器执行以实现处理任务。2、在如由人类计算机程序员编程的一组经编程指令与可执行形式之间,编译器通常用作翻译器。本质上,编译器保护程序员免于了解或甚至无需担心底层可执行形式细节。通常,由程序员编写的所有经编程指令都由编译器翻译。例如,编译器可执行数据类型检查、符号表构造、寄存器分配及指令调度,所有这些都无需程序员了解底层编译器实施方式。以这种方式,编译器向程序员提供使用高级编程语言在更高级别上推理及表达处理任务的工具,这减轻了程序员担心低级执行细节的认知负担。编译器的一般构造及操作在本领域中是众所周知的。参见例如aho,a.、sethi,r.及ullman,j.的“编译器:原理、技术及工具(compilers:principles,techniques,and tools)”,第二版,2007年。3、一些编译器的一个目的是交叉编译。交叉编译器可被定义为从一个输入产生两个或更多个输出的编译器。例如,交叉编译器可接受由人类及计算机可读两者的源编程语言写入的源代码作为输入,并产生源代码的一种或多种可执行形式作为输出。例如,考虑了c编程语言的交叉编译器。此种交叉编译器可从c源代码产生x86可执行文件(例如,用于在配置有microsoft windows操作系统的计算机上执行)、arm可执行文件(例如,用于在配置有android操作系统的移动计算装置上执行)以及wasm可执行文件(例如,用于在由web浏览器应用支持的虚拟堆栈机器上执行)。4、还存在源到源编译器。源到源编译器可被定义为这样的编译器:接受以人类及计算机可读两者的源编程语言写入的源代码作为输入,并且输出用于人类及计算机可读两者的一个或多个编程语言目标的源代码。例如,haxe编译器可将以haxe编程语言写入的源代码翻译成一些结构上类似的编程语言目标。关于haxe的更多信息可在互联网上在haxe.org互联网域中找到。5、如今,许多广泛使用的编程语言都支持运行时隐式对象解除分配。解除分配可被定义为释放被非必要对象占用的计算机存储器空间以便可再次使用所述空间的运行时操作。如果空间最终被释放,诸如例如在对象变得非必要之后不久或者当执行程序确定所述空间需要用于其它目的时,那么在运行时解除分配是及时的。未以及时方式解除分配的对象有时被称为存储器“泄漏”。6、一些编程语言需要显式经编程解除分配,而另一些则支持隐式运行时解除分配。利用显式解除分配,计算机程序由程序员明确地编程,以使用诸如“new”、“malloc”、“free”、“delete”等等编程语言操作来为运行时对象分配及解除分配存储器空间。利用隐式运行时解除分配,程序员不再需要负责明确地编程程序来为运行时对象分配及解除分配存储器空间。而是,编程语言运行时负责将运行时对象及时解除分配。7、为了支持运行时隐式对象解除分配,编程语言运行时可提供运行时存储器管理服务,包含周期性地识别存储器中可被安全解除分配的对象的垃圾收集器或者识别存储器中相互引用但不被执行程序的其它部分引用的对象群组的循环收集器。然后可释放由对象占用的存储器空间以供其它用途。8、还存在智能引用。智能引用将存储器地址位与控制如何将存储器区域解除分配的其它位组合。一个种类的智能引用的示例是保持对需要所引用对象的程序元素的数目进行计数的引用计数引用。当计数达到零时,该对象可被安全解除分配。智能引用可与不针对隐式解除分配提供运行时支持的一些编程语言搭配使用。现代c++编程语言是一个示例。9、如今,大多数计算机程序员习惯于以支持运行时隐式解除分配的编程语言来进行编程。不幸的是,仍存在不支持运行时隐式解除分配的许多广泛使用的编程语言。此类编程语言的示例包含c、c++、objective-c及rust。经设计以支持所有广泛使用的编程语言的交叉编译器或源到源编译器不能假设所有目标都提供运行时隐式解除分配10、本文中所公开的技术解决了这个问题及其它问题。11、本节中所描述的方法是可追求的方法,但未必是先前所设想或所追求的方法。因此,除非另有指示,否则不应假设本节中所描述的任何方法仅仅因为包含在本节中就有资格作为现有技术。技术实现思路1、以下具体实施方式的总体概述部分提供用于防止最小运行时上的垃圾对象积累的技术的有用概述。2、在一些实施例中,编译器或数据类型检查工具检查编程语言源代码中的数据类型定义并且引起程序员注意可允许运行时引用循环的任何定义。在一些实施例中,所述编译器或数据类型检查工具考虑了计算机程序如何使用类型定义。3、在一些实施例中,所述编译器或数据类型检查工具考虑了编程语言源代码中的数据类型定义的哪些性质定义是只读的。在一些实施例中,所述编译器或数据类型检查工具使用所述编程语言源代码中的显式提示来确定性质定义是否是只读的,所述性质定义包含诸如“const”、“final”或“read-only”等关键字或者注解,或者不存在诸如“mutable”或“writeable”等具有相反含义的显式提示。在一些实施例中,所述编译器或数据类型检查工具检验性质定义以推断只读性。例如,当在性质的初始值被指派之后可设定性质的所述编程语言源代码中任一者都不这样做时,可推断性质定义的只读性。在一些实施例中,所述编译器或数据类型检查工具将额外指令插入到编程语言源代码或可执行程序中以检测或强制执行所需只读性。例如,在性质被初始化之后,所述额外指令可能会致使对所述性质的值指派失败。4、在一些实施例中,所述编译器或数据类型检查工具考虑了在对含有的对象的任何引用之前将所述编程语言源代码中的哪些性质定义早期初始化。早期概念是用来防止对象在性质初始化期间创建对自身的引用循环。可基于对将性质初始化的编程语言源的检验来推断早期初始化。早期初始化也可基于显式提示。所述显式提示可致使对可能执行初始化的所述编程语言源代码的其它检查,诸如例如检查数据类型的构造符定义以检查使用“this”引用作为值与性质指派之间的时间关系。所述编译器或数据类型检查工具可将额外指令插入到编程语言源代码或可执行程序中以检测或强制执行所需早期性。例如,在对含有性质的所述对象的“this”引用被用作值之后,所述额外指令可能导致将所述性质初始化的尝试失败。5、在一些实施例中,所述编译器或数据类型检查工具考虑了数据类型定义是否是封闭的(例如,其所有子类型是否对所述编译器或数据类型检查工具是已知的)。封闭性可基于所述编程语言源代码中的显式提示,诸如通过如同“final”、“closed”、“sealed”等关键字或注解的存在,或者如同“open”等具有相反意义的提示的不存在。封闭性可基于上下文来推断。例如,如果对数据类型定义的访问被信息隐藏机制限制于所述编程语言源代码的一些模块,并且在那些模块内的所述编程语言源代码中不存在子类型的定义,那么可推断所述数据类型定义的封闭性。封闭性还可用于允许用基于情形的推理来代替关于通用超数据类型的推理。6、在一些实施例中,所述编译器或数据类型检查工具考虑了数据类型定义是否是具体的(例如,是否可存在那种数据类型的并非所述数据类型的子数据类型的值的值)。具体数据类型可与抽象数据类型形成对比,所述抽象数据类型不足以描述值但可从中派生具体子数据类型。具体性可基于显式提示,诸如例如通过如同“concrete”等关键字或注解的存在,或者如同“abstract”等关键字或注解的不存在。具体性可基于上下文诸如例如通过所述编程语言源代码中的所述数据类型的用户来构造对象或者通过不存在会防止构造全功能对象的任何缺失件来推断。所述编译器或数据类型检查工具可推理具体类型足以进行引用循环检测,因为在运行时创建的所有值必须是至少一种具体数据类型。7、在一些实施例中,所述编译器或数据类型检查工具通过构建潜在类型含有关系的图形来检查潜在引用循环。所述图形中的一些节点可对应于所述编程语言源代码中所定义的数据类型。所述图形中的一些节点可对应于关于泛型类型参数的最坏情形假设。所述最坏情形的假设可能会考虑泛型类型参数的界限或者数据类型定义的界限。数据类型定义的一种类型的界限在本文中被称为“不可引用”界限。所述图形中的一些边可对应于所述编程语言源代码中所定义的一种数据类型可引用所述编程语言源代码中所定义的另一数据类型的方式。图形元素(例如,节点及边)可与从性质及数据类型定义的所述早期性、只读性或封闭性派生的元数据相关联。在一些实施例中,所述图形中具有特定种类的边的循环对应于所述编程语言源代码中的一组一个或多个数据类型定义所允许的可能引用循环。8、由所述编译器或数据类型检查工具生成的警示可包含可能引用循环的人类可读描述。例如,描述可能会这样说:“类型thing的值可经由其性质otherthing引用自身。‘athing.otherthing=athing;’将创建引用循环。”此种描述可从与潜在类型含有关系的图形中的节点或边相关联的元数据派生。所述描述可包含关于如何纠正问题的建议(例如,如何避免所述潜在引用循环)。在一些实施例中,诸如集成式开发环境的外部工具使用所述警示或所述警示的所修改形式(例如,所述警示的更机器可读形式)基于程序员用户所选择的建议来自动改变所述编程语言源代码。9、在一些实施例中,所述编译器或数据类型检查工具忽略已被人类审阅者认为安全的潜在引用循环。识别已被认为安全的引用循环可基于提示、注解或与所述编程语言源代码中的数据类型定义相关联的其它元数据。识别已被认为安全的引用循环可替代或也基于确定仅在所述编译器或数据类型检查工具免除数据类型检查的所述编程语言源代码的“不安全”片段内部指派所涉及性质,以便人类审计员可批准需要允许引用循环的数据类型定义。10、在一些实施例中,分布式对象系统保留同一计算机上的其它计算机或过程所需的对象的引用计数,并且依赖于非循环性检查以避免必须检测一些类型的对象之间的引用循环。在此上下文中,对象可引用其它过程中存在的对象,并且当所述分布式系统中的过程不再需要对象时,其可将消息发送给所述系统中被认为拥有所述对象的所述过程。所述系统中的多个过程可针对同一对象维护单独引用计数,以处置其中所述过程中的一者死亡或失败的情形,或者处置其中所述过程中的一者行为不当的情形,诸如例如,通过声称其不再需要两个引用,而其开始时只有不到两个引用,这可能是为了使那个对象对其它过程不可用。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1