CN1233013A - 用于对以中级编程语言编写而成的程序进行数据存储和访问的改进方法及系统 - Google Patents

用于对以中级编程语言编写而成的程序进行数据存储和访问的改进方法及系统 Download PDF

Info

Publication number
CN1233013A
CN1233013A CN99104051A CN99104051A CN1233013A CN 1233013 A CN1233013 A CN 1233013A CN 99104051 A CN99104051 A CN 99104051A CN 99104051 A CN99104051 A CN 99104051A CN 1233013 A CN1233013 A CN 1233013A
Authority
CN
China
Prior art keywords
array
storage operation
antilog
request storage
carry out
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
CN99104051A
Other languages
English (en)
Other versions
CN1145100C (zh
Inventor
M·S·斯潘塞
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.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
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 International Business Machines Corp filed Critical International Business Machines Corp
Publication of CN1233013A publication Critical patent/CN1233013A/zh
Application granted granted Critical
Publication of CN1145100C publication Critical patent/CN1145100C/zh
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/54Link editing before load time
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5016Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory

Abstract

一种用于改进对一个存储器数组进行访问的程序的方法和系统,这些方法和系统通过使用被编程以完成至少下述功能的数据处理设备来实现其目的:检测一个被请求的存储器操作;判断所请求的存储器操作是否涉及先存的存储器数组;以及以一种取决于所请求的存储器操作涉及先存的存储器数组与否的方式执行一个动态存储器管理模块。

Description

用于对以中级编程语言编写而成的程序进行数据存储和访问 的改进方法及系统
本发明一般涉及一种对利用程序的数据处理系统进行使用的方法和系统。特别涉及一种对利用以能够直接控制存储器分配和访问的中级编程语言,如C++编写而成的程序的数据处理系统进行使用的方法和系统。特别是,本发明涉及一种对利用以能够直接控制存储器分配和访问的中级编程语言,如C++编写而成的程序的数据处理系统进行使用的方法和系统,在这种方法和系统中,能够增强这种程序的精确度、效率和可靠性。
数据处理系统由一台或多台计算机、外设及执行数据处理功能的软件构成。一台计算机是一个可编程操作部件:它通常受内部存储的程序控制,并使用公用存储器存储该程序的全部或一部分及该程序运行所需的全部或部分数据;执行用户编写或用户指定的程序;执行用户指定的数据处理,包括算术运算和逻辑运算;以及执行在运行过程中能够进行自我修改的程序。一台数字计算机用于处理以二进制数字串表示的不连续数据。
另外,一台计算机可以是一个独立的单元,也可以由几个相连的单元构成。一个程序由一系列能够被计算机处理的指令构成,其中所述处理包括使用一个汇编程序、一个编译程序、一个解释程序或一个翻译程序,用以为执行程序做准备以及执行该程序。
程序是用一种编程语言编写而成。编程语言是任何一种用于定义最终可被计算机处理和执行的一系列指令的人工语言。但是,除了编程语言的一般使用中隐含着编程语言需要一个借助于其它程序,例如一个编译程序的翻译处理过程,如从一个利用该编程语言压缩的源代码被翻译成一个为计算机或数据处理系统所需的机器代码以外,定义什么是编程语言或什么不是编程语言是存有疑问的。这样,尽管某些第四代(即面向人工智能的)语言使用和理解了英语的部分子集,但还是将英语以及其它自然语言排除在外。
编程语言具有不同的类型。一般认为编程语言属于三种不同的概念上的类别:低级语言类,高级语言类或中级语言类。
在计算机中,包含在一个程序中的指令由一个诸如中央处理器之类的处理单元来解释和执行。一个处理单元由一个或多个处理编码指令和执行一个任务的集成电路构成。用于中央处理器的编码指令集被称为它的指令集。包含在一个程序中的指令的处理和执行通常用从下述的一个或多个程序中生成的机器语言表示:解释程序、汇编程序、编译程序、连接程序。最普通的低级编程语言是汇编语言。鉴于机器语言是机器专用的代码,汇编语言是为了使人们更容易地理解机器语言的助记表示,汇编语言(在理论上)独立于机器并且更加便于携带;通常,利用一个中介的机器专用计算机程序,例如一个汇编程序将汇编语言翻译或转换成适用于一个特定处理器的机器语言。
由于程序员不是按照逻辑1和逻辑0进行思考和推理的,所以程序员经常感到利用汇编语言来编程是非常困难的。程序员试图代之以按照自然(即人类)语言或自然与数学语言的组合来进行思考和推理。根据这种认识,产生了高级编程语言。
高级编程语言是一种其概念和结构都便于人们推理的编程语言,例如:基于英语的高级编程语言COBOL语言(面向商业的通用语言)主要用于商业应用;基于英语和数学语言的高级编程语言FORTRAN语言(公式翻译程序语言)主要是为涉及数字计算的应用而设计的,例如科学应用、工程应用和数学应用;以及基于英语和数学语言的高级通用语言Pascal语言。与低级编程语言(例如汇编语言)相比,高级编程语言允许程序员以一种更类似于人类推理的方式为计算机编写指令。这是通过利用多层用于连续将以高级编程语言写成的程序转换成处理单元能够理解和执行的等效机器语言指令集的翻译程序而完成的。
在高级编程语言使程序员从用汇编或机器码直接进行处理的重负中解脱出来的同时,还减轻了相关的成本负担:利用高级编程语言,程序员就不能再直接访问使用中的处理器的真逻辑结构了。即,由于通过多层翻译程序生成了等效于程序员用高级编程语言编写的程序的机器码,实际上将程序员从直接访问处理器的真逻辑结构中“筛除”。通常这样的“筛除”不会引起问题,但也存在例外,例如需要精确存储和计算的程序(例如声音识别程序),程序员会发现能够直接生成、访问、控制和调整特定处理器和/或存储器分配是非常有利的。另一方面,就是在程序员不希望回到利用汇编/机器语言的冗长而不轻松的情形下。已产生的中级编程语言处于低级和高级编程语言之间。即,中级编程语言在与低级编程语言相比,以更相似于人类原始推理的方式出现和进行读取方面“学习和感受”了高级编程语言,但在相对地允许在处理单元的权限范围内直接访问和操作逻辑结构方面不同于高级编程语言。这使得中级编程语言从编程的观点上说,既是有功效的,又是危险的。
在允许对逻辑结构(例如存储器地址)进行直接访问和控制,从而使程序员能够更有效地利用计算资源方面,中级编程语言是有功效的。但是,在允许程序员在产生逻辑错误时不象高级语言一样返回一个错误消息方面,中级编程语言是危险的。另外,这种“折中”特性引起了若干与这种中级编程语言相关的特有的危险和无效。
中级编程语言的两个最好的例子就是C语言和C++语言。C语言是一种具有上述中级特性的编程语言,很多人认为C语言是比高级语言更加独立于机器的汇编语言(从而此处将其特性归为“中级”语言)。C++语言是C编程语言的面向对象版,也包括上述中级特性。在本文中,试图以“C”来代表C语言和C++语言。C可被用于说明上述可能出现的与中级编程语言相关的逻辑错误、特有的危险和无效的具体例子。
C可被用于说明上述可能出现的与中级编程语言相关的逻辑错误、特有的危险和无效的具体例子的一个特定区域是与分路C句柄数组相关的区域。
C允许程序员指定一个预定容量(size)的数组(例如一个10行6列的数组),这导致要为这个数组保留足够的存储区。但是,通过内部电源,C还允许程序员试图指定和访问大概位于数组的第7行第10列的元素。这个元素显然已经超出了该数组的参数定义。在高级语言中,象这样访问一个不存在的数组元素的尝试将导致立即出现一个错误消息;但在C中,响应访问这个假数组元素的尝试不会产生错误消息并且在实际上可返回数据。从而,很显然,C允许程序员在程序设计中可以出现在高级编程语言中不能出现的逻辑错误。
C允许程序员动态地设置数组,但仅涉及一维数组;即,对多于一维的数组,不能动态地设置其数组容量。因此,但在一个二维或多维数组的容量取决于一个在最初的运行时刻计算出的值时,唯一的选择就是为这个二维或多维数组分配比预计所需的存储区更多的存储区。显然,在不需要预留空间的事件中,这种预留导致了编程中的无效。
C无须压缩就可以存储数组中的数据。因此,如果一个数组是多维数组并且存在该数组中的数据相对较少(意味着存在极少的非零数据),则存储该数据是无效的,因为存在该数组中的大多数数据具有相对较少的信息内容。另外,如果所述数组是多维的(即二维或多维),则更加重了这种无效。
正如上面所提到的,C无须压缩即可存储数据。另外,存在数组中的数据通常基于用于表示一个数(例如一个32位整数)或字符(例如一个8位字符)的标准位数。如果数组包含被限定在一个范围内的数据,例如一个多维标记数组,其中的标记值被限定为0或1,则使用通常用于表示一个数(例如一个32位整数)或字符(例如一个8位字符)的标准位数是非常无效的。
如上所述,显然需要一种使用诸如C和C++之类的中级编程语言的方法和系统,这种方法和系统能够保留这些中级编程语言的灵活性而防止和/或消除上述由这些中级编程语言的固有灵活性引发的逻辑错误、特有的危险和无效。
因此本发明的一个目的是提供一种供利用程序的数据处理系统进行使用的方法和系统。
本发明的另一个目的是提供一种供利用能够直接控制存储器分配和访问的中级编程语言,如C++编写而成的程序的数据处理系统进行使用的方法和系统。
本发明的另一个目的是提供一种对利用能够直接控制存储器分配和访问的中级编程语言,如C++编写而成的程序的数据处理系统进行使用的方法和系统,在这种方法和系统中,能够增强这种程序的精确度、效率和可靠性。
这些方法和系统通过使用被编程以完成至少下述功能的数据处理设备来实现这些发明目的:检测一个被请求的存储器操作;判断所请求的存储器操作是否涉及先存的存储器数组;以及以一种取决于所请求的存储器操作涉及先存的存储器数组与否的方式执行一个动态存储器管理模块。当所请求的存储器操作与一个先存存储器数组相关时,动态存储器管理模块执行下列功能:识别其上将执行请求存储器操作的数组元素;判断出在其上执行请求存储器操作的该数组元素是否真实;如果判定该数组元素是真实的,只要以前没有做过,就为该真数组元素分配存储器,并对该真数组元素执行请求的存储器操作;但是,如果判断出该数组元素不是真实的,则对该操作产生并发送一个消息。另外或可替换地,动态存储器管理模块执行下述功能:检查存储在一个数组中的数据;判断该数据是否是稀疏的;以及,如果判断出该数据是稀疏的,则减少通常用于表示该数据的信息量。当请求的存储器操作涉及非先存存储器数组时,动态存储器管理模块执行下述功能:将请求的存储器操作分类为一个数组建立,保留数组的维数和数组元素的初始值,并保留至少一个用于数组存储的存储器地址,使得保留的存储区大小小于数组的容量。
在下面的详细描述中,本发明的上述以及其它目的、特征和有益效果将变得显而易见。
在后述的权利要求中阐明了本发明的新特征,但是参照结合附图对实施例的详细描述,将更好地理解发明本身、使用发明的最佳方式以及本发明的目的和有益效果,其中:
图1示出了一个用于改进依据本发明的中级编程语言编写而成的程序的进程;
图2描述了一个在判断检测到的请求存储器操作是否涉及一个先存存储器数组之后的进程流程;
图3示出了涉及在本发明的一个实施例中,在一个真数组元素上执行请求的存储器操作的步骤;
图4示出了在判断出请求的存储器操作不涉及一个先存存储器数组时的进程流程;
图5描述了本发明第二和第三实施例中实施的如在以上图中显示的在判断检测到的请求存储器操作是否涉及一个先存存储器数组之后的进程流程;
图6示出了本发明的一个实施例中的自检数组数据存取进程的C++示例;
图7示出了一个用于说明本发明的一个实施例中的稀疏数组数据存取进程的C++示例的高级流程图;
图8描述了一个能够按照本发明实施例所述的方法和系统而使用的数据处理系统的图形表示;以及
图9示出了能够按照本发明实施例所述的方法和系统而使用的代表性硬件环境。
本发明提出了解决在利用诸如C++之类的中级编程语言中的多维数组时遇到的问题的方案。在上面的简单介绍中已经提到了几个这样的问题;但在下面的详细描述中,由本发明提供了解决方案的更多问题将会显而易见。所属技术领域的技术人员将会意识到存在更多的类似问题。而且,虽然本发明的几个实施例都是以C++语境为例进行说明的,但所属技术领域的技术人员将意识到这里所述的本发明能够被用于解决在任何编程语言中遇到的类似问题,特别是在任何中级编程语言的语境中所遇到的类似问题。
现在参照图1。图1示出了一个用于改进以中级编程语言编写而成的程序的进程。方法步骤100描述了进程的开始。方法步骤102说明了一个请求存储器操作的检测。通常,检测步骤包括模拟中级编程语言的至少一个标准存储器操作的步骤,在一个具体实施例中,包括模拟C++编程语言的至少一个标准存储器操作的步骤。请求存储器操作一般发生在获取或设置一个数组的具体元素值的语境中。
方法步骤104示出了用于判断检测到的请求存储器操作是否涉及一个先存存储器数组的判断。方法步骤106描述了根据方法步骤104的判定结果,即指示请求存储器操作涉及一个先存存储器数组,动态存储器管理模块的执行。方法步骤107说明了根据方法步骤104的判定结果,即指示请求存储器操作涉及一个非先存存储器数组,动态存储器管理模块的执行。涉及动态存储器管理模块的步骤取决于或随方法步骤104的判定结果而变,并且这些不同的步骤在下面对单独的附图的说明中进行详述。然后,进程进入表示进程结束的方法步骤110。
现在参照图2。图2描述了一个在判断检测到的请求存储器操作是否涉及一个先存存储器数组之后的进程流程。方法步骤200说明了进程的开始。方法步骤202说明识别其上将执行请求存储器操作的数组元素。方法步骤204示出了根据对其上将执行请求存储器操作的数组元素的识别结果,判断该数组元素是否为一个“真”数组元素;用在此语境中的术语“真”被用于表示所识别的数组元素实际上是所述数组的一个“合法”数组元素(例如是在数组的定义界限之内)。
方法步骤206描述了根据该数组元素是一个真数组元素的判定结果,在该真数组元素上执行请求存储器操作。这是本发明根据程序需要动态分配存储器的事实。因此,在真元素上执行请求存储器操作需要判断存储器空间在以前是否已经分配给该真数组元素了,如下面图3中所示。然后,进程进入表示进程结束的方法步骤208。
方法步骤210说明了根据该数组元素不是一个真数组元素的判定结果,产生和发送一个试图在一个非真数组元素上进行操作的消息。
现在参照图3。图3示出了涉及在本发明的一个实施例中,在一个真数组元素上执行请求的存储器操作的步骤。方法步骤300描述了进程的开始。方法步骤301判断请求存储器操作是否构成对真数组元素的第一次访问(例如第一次对真数组元素进行写操作)。方法步骤302示出了根据判断结果,即请求存储器操作实际上是对真数组元素的首次访问,为真数组元素分配存储器。然后,方法步骤304描述了在该真元素上执行请求存储器操作。方法步骤308示出了进程的结束。
方法步骤306示出了在方法步骤301的判断输出了请求存储器操作不构成对该真数组元素的第一次访问的判定结果的情况下,在该真元素上执行请求存储器操作。然后方法步骤308示出了进程的结束。
现在参照图4。图4示出了在判断出请求的存储器操作不涉及一个先存存储器数组时的进程流程。方法步骤400描述了进程的开始。方法步骤402说明了方法步骤104中所述的判断指出检测到的存储器操作涉及一个非先存存储器数组,将将请求存储器操作或者归类于一个数组建立操作,其中数组的维数和数组元素的初始值被保存,或者归类于一个非数组建立操作。方法步骤404示出了根据请求存储器操作是一个数组建立操作的判定结果,其中数组的维数和数组元素的初始值被保存,预留至少一个存储器地址使得预留的存储器地址数小于通常由中级编程语言预留的数目。然后,该进程进入表示进程结束的方法步骤406。
如果判断出请求存储器操作是一个非数组建立操作,则该进程直接进入表示进程结束的方法步骤406。
现在参照图5。图5描述了本发明第二和第三实施例中的一个在判断检测到的请求存储器操作是否涉及一个先存存储器数组之后的进程流程。图5可被认为是本发明的第二实施例,其中相当于为前述跟在用于判定一个检测到的请求存储器操作是否涉及一个先存存储器数组的判断之后的进程附加了一个特征;图5可被认为是本发明的第三实施例,其中相当于可与前述跟在用于判定一个检测到的请求存储器操作是否涉及一个先存存储器数组的判断之后的进程进行替换的一个特征。方法步骤500说明了进程的开始。方法步骤502示出了在判断检测到的请求存储器操作是否涉及一个先存存储器数组之后,检查其上将执行请求存储器操作的先存存储器数组的所有数组元素。方法步骤504描述了根据检查的结果,将包含在被检查的数组元素中的数据归类于稀疏或非稀疏数据。
方法步骤506说明根据数据被归类于稀疏数据,与以前用于表示该数据的信息量相比,减少用于表示该被归类于稀疏数据的数据的信息量。然后,进程进入表示进程结束的方法步骤508。
在该数据未被归类于稀疏数据的情况下,进程进入表示进程结束的方法步骤508。
图1-5讨论了一个适用于任何可能出现上述问题的编程语言的实施例。下面要讨论的是本发明特别适用于中级编程语言C++的实施例。
C++实施例的整体结构
本发明的一个实施例所利用的C++类的整体结构利用了嵌套的模板和继承的组合。关于模板和继承的一般性讨论可参见由Breymann&Hughes所著的Composite Templates and Inheritance,Volume 7C++Report No.733-40(1995年9月)。本实施例实现后面所述的效果。首先,构成一个一维数组(向量)类,它实现基本功能:contructor、destructor、operator[]和resize函数;另外,该类还包括用以保存数组参数的专用数据项和一个数据指针。
在建立了一维数组(向量)类之后,按照下述方式,利用低维的数组建立更高维的数组:利用上述一维向量的一个向量生成一个二维数组,利用二维数组的一个向量生成一个三维数组,以及通过类似的逻辑推理,利用低维数组生成高维数组。用在C++实施例中的继承方法使得operator[]函数只在向量级执行,并在该函数中进行所有的边界检查和非零数组基数计算。
将这些类作为模板进行构造产生了这样的功能:这些数组可以包含任何类型的对象——从诸如整数(“int”类型)或浮点数(“float”类型)之类的基本数据类型到复杂的对象。
C++实施例的边界检查和非零基数
用一个最小和一个最大允许值来描述每个数组维数。为方便起见,假设所有维数的最小值(“基数”)都是相同的,但不一定是这样。
在operator[]函数中进行边界检查。这个函数采用了一个自变量:下标。根据该数组维数的基数和最大值来检测这个下标。如果它落在允许范围之外,就发送(发射)一个C++异常信息。如果没有,则该下标可用于检索该数组元素。
作为本发明的一个实施例所利用的边界示例,一个内含下标的允许范围为从32到212的数组被用于保存水温取样(华氏度数)。通过设置基数=32和大小=181来进行上述规定。因此,在内部,该数据数组包含从0到180的内部下标。利用一个外部下标200对operator[]的调用与内部下标168(200-32)处的元素相映射。
C++实施例的动态调整和数组初始化
本发明所利用的类可以在运行时刻确定数组的所有维数,这就为标准C++数组提供了更强的功能,其中除了一维数组以外的所有数组在编译时刻必须是已知的。在释放了以前已被分配给其大小将被调整的数组的存储器之后,resize()函数为该数据分配存储器。如果已经指定了该数组元素的初始值,就将该数组的每个元素设置成这个值。
在每个子类中执行resize()函数,以便于对例如二维resize()函数的一次调用将依次调整构成(该二维数组的)每个一维数组的大小。
应当注意的是,与例如在将该数组调整为一个更大的数组时保留原数组内容,而在将该数组调整为一个更小的数组时销毁(或破坏或截断)原内容相比,人们更希望数组的内容具有一致性,因此resize()函数的调用破坏了该数组的现有内容。如果需要保留该数据的能力,通过另一个函数,如grow()函数可以很容易地实现,grow()函数能够确保每维中的新尺寸大于或等于当前尺寸,并在释放以前用的存储器之前复制数据。
C++实施例的延迟存储器分配
为了使存储器分配在一个应用程序之内是光滑的(即为了使存储器分配请求分布在整个程序执行过程中),实际上resize()函数并不象上面所述的那样执行存储器分配。而是代之以设置一个指示需要分配存储器的标记。Operator[]函数在存取数据之前对这个标记进行测试,并且如果设置有该标记,则该函数首先分配存储器并清除该标记。这种方法具有如下的附加效果:如果一个数组根本就没有被访问过(根据数据,这是非常可能的),就不用为它分配存储器。
C++实施例的稀疏数据存储
对于稀疏数据存储(具有相对较少非零元素的大、多维数组)的专题,已经设计出一种稀疏数组类。除了完全特殊的内部结构以外,这个类与其它数组类具有相同的外表,实现相同的特性。
应当注意在这个类的描述中,由表达式“非零”可推及“除最公用的值以外的任何值”。所以,例如,一个除偶尔几个不等于“7”的元素以外,主要由设为“7”的元素构成的数组可被视为是稀疏的,并适用于这个类。为了便于说明起见,假设该稀疏数组是三维数组,但该数组可以是具有任何维数的数组。
稀疏数组类以一个散列表为根据,借此非零元素被存储在一个单维数组中,而所有的“零”元素被忽略。散列表需要一个关键码(一维数组中的下标),并且利用一个关键码生成函数以三个(举例)数组下标值为根据生成这个关键码。关键码生成函数具有这样的特性:任一关键码具有相同的生成概率并以如Sedgewick所著的Algorithms 233(2d ed.1989)中所述的Horner方法为根据。Horner方法需要依次将散列表的大小作为一个质数,在一个实施例中,利用如Sedgewick所著的Algorithms 16(2d ed.1989)中所述的Eratosthenes的筛选方法进行计算。
利用如Sedgewick所著的Algorithms 239-241(2d ed.1989)中所述的“双散列查找”方法来解决散列表中的冲突(数组下标的组合产生了一个已经处于使用状态中的关键码),以找到一个自由单元。如果没有找到自由单元,就认为散列表已满,并自动扩充其大小。由于在散列表变满时其性能降低,所以将散列表设计成可在达到一个用户定义的容量百分率时扩充其大小。
在将三维数据变换到一维空间时出现的另一个问题是1需要检测1是否从该数组中读出或写入该数组。利用通用数组类,一个实施例只向存储该数据的存储器单元返回一个引用信息(reference)。然后从该地址读出或向该地址写入调用应用程序。由于稀疏数组以压缩格式存储数据,所以不能允许这些应用程序直接访问包含该数据在内的存储器单元。
用于区分读和写的技术如由Meyers所著的More Effective C++217-223(1996)中所述,并利用代理类和用户定义的赋值算符来实现。当该应用程序向数组中进行写操作时,类采用通过值(passedvalue)及其位置,使其杂乱并进行压缩,然后将其存入散列表中。而在进行读操作时,类采用所用的下标,计算该数据的位置,从散列表中检索出该数据,对其进行解压缩并将其返回应用程序。
C++实施例的位数据存储
对于只具有两个可能值(0和1)的数据数组来说,利用32位整数来保存该值是非常低效的,相反只需一位就足够了。为此,设计了一种“位数组”。在将一个多维数组变换到一个一维数组中时,这个位数组与稀疏数组相似,除了在这种情况下的变换更为简单以外。为了便于说明起见,再次假设这个位数组是一个三维数组。
确定内部数组的容量使得三维数组的每个元素由内部一维数组的1位表示。因此其容量为三个维数的乘积被8(位每字节)所除。象利用一个稀疏数组一样,区分读和写。当对数组进行写操作时,检查该数据是否是可允许值(0或1)中的一个,如果不是,就发送(或产生)一个并常信息。然后其下标被变换成一维空间,并且该一维数组中的适当位被设置(对于一个值“1”)或清除(对于一个值“0”)。当从数组中读出数据时,下标被再次变换成一维等价数组(one-dimensional equivalent)并对该位进行测试。如果该位被设置,就返回一个“1”,如果该位被清除,就返回一个“0”。
现在参照图6。图6是用于说明本发明的自检数组数据存取进程的C++实施例的高级逻辑流程图。方法步骤600示出了进程的开始。方法步骤602描述了以一个被设置成值“I”的下标调用operator[]函数。方法步骤604示出了判断下标“I”是否处于为数组元素是一项的数组而定义的尺寸边界的范围之内。方法步骤606描述了如果数组元素位于定义边界之内,就判断以前是否已为该数组元素分配过任何存储器。在以前没有为其分配过存储器的情况下,方法步骤608说明了为其分配存储器。然后,方法步骤610示出了存储区被初始化。接着,方法步骤612描述了用于该被分配和初始化的存储器单元的一个地址被返回调用应用程序。然后,方法步骤614说明了调用应用程序或者从返回的存储器地址读数据或者向返回的存储器地址写数据。然后进程进入表示进程结束的方法步骤616。
如果方法步骤606所述的判断指出以前已经为所述特定数组元素分配了存储器,进程就进入方法步骤612并如前所述从该点开始执行。
如果方法步骤604所述的判断指出该数组元素的下标没有在为数组元素是一项的数组而定义的尺寸边界的范围之内,则方法步骤618示出了发送一个C++异常信息。然后,方法步骤620描述了调用应用程序注意到并响应产生的异常信息。接着,进程进入表示进程结束的方法步骤616。
现在参照图7。图7是用于说明本发明的稀疏数组数据存取进程的C++实施例的高级流程图。方法步骤700示出了进程的开始。方法步骤702描述了以一个被设置成值“I”的下标调用operator[]函数。方法步骤704示出了判断下标“I”是否处于为数组元素是一项的数组而定义的尺寸边界的范围之内。方法步骤706描述了如果数组元素位于定义边界之内,就判断在该特定数组元素上将被执行的操作是读操作还是写操作。方法步骤708说明了在该操作是一次读操作的情况下,为给定的下标计算散列值。然后方法步骤710示出了从散列表中检索该数据元素。方法步骤712描述了对检索出的数据元素进行解压缩。方法步骤714说明了将解压缩后的数据元素返回该调用应用程序。接着,进程进入表示进程结束的方法步骤716。
如果方法步骤706中所述的判断指出所述操作是一次写操作,方法步骤718则示出了为给定的下标计算散列值。方法步骤720描述了对要写入的数据进行压缩。方法步骤722说明了一个自由单元位于散列表中。然后,方法步骤724示出了该数据被存储在散列表中。接着,进程进入表示进程结束的方法步骤716。
如果方法步骤704所述的判断指出所述数组元素的下标超出了为意味着该数组元素是数组的一部分的数组而定义的尺寸边界,则方法步骤726示出了发送或产生一个C++异常信息。然后,方法步骤728描述了调用应用程序注意到产生的异常信息并采取适当的措施(例如通知用户访问了无效的数组元素)。接着,进程进入表示进程结束的方法步骤716。
现在参照附图,特别是参照图8,描述了一个能够按照本发明实施例所述的方法和系统而使用的数据处理系统的图形表示。利用图8所示的数据处理系统,能够实现由本发明实施例提供的方法和系统。所示的计算机820包括一个系统单元822,一个视频显示终端824,一个键盘826以及一个鼠标828。任何适用的高效计算机,如商用大型机、小型机或微型机,都可实现计算机820。
图9示出了能够按照本发明实施例所述的方法和系统而使用的代表性硬件环境。图9描述了用于实现本发明实施例的计算机820中的选定部件。系统单元822包括一个中央处理器(“CPU”)931,例如一个常规微处理器和多个通过系统总线932互连的其它单元。计算机820包括随机存取存储器(“RAM”)934,只读存储器(“ROM”)936,用于将系统总线932连接到视频显示终端824上的显示适配器937,以及用于将外设(例如磁盘和磁带驱动器933)连接到系统总线932上的I/O适配器。视频显示终端824是计算机820的可视输出,它可以是一个计算机硬件领域中公知的基于CRT的视频显示器。但是,在一个便携式或笔记本电脑中,视频显示终端824可替换为基于LCD或基于气体等离子体的平板显示器。计算机820还包括用于将键盘826、鼠标828、扬声器946、麦克风948以及/或诸如触屏设备(图中未示)之类的其它用户接口设备连接到系统总线932上的用户接口适配器940。通信适配器949将计算机820连接到一个数据处理网络。
可用任何适用的机器可读媒体来保存本发明实施例所述的方法和系统,如RAM934,ROM936,磁盘,磁带或光盘(最后三种需置于磁盘和磁带驱动器933中)。可用任何适用的操作系统和相关的图形用户接口软件(例如Microsoft Windows)来控制CPU931。AIX操作系统是IBM公司开发的UNIX操作系统。UNIX是UNIX系统实验室公司注册的商标。其中RISC系统/6000系统能够允许AIX操作系统。还可以利用与CPU931一同工作的其它技术,例如触屏技术或语音控制技术。此外,计算机820包括一个驻留在计算机存储器950中的控制程序951。控制程序951包含在CPU931上执行的指令,用以实现图1-7中的逻辑流程图或本文中其它示例所述的一个或多个操作。
所属技术领域的技术人员应当理解图9所示的硬件可以依特定应用而变。例如,在已描述的硬件基础上,可以附加或代之以诸如光盘媒体、音频适配器或芯片编程设备,如计算机硬件领域中公知的PAL或EPROM编程设备,之类的其它外设。
在参照特定实施例描述了本发明的同时,所属技术领域的技术人员应当理解在不偏离本发明构思和由后述权利要求所确定的保护范围的前提下,可以在形式和细节上对本发明进行上述以及其它改进。

Claims (15)

1.一种用于改进对一个存储器数组进行访问的程序的方法,所述方法包括步骤:
检测一个被请求的存储器操作;
判断所请求的存储器操作是否涉及一个先存的存储器数组;以及
根据判断结果,执行一个动态存储器管理模块。
2.如权利要求1所述的方法,其中所述判断步骤判定所请求的存储器操作是否涉及一个现存的存储器数组,以及其中所述执行一个动态存储器管理模块的步骤还包括步骤:
识别其上将执行请求存储器操作的数组元素;
根据所述识别步骤,判断其上将执行请求存储器操作的数组元素是否为一个真数组元素;以及
根据所述判断步骤输出该数组元素是一个真数组元素的判定结果,在该真元素上执行请求存储器操作。
3.如权利要求2所述的方法,其中在该真元素上执行请求存储器操作的步骤还包括:
判断请求存储器操作是否构成对真数组元素的第一次访问;
根据所述判断步骤输出请求存储器操作是对真数组元素的第一次访问的判定结果,
为真数组元素分配存储器,并
在该真元素上执行请求存储器操作;以及
根据所述判断步骤输出请求存储器操作不是对真数组元素的第一次访问的结果,在该真元素上执行请求存储器操作。
4.如权利要求2所述的方法,还包括步骤:
根据所述判断步骤输出请求存储器操作不是对真数组元素的第一次访问的结果,发送一个已尝试在一个非真数组元素上执行操作的消息。
5.如权利要求1所述的方法,其中所述判断步骤判定请求存储器操作不涉及一个现存的存储器数组,并且其中所述执行一个动态存储器管理模块的步骤还包括:
将请求存储器操作归类于数组建立操作或非数组建立操作;以及
根据所述归类步骤输出请求存储器操作是一个数组建立操作的判定结果,预留至少一个存储器地址使得预留的存储器地址数小于数组的容量。
6.如权利要求1所述的方法,其中所述判断步骤判定请求存储器操作涉及一个现存的存储器数组,并且其中所述执行一个动态存储器管理模块的步骤还包括:
检查其上将执行请求存储器操作的现存存储器数组中的至少一个数组元素;
根据所述检查步骤,将包含在至少一个被检查的数组元素中的至少一种数据归类于稀疏或非稀疏数据;以及
根据所述分类步骤,减少以前用于表示归类于稀疏数据的至少一个数据的信息。
7.如权利要求1所述的方法,其中所述检测步骤还包括模拟一种中级编程语言的至少一种标准存储器操作的步骤。
8.如权利要求7所述的方法,其中所述模拟一种中级编程语言的至少一种标准存储器操作的步骤还包括模拟C编程语言的至少一种标准存储器操作。
9.一种用于改进对一个存储器数组进行访问的程序的系统,所述系统包括:
用于检测一个被请求的存储器操作的装置;
用于判断所请求的存储器操作是否涉及一个先存的存储器数组的装置;以及
根据判断结果,用于执行一个动态存储器管理模块的装置。
10.如权利要求9所述的系统,其中所述判断装置判定所请求的存储器操作是否涉及一个现存的存储器数组,以及其中用于执行一个动态存储器管理模块的装置还包括:
用于识别其上将执行请求存储器操作的数组元素的装置;
根据所述识别装置,用于判断其上将执行请求存储器操作的数组元素是否为一个真数组元素的装置;以及
根据所述用于判断的装置输出该数组元素是一个真数组元素的判定结果,用于在该真元素上执行请求存储器操作的装置。
11.如权利要求10所述的系统,其中用于在该真元素上执行请求存储器操作的装置还包括:
用于判断请求存储器操作是否构成对真数组元素的第一次访问的装置;
根据所述用于判断的装置输出请求存储器操作是对真数组元素的第一次访问的判定结果的装置,
为真数组元素分配存储器,并
在该真元素上执行请求存储器操作;以及
根据所述用于判断的装置输出请求存储器操作不是对真数组元素的第一次访问的判定结果,用于在该真元素上执行请求存储器操作的装置。
12.如权利要求10所述的系统,还包括:
根据所述用于判断的装置输出的请求存储器操作不是对真数组元素的第一次访问的结果,用于发送一个已尝试在一个非真数组元素上执行操作的消息的装置。
13.如权利要求9所述的系统,其中所述判断装置判定请求存储器操作不涉及一个现存的存储器数组,并且其中所述用于执行一个动态存储器管理模块的装置还包括:
用于将请求存储器操作归类于数组建立操作或非数组建立操作的装置;以及
根据所述归类装置输出的请求存储器操作是一个数组建立操作的判定结果,用于预留至少一个存储器地址使得预留的存储器地址数小于数组的容量的装置。
14.如权利要求9所述的系统,其中所述用于判断的装置判定请求存储器操作涉及一个现存的存储器数组,并且其中所述用于执行一个动态存储器管理模块的装置还包括:
用于检查其上将执行请求存储器操作的现存存储器数组中的至少一个数组元素的装置;
根据所述检查装置,用于将包含在至少一个被检查的数组元素中的至少一种数据归类于稀疏或非稀疏数据的装置;以及
根据所述分类装置,用于减少以前用于表示归类于稀疏数据的至少一个数据的信息的装置。
15.如权利要求9所述的系统,其中所述检测装置还包括用于模拟一种中级编程语言的至少一种标准存储器操作的装置。
CNB991040511A 1998-04-21 1999-03-19 用于改进对存储器数组进行访问的程序的方法和系统 Expired - Fee Related CN1145100C (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US09/063683 1998-04-21
US09/063,683 1998-04-21
US09/063,683 US6154822A (en) 1998-04-21 1998-04-21 Method and system for improving data storage and access for programs written in mid-level programming languages

Publications (2)

Publication Number Publication Date
CN1233013A true CN1233013A (zh) 1999-10-27
CN1145100C CN1145100C (zh) 2004-04-07

Family

ID=22050808

Family Applications (1)

Application Number Title Priority Date Filing Date
CNB991040511A Expired - Fee Related CN1145100C (zh) 1998-04-21 1999-03-19 用于改进对存储器数组进行访问的程序的方法和系统

Country Status (5)

Country Link
US (2) US6154822A (zh)
JP (1) JP2000040006A (zh)
KR (1) KR100337280B1 (zh)
CN (1) CN1145100C (zh)
TW (1) TW428144B (zh)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7062761B2 (en) * 2001-07-10 2006-06-13 Micron Technology, Inc. Dynamic arrays and overlays with bounds policies
US7127559B2 (en) * 2001-07-10 2006-10-24 Micron Technology, Inc. Caching of dynamic arrays
JP6173031B2 (ja) * 2013-05-15 2017-08-02 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation コンピュータにおいてオブジェクトを管理するための方法、プログラム及びシステム

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4606002A (en) * 1983-05-02 1986-08-12 Wang Laboratories, Inc. B-tree structured data base using sparse array bit maps to store inverted lists
KR940007680A (ko) * 1992-09-30 1994-04-27 로버트 에이. 에셀만 메모리 할당 요구의 축소 방법 및 시스템
US5590329A (en) * 1994-02-04 1996-12-31 Lucent Technologies Inc. Method and apparatus for detecting memory access errors
US5644709A (en) * 1994-04-21 1997-07-01 Wisconsin Alumni Research Foundation Method for detecting computer memory access errors
US5537367A (en) * 1994-10-20 1996-07-16 Lockwood; Geoffrey R. Sparse array structures
EP0876647B1 (de) * 1996-01-25 2001-10-31 Siemens Aktiengesellschaft Graphische bedienoberfläche zur programmierung von speicherprogrammierbaren steuerungen

Also Published As

Publication number Publication date
US6240499B1 (en) 2001-05-29
CN1145100C (zh) 2004-04-07
KR100337280B1 (ko) 2002-05-22
KR19990082746A (ko) 1999-11-25
JP2000040006A (ja) 2000-02-08
US6154822A (en) 2000-11-28
TW428144B (en) 2001-04-01

Similar Documents

Publication Publication Date Title
US6453403B1 (en) System and method for memory management using contiguous fixed-size blocks
CN1197003C (zh) 将异常作为正常控制流进行处理的方法和装置
CN108229670A (zh) 基于fpga的深度神经网络加速平台
KR102535450B1 (ko) 데이터 저장 방법 및 장치, 및 그 컴퓨터 디바이스 및 저장 매체
WO2023005085A1 (zh) 一种神经网络的剪枝方法、装置、设备及存储介质
CN111586091B (zh) 一种实现算力组配的边缘计算网关系统
CN1519710A (zh) 用于以一种语言独立语法记录宏的方法和系统
CN114090838B (zh) 大数据可视化展示的方法、系统、电子装置和存储介质
Yasumatsu et al. SPiCE: a system for translating Smalltalk programs into a C environment
Di Penta et al. A language-independent software renovation framework
CN101030135A (zh) 一种在共享内存中存储c++对象的方法及装置
CN1145100C (zh) 用于改进对存储器数组进行访问的程序的方法和系统
CN111930963B (zh) 知识图谱生成方法、装置、电子设备及存储介质
US5410664A (en) RAM addressing apparatus with lower power consumption and less noise generation
Dershowitz et al. A formalization and proof of the Extended Church-Turing Thesis
Piasini et al. Embo: a Python package for empirical data analysis using the Information Bottleneck
Bender et al. k-Means Clustering on Two-Level Memory Systems
Nyrkov et al. Dynamic Shared Memory Pool Management Method in Soft Real-Time Systems
CN114385368A (zh) 预写日志的刷写方法和装置
Lohar et al. Content Based Image Retrieval System over Hadoop Using MapReduce
CN113608688A (zh) 数据迁移方法、装置、设备及存储介质
Rechenmann From data to knowledge
CN1252586C (zh) 产生优化的计算机数据字段转换例程
CN112765027B (zh) 一种检测应用程序执行过程中冗余零的方法
CN113656400B (zh) 一种特征数据的编码方法及装置

Legal Events

Date Code Title Description
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C06 Publication
PB01 Publication
C14 Grant of patent or utility model
GR01 Patent grant
C17 Cessation of patent right
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20040407