CN102511033A - 对象级别兼容性和使用语义值的类大小调整 - Google Patents
对象级别兼容性和使用语义值的类大小调整 Download PDFInfo
- Publication number
- CN102511033A CN102511033A CN2010800424193A CN201080042419A CN102511033A CN 102511033 A CN102511033 A CN 102511033A CN 2010800424193 A CN2010800424193 A CN 2010800424193A CN 201080042419 A CN201080042419 A CN 201080042419A CN 102511033 A CN102511033 A CN 102511033A
- Authority
- CN
- China
- Prior art keywords
- binary object
- type
- skew
- value
- binary
- 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
Links
- 238000000034 method Methods 0.000 claims abstract description 38
- 230000006870 function Effects 0.000 claims description 28
- 230000003068 static effect Effects 0.000 claims description 14
- 238000013519 translation Methods 0.000 claims description 12
- 230000008569 process Effects 0.000 claims description 9
- 208000004350 Strabismus Diseases 0.000 claims description 3
- 230000008859 change Effects 0.000 description 8
- 230000000712 assembly Effects 0.000 description 5
- 238000006243 chemical reaction Methods 0.000 description 5
- 238000005516 engineering process Methods 0.000 description 5
- 238000000429 assembly Methods 0.000 description 4
- 230000008901 benefit Effects 0.000 description 4
- 238000004891 communication Methods 0.000 description 4
- 230000009471 action Effects 0.000 description 2
- 238000004590 computer program Methods 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 230000006872 improvement Effects 0.000 description 2
- 239000000463 material Substances 0.000 description 2
- 230000002093 peripheral effect Effects 0.000 description 2
- 238000012545 processing Methods 0.000 description 2
- 206010003830 Automatism Diseases 0.000 description 1
- 230000015572 biosynthetic process Effects 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 230000002950 deficient Effects 0.000 description 1
- 238000012217 deletion Methods 0.000 description 1
- 230000037430 deletion Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000002708 enhancing effect Effects 0.000 description 1
- 238000007689 inspection Methods 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 230000005055 memory storage Effects 0.000 description 1
- 230000008439 repair process Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 239000011800 void material Substances 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
一种在计算设备上将以高级语言编写的软件代码转换成二进制对象的方法,包括在计算设备上接收以高级语言编写的软件代码,以及在计算设备上将软件代码翻译成二进制对象文件。翻译包括确定软件代码包括需要被硬编码到二进制对象中的值的感兴趣的项,并且类是可调整大小的,以及创建语义变量表示硬编码值,并将语义变量和硬编码值存储在二进制对象中的表中。
Description
技术领域
本发明涉及为计算机系统创建可执行程序,并且更具体地,涉及通过使用语义值来翻译软件代码。
背景技术
计算机程序通常由被称为二进制对象的一个或多个组件构成。每个二进制对象代表可执行代码或模块(其组成了它作为组件的程序)的一部分。二进制对象通常由将以更高级语言编写的软件代码转换成二进制对象的编译器(也被称为翻译器)产生。
二进制对象然后链接在一起,组成完整的可执行程序。完成这项任务的软件工具被称为链接器。
在程序能够运行之前,其必须被装载到计算机存储器内。完成这项任务的操作系统的组件被称为程序装载器。由于各种原因,一些程序组件可能不用链接器被链接到程序。相反这些组件被装载器添加到可执行文件。这些组件通常被称为共享对象、共享库或动态装载的库。
将程序分割为多个二进制对象的好处之一是模块化。能够改变对应于一个二进制对象的源代码而不需要改变每个其它的二进制对象。具体地,仅仅是其源代码发生了改变的二进制对象需要使用编译器被再次翻译。未被影响的模块,包括共享库,不需要被重新翻译。
在当代操作系统(包括但不限于AIX、Linux、Windows、和Z/OS)中普遍使用的链接器/装载器技术是在常用的面向对象编程语言出现之前设计的。这样,这些语言引入了当今可用的模块化类型不能很好地解决的新的复杂性。具体地,在面向对象的编程员的日常工作中通常产生的一些活动要求整个程序被重翻译,而不仅仅是直接受影响的二进制对象。这些活动可包括但不限于:添加虚拟函数到类接口;从类接口移除虚拟函数;把虚拟函数作为基本类接口的因子;添加数据成员到类接口;以及添加新的基本类到现有的类。
不重新编译程序的所有构成二进制对象,包括其共享库,就无法进行这些活动,这是一个巨大的限制。单个共享库可以被很多独立的应用程序使用。因此,如果任何这些改变在共享库中做出,则共享库作为其组件的每个应用程序必须被重翻译(重编译)。这往往不可能,因为应用程序的用户不是熟练的编程人员,不拥有合适的软件工具或不能访问程序源代码。另外,用户无法控制模块向将来或从过去的开发中链接。因此,共享库的作者在他们能够对于其软件进行的各种改变方面严格受约束。在一些情况下,这些约束使得不能修补甚至很简单的缺陷。这在文献中被称为版本间二进制兼容性(RRBC)问题。
发明内容
根据本发明的一个实施例,公开了一种在计算设备上将以高级语言编写的软件代码转换成二进制对象的方法。该实施例包括在计算设备上接收以高级语言编写的软件代码;以及在计算设备上将软件代码翻译成二进制对象文件。翻译包括确定软件代码包括需要被硬编码到二进制对象中的值的感兴趣的项,并且类是可调整大小(resizable)的。本实施例中的翻译还包括创建语义变量来表示硬编码值,并将语义变量和硬编码值存储在二进制对象中的表中。
本发明的另一实施例涉及一种从多个二进制对象创建可执行程序的方法。该实施例的方法包括在计算设备处接收第一组多个二进制对象,至少一个二进制对象包括语义变量表,语义变量代表需要硬编码值的至少一个值的硬编码值,并且将第一组多个二进制对象链接在一起,以及用至少一个表中的硬编码值替换至少一个二进制对象中的语义变量。该方法还包括将第一组多个二进制对象装载到计算设备中,与一个或多个另外的二进制对象相结合来操作。
另外的特征和优点通过本发明的技术来实现。本发明的其他实施例和方面在此处详细描述,并且认为是所要求保护的发明的一部分。为了更好地理解本发明的优点和特征,参考说明书和附图。
附图说明
被视为本发明的主题在说明书结束部分的权利要求中被特别地指出并被清楚地要求保护。本发明的前述的和其他特征以及优点能结合附图从以下详细描述中清楚地看到,其中:
图1是根据本发明实施例的计算设备的系统图表;
图2是显示本发明实施例执行的处理的示例的数据流图;
图3示出了根据本发明实施例的翻译方法;
图4示出了根据本发明实施例的链接二进制对象的方法。
具体实施方式
本发明实施例涉及编译器-链接器-装载器系统,其中通常被编译器写入二进制对象的特定值被此后由链接器或装载器写入的变量和值所替换。这样的一种系统对于以例如C或C++的高级编程语言编写的程序尤其有用。当然本发明不仅仅限于以C或C++编写的程序,并且可以用于以其他语言编写的程序。
传统C++实现方案在翻译器执行期间(也就是在编译时)计算下述项:任何类类型的大小;任何数据成员在类中的偏移;以及任何虚拟函数指针在类的虚拟表(虚函数表或等同物)中的偏移。这些值由翻译器写入对象文件。在本发明中,翻译器替代地创建包含链接到这些值的变量的表。所述变量,而非所述值,被写入对象中,并且由链接器或装载器使用所述变量来访问所述表以代替所述值。因此,仅仅那些改变了上述项的定义的对象文件需要被重新编译,而不是程序的所有部分。
图1显示了计算系统的例子,在其上可以实现本发明的实施例。应当理解的是,系统可以是分布式的,并且以下描述的系统各部分可以存在于彼此不同的物理位置处。
在该实施例中,系统100具有一个或多个中央处理单元(处理器)101a、101b、101c等(共同地或一般性地称为处理器101)。在一实施例中,每个处理器101可以包括精简指令集计算机(RISC)微处理器。处理器101通过系统总线113耦接到系统存储器114以及各种其他组件。只读存储器(ROM)102耦接到系统总线113,并且可包括基本输入/输出系统(BIOS),其控制系统100的特定基本功能。
图1还描述了输入/输出(I/O)适配器107和耦接到系统总线113的网络适配器106。I/O适配器107可以是小型计算机系统接口(SCSI)适配器,其与硬盘103和/或磁带存储驱动器105或任何其他类似组件通信。I/O适配器107、硬盘103和磁带存储驱动器105此处共同地称为大容量存储器104。网络适配器106将总线113与外部网络116互连,使得数据处理系统100能够与其他这种系统通信。屏幕(例如显示监视器)115通过显示适配器112连接到系统总线113,显示适配器112包括用以提高图形密集应用的性能的图形适配器和视频控制器。在一实施例中,适配器107、106和112可以连接到一个或多个I/O总线,后者通过中间总线桥(未显示)连接到系统总线113。用于连接例如像硬盘控制器、网络适配器和图形适配器的外围设备的合适的I/O总线通常包括常见协议,例如外围元件接口(PCI)。附加的输入/输出设备被示出为通过用户接口适配器108和显示器适配器112连接到系统总线113。键盘109、鼠标110和扬声器111都通过用户接口适配器108互连到总线113,用户接口适配器108包括例如将多个设备适配器集成在单个集成电路中的超级I/O芯片。
这样,如图1所配置的,系统100包括处理器101形式的处理装置、包括系统存储器114和大容量存储器104的存储装置、例如键盘109和鼠标110的输入装置,以及包括扬声器111和显示器115的输出装置。在一实施例中,系统存储器114和大容量存储器104的一部分共同地存储一操作系统,例如来自公司的操作系统以协调图1中所示的各个组件的功能。
应当理解,系统100可以是任何合适的计算机或计算平台,并且可以包括终端、无线设备、信息电器、设备、工作站、微型计算机、大型机、个人数字助理(PDA)或其他计算设备。应当理解的是,系统100可以包括被通信网络连接在一起的多个计算设备。例如,在两个系统之间可存在客户机-服务器关系,并且处理可以分摊在两者上。
系统100能够支持的操作系统的例子包括95、98、Windows4.0、Windows2000、CE、WindowsMac OS、LINUX和或任何其他合适的操作系统。系统100还包括通过网络116通信的网络接口106。网络116可以是局域网(LAN)、城域网(MAN)或广域网(WAN),例如因特网或万维网。
系统100的用户能通过任何合适的网络接口116连接,例如标准电话线、数字用户线、LAN或WAN链接(例如T1、T3)、宽带连接(帧中继、ATM)和无线连接(例如802.11(a)、802.11(b)、802.11(g)),而连接到网络。
如此处所公开的,系统100包括存储在机器可读介质(例如硬盘104)上的机器可读指令,用于捕获和交互显示在用户屏幕115上示出的信息。如此处所讨论的,指令被称为“软件”120。如本领域所公知的,软件120可使用软件开发工具产生。如本领域所公知的,软件120可包括多种工具和特征以提供用户交互的能力。
在一些实施例中,软件120被提供为覆盖另一程序。例如,软件120可以被提供为对应用(或操作系统)的内插式程序(add-in)。注意术语“内插式程序”一般指本领域公知的补充程序代码。在这样的实施例中,软件120可替代与其协作的应用或操作系统的结构或对象。
图2是示出根据一实施例的系统中数据移动的数据流程图。系统包括翻译器202。翻译器202可基于任何已知的编译器。翻译器202接收一个或多个源代码文件204,并将每个源代码文件转换成对象文件206。当然,源代码文件的确切数量是可变的,并可以包括例如被很多应用所使用的共享库或其他源代码文件。
但是翻译器202与典型的翻译器不同之处在于它如何从源代码创建一个对象文件。具体地,翻译器202可在每个对象文件中创建表208,包括链接到通常被传统编译器硬编码到对象文件中的特定值的变量。变量而不是值被写入对象,并且链接器210或装载器212使用变量访问所述表,此时变量被值代替。
系统还包括链接器210。链接器210可与传统链接器相似。链接器或链接编辑器是获取由编译器202产生的一个或多个对象206并将它们组合在单个可执行程序212中的程序。但是,根据本发明一实施例的链接器210可被配置成使得它查阅每个对象文件206的表208,以便用通常被现有技术编译器写入对象文件206的静态值填入变量。这些值被硬编码到可执行文件中。硬编码值是不会改变的值。硬编码值的一个例子是何时变量被指定为一特定整数。当然,不是所有包含在表中的值可转换成硬值,并且可执行文件可包括一可执行变量表214。
系统还可包括装载器216。装载器是操作系统的一部分,其负责将程序从可执行体(例如可执行文件)装载到存储器中,让它们准备执行并且然后执行它们。在现有技术中,装载器一般是操作系统内核的一部分,并一般在系统启动时装载,在存储器中保持到系统重启、关闭或断电。一些具有可分页内核的操作系统在存储器的可分页部分有装载器,因此装载器有时会被交换出存储器。所有支持程序装载的操作系统都具有装载器。
根据本发明实施例的装载器216的操作类似于现有技术的装载器。但是链接器216还查阅每个可执行文件212的可执行变量表214以便用通常被现有技术编译器写入对象文件206的硬值填入变量。
图3显示了根据本发明一个实施例的翻译器202(图2)的操作方法。在块302中,要被翻译的所有部分或一个部分在翻译器处被接收。翻译器(或编译器)是计算机程序(或一组程序),其将以计算机语言(源语言)编写的源代码转换成另一计算机语言(目标语言,经常具有被认为是对象代码的二进制形式)。希望转换源代码的最常见原因是创建可执行程序。
在块304中,确定是否有更多的区段(整个源代码文件或其一个区段)需要被翻译。如果没有,该方法结束并且翻译完成。
如果还要进行更多的翻译,下一区段或文件在块306中被翻译。作为块306(翻译)的一部分,在块308确定该段是否包含感兴趣的项。术语“感兴趣的项”在此应指代现有技术翻译器可能已在翻译期间为其创建静态值的代码段。感兴趣的项的示例可以包括但不限于:类类型的大小,用来访问类对象中非静态数据成员的偏移;以及虚拟函数表偏移。可理解的是,传统的C++实现方案在翻译器执行期间(也就是在编译时)计算以下的项:任何类类型的大小,任何数据成员在类中的偏移;以及任何虚拟函数指针在类的虚函数表(虚拟表或等同物)中的偏移。这些计算得到的值是上述的预先被翻译器写入对象文件的“静态的”或硬编码值。
通过解释,C++编程语言允许编程者通过使用类来定义程序特定数据类型。这些数据类型的实例被称为对象,并且其可以包括程序员定义的成员变量、常量、成员函数及过载运算符。语法上,类是C结构体的延伸,不能包括函数或过载运算符。下面的描述将解释C++语言的例子,但是应当理解的是,其他语言在预期中,并在本发明的范围内。
在块310,创建具有变量名称的翻译。这不同于现有技术,如通过非限制性的以下示例所示。
“sizeof”表达式的值在编译时被C++语言翻译器计算。sizeof操作符产生关于字符类型大小的其操作数的大小。传统C++实现方案用等同于其操作数大小(以八位字节计数)的常值来替代sizeof表达式。例如,语句:
将被翻译成如下:
const size_t char_size=4;
其中值“4”将被硬编码到二进制对象中。
本发明实施例不同于传统实现方案之处在于,当sizeof操作符的操作数是类类型或具有类类型,则转换的表达式用符号常量而不是顺序值来替代sizeof表达式。例如,本发明的翻译器可以将以上的语句翻译为:
const size_t char_size=_SYMBOL_sizeof_S.
在块312,_SYMBOL_sizeof_S的硬值(本例中为4)存储在表中。该表然后被链接器或装载器使用,以便此后将值4代入表达式_SYMBOL_sizeof_S。这允许在一个区段中做出改变,而不需要重新编译整个程序,只有发生改变的区段(例如,改变的对象文件)要被重编译。这减轻了以上描述的一部分或全部问题。
以下部分描述了可以对编译器做出的其他改变,以及如何理解这些改变。例如,在现有技术中当动态分配存储器时(例如“new”表达式),例如下述的语句:
如上,值“4”将被硬编码到二进制对象中,并且代表存储器分配器请求的存储器的量。该值作为自变量传递给函数::operator new,其调用存储器分配器。本发明的实施例可不同于这种传统实现方案之处在于,当对于new表达式的操作数是类类型时,转换的new表达式将一符号常量而不是顺序值作为自变量传送给::operator new。例如,上述语句可根据本发明实施例转换为:
作为另一个例子,在本发明中,自动作用域对象的分配有所不同。在现有技术中,自动作用域对象(包括值函数参数)被分配到程序堆栈上。在堆栈上为一给定类对象预留的存储器量被硬编码到二进制对象中。本发明实施例可以不同于传统实现方案之处在于:当要被分配的对象具有类类型时,按以上所述的方式,预留的存储器量由符号常量而不是顺序值确定。
作为另一示例,考虑静态作用域对象分配的情况。通常,静态分配的类对象存储在当装载程序时为它们留出的存储器中。为此目的预留的存储器量在为此目的而存在的二进制对象文件的一个区段中被指定。例如,在通用对象文件格式(COFF)中,要为每个静态类对象预留的存储器量在对象文件的.bss区段中被指定。在本发明的实施例中,翻译器根据传统实践编码对象文件的.bss区段(或等同物),只是.bss区段(或等同物)中的每个条目将包含附加信息,该附加信息说明其静态分配正被表示的类对象的类型。该附加信息可以被程序装载器使用。
作为另一例子,考虑在出现多重继承时子对象偏移的情况。在出现多重继承的情况下,当将类对象的类型从最衍生的类型转换成基本类型或在基本类型之间转换时,必须用偏移调整“本(this)”指针。例如,考虑以下表达式:
在本例中的类对象dobj包括Left类型的子对象和Right类型的另一子对象。传统C++编译器将Left类型的子对象定位到dobj中偏移0的位置处。Right类型的子对象将被定位到dobj中的如下计算的偏移处:使得_SYMBOL_sizeof_Left成为代表类类型Left的大小的符号常量。使得DerivedMembers成为代表类类型Derived的所有非静态数据成员的总体大小的符号常量,不包括从其基本类继承的那些成员。DerivedMembers还包括任何所需要的对齐填充的大小。dobj中的类型Right的子对象的偏移是_SYMBOL_sizeof_Left与DerivedMembers的和。在传统C++翻译器中,该偏移在需要时计算并被直接编码到对象文件中。例如,在调用名为fn()的函数时,表达式&dobj的类型必须从类型Derived*转换成类型Right*。为了完成此,由表达式&dobj代表的指针必须被调整,使得其代表的不是对象dobj的地址,而是dobj所包含的类型Right的子对象的地址。该调整通过将Right子对象在dobj的偏移添加到dobj的地址来实现。假设一个int的sizeof是4,并且一个int的alignmnt(对齐)是4,Right在dobj中的偏移是8。这样,传统C++编译器将把以上函数main()转换为以下的形式:
偏移在所产生的代码中直接以数字值表示。在本发明中,这样的偏移不被表示为顺序值,而是表示为符号常量:
当调用虚拟函数时,使用这些相同的偏移。但是,由于偏移的值取决于用于分派虚拟函数的对象的动态类型,因此偏移不能被编码到函数调用地址中,因为对象的动态类型直到程序执行时才可知。因此,偏移在虚函数表中被编码为“本调整(this adjustment)”。有两种完成此的常用技术:(1)虚函数表中的每个条目是由到虚拟函数的指针和适当的偏移构成的对,或(2)虚函数表仅包括指向可执行代码的指针;并且由本指针引用的代码可以是虚拟函数或在偏移非零时的“adjustor thunk”,adjustor thunk将正确的偏移添加到的本指针,并且然后分支到虚拟函数。在任一情况下,传统C++翻译器使用数字值来表示偏移。在本发明中,偏移使用符号常量表示,如上所述。
另一例子可能与动态转换表(dynamic cast table)的例子。C++实现方案产生动态转换表以允许在程序执行期间计算类类型的互相转换。动态转换表包括子对象偏移,与已描述的那些类似。在本发明中,这些偏移如上所示使用符号常量表示。
除了类大小之外,传统C++实现方案还硬编码用来访问类对象中的非静态数据成员的偏移。在本发明中,偏移使用符号常量来表示。该技术应用于直接成员访问,以及到非静态数据成员的指针。
另外,本发明的实施例可以将以上技术应用到虚拟函数表偏移的情况中。类的虚函数表中的各个条目通过虚函数表内的偏移来访问。传统C++实现方案将这些偏移硬编码到函数调用地址中。例如,
如果每个虚函数表条目占据4字节,并且指向虚函数表的指针定位在从类类型Base或Derived的对象起始偏移为0的位置处,则在main()中函数bar()的调用将如下被转换:
(**((void(**)()const)(ref->0+4)))(ref)
子表达式ref->0表示虚函数表起始的地址,并且数字4是代表虚拟成员函数bar()的条目在虚函数表中的偏移。在本发明中,该数字被符号常量替代。
类的虚函数表还可以包括虚拟基本指针(VBP)。这些等同于包含类对象内基本类子对象的偏移,并且如上描述地进行处理。
以上的描述详述了在块310处所进行的替换的示例。应当理解的是,这些值和用于表示它们的符号常量在块312处存储在对象文件中的表中。
以上所确定的每个符号常量可以被定义在四个表之一中,这些表位于在块312处创建的对象文件格式的可选头部或尾部区段。程序链接器和装载器可根据本发明扩展以允许它们读取这个区段。在一实施例中,四个表可包括:1)类类型大小的表,其对于每个类类型给予单独一行。在该表中,给定的行包括三项信息:代表类类型大小的符号常量的名称,使用常用的方法被语言翻译器确定的类类型的大小,以及指示类类型是否能够被链接器/装载器调整大小的标志;2)在包含类中子对象偏移的表,如上所述。一给定行包括两项信息:符号常量的名称以及偏移的值;3)非静态数据成员偏移的表,其中一给定行包括两项信息:符号常量的名称和值以及偏移的值;以及4)虚函数表偏移的表。
在一实施例中,如果目标可执行文件没链接到动态或共享库,则所有的上述符号常量都可以被链接器解析。出现在可执行代码中的每个符号常量被相应的值所替代,如合适表所确定的。由于包含这些表的头部或尾部区域是可选的,具体实现本发明的链接器可以消耗包含以及不包含这些文件的二进制对象。因此,现有C++编译器能够被扩展来实现本发明,并且由先前版本的编译器所创建的二进制对象能够链接到由产生表的新版本编译器所创建的二进制对象。
图4显示了链接器或装载器如何根据本发明实施例操作的流程图。在块402,由翻译器创建的二进制对象在链接器处被接收。可以从与链接器位于相同或者不同位置的编译器接收。根据本发明,在块404,链接器检查对象文件以确定它们是否包含任何表。在表存在的情况下,在块406,由链接器用静态值替代符号常量。该过程在以下详细描述。在块408,链接器继续如现有技术中那样链接对象。
如上所讨论地,在块406,符号常量被替换。一般地,类对象在使用它的每个程序模块中被定义。如果类对象以某种方式被修改,则对应于定义类类型的程序模块的每个二进制对象必须被重新编译。在传统C++翻译器/链接器环境中,以某种方式对类进行修改之后如果不能重新翻译包含类定义的每个模块,则将导致在执行期间链接时间错误或程序故障。根据本发明实施例的链接器可以解决该问题。考虑类定义以下述方式被修改,即改变其大小,或任何静态数据成员的位置或其内部的基础类子对象发生了改变。上述表包括足够的信息以允许链接器检测二进制对象之间在给定类类型的定义上的差异。这些差异的调和可以下述任何方式来实现:1)时间和日期标记:使用来自最近创建的二进制对象的信息;2)类版本控制:允许程序员通过编译指示来将版本号与其类相关联以及使用与类的最近版本相关联的信息;3)程序员交互:允许程序员在调用链接器时直接规定如何解决差异;4)产生导致创建最大类的类定义的版本;以及5)从二进制对象产生信息,该二进制对象包含对应于作为差异来源的类的虚函数表。
应当注意,在使用一个或多个共享库的情况下,装载器可以以如上对于链接器所述的相同方式操作。
当然,本领域技术人员应当理解,本发明的实施例在一些分立的情况下会遇到困难。这些可能包括,例如,向多态类增加项或从其移除,函数协调以及用模版处理。这样,这些类的类型被标记为不可调整大小的,并且编译器如现有技术一样对它们进行操作。
此处所用术语仅是为了描述特定实施例的目的,而不为了限制本发明。如此处所用,单数形式“一个”、“一”及“该”也包括复数形式,除非上下文另外清楚指示。还应当理解,术语“包括”用在本说明书中,表示所声明特征、整数、步骤、操作、元件和/或组件的存在,但并不排除存在或增加一个或多个其它特征、整数、步骤、操作、元件组件和/或它们的组。
在以下权利要求中出现的所有装置或步骤加功能要素的相应结构、材料、动作和等同物,意指包括与特别要求保护的其他要求保护的要素相结合来执行所述功能的任何结构、材料或动作。本发明的描述是为了说明和描述的目的,但不为了穷举或以所公开的形式限制本发明。很多改进和变形对于本领域技术人员来说是显然的,不背离本发明的范围和精神。实施例的选择和描述是为了最好地解释本发明的原理和实际的应用,并且为了使得本领域其他技术人员能够理解本发明具有不同改进的不同实施例也适于预期的特殊应用。
此处所描述的流程图仅是一个示例。此处所描述的该图或步骤(或操作)可以有多种变化,这不偏离发明的精神。例如,步骤可以不同的顺序执行,或者可以添加、删除、修改步骤。所有这些变化被认为是所要求保护的发明的一部分。
虽然已经描述了本发明的优选实施例,但是应当理解的是,本领域技术人员,不管是现在还是将来可以做出各种改进和增强,这都落入后述权利要求的范围之内。这些权利要求被解释为对上述发明维持适当保护。
Claims (20)
1.一种在计算设备上将以高级语言编写的软件代码转换成二进制对象的方法,该方法包括:
在计算设备上接收以高级语言编写的软件代码;以及
在计算设备上将软件代码翻译成二进制对象文件,该翻译包括:
确定软件代码包括需要被硬编码到二进制对象中的值的感兴趣的项,并且类是可调整大小的;以及
创建语义变量来表示硬编码值,并将语义变量和硬编码值存储在二进制对象中的表中。
2.根据权利要求1的方法,其中高级语言是C++。
3.根据权利要求1方法,其中感兴趣的项是下述之一:大小类类型,到非静态数据成员的偏移和虚拟函数表偏移。
4.根据权利要求1的方法,其中该表是虚函数表偏移的表。
5.根据权利要求1的方法,其中该表是类类型大小的表。
6.根据权利要求1的方法,其中该表是在包含类中的子对象偏移的表。
7.根据权利要求1的方法,其中该表是非静态数据成员偏移的表。
8.根据权利要求1的方法,其中该表存储在二进制对象的头部。
9.根据权利要求8的方法,还包括:
在计算设备上在链接器处接收多个二进制对象;
将多个二进制对象互相链接;以及
解决在具有基于预定义偏好的表的每个对象中的表之间的差异。
10.根据权利要求9的方法,其中每个二进制对象包括至少一个表。
11.根据权利要求10的方法,其中至少一个二进制对象不包括表。
12.根据权利要求9的方法,其中预定义偏好使得较新的表优于较老的表而被选择。
13.根据权利要求9的方法,其中预定义偏好使得具有较高版本号的表优于具有较低版本号的表而被选择。
14.根据权利要求9的方法,其中预定义偏好使得包括作为二进制对象之间差异来源的虚拟表的对象优于不具有该虚拟表的对象而被选择。
15.一种从多个二进制对象创建可执行程序的方法,该方法包括:
在计算设备处接收第一组多个二进制对象,至少一个二进制对象包括语义变量表,该语义变量代表需要硬编码值的至少一个值的硬编码值;
将第一组多个二进制对象链接在一起,并且用至少一个表中的硬编码值替换至少一个二进制对象中的语义变量;以及
将第一组多个二进制对象装载到计算设备中,以便与一个或多个另外的二进制对象相结合来操作。
16.根据权利要求15的方法,其中需要硬编码值的值是下述之一:大小类类型、到非静态数据成员的偏移以及虚拟函数表偏移。
17.根据权利要求15的方法,其中所述至少一个表是虚函数表偏移的表。
18.根据权利要求15的方法,其中所述至少一个表是类类型大小的表。
19.根据权利要求15的方法,其中所述至少一个表是包含类中子对象偏移的表。
20.根据权利要求15的方法,其中所述至少一个表存储在二进制对象的头部中。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CA2678095A CA2678095C (en) | 2009-09-25 | 2009-09-25 | Object level compatibility and class resizing utilizing semantic values |
CA2,678,095 | 2009-09-25 | ||
PCT/CA2010/001504 WO2011035431A1 (en) | 2009-09-25 | 2010-09-22 | Object level compatibility and class resizing utilizing semantic values |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102511033A true CN102511033A (zh) | 2012-06-20 |
CN102511033B CN102511033B (zh) | 2014-09-03 |
Family
ID=41397458
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201080042419.3A Active CN102511033B (zh) | 2009-09-25 | 2010-09-22 | 对象级别兼容性和使用语义值的类大小调整 |
Country Status (7)
Country | Link |
---|---|
US (1) | US8813045B2 (zh) |
JP (1) | JP5506936B2 (zh) |
CN (1) | CN102511033B (zh) |
CA (1) | CA2678095C (zh) |
DE (1) | DE112010003774T5 (zh) |
GB (1) | GB2488254B (zh) |
WO (1) | WO2011035431A1 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106233251A (zh) * | 2014-04-22 | 2016-12-14 | 甲骨文国际公司 | 元数据驱动的动态具体化 |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9164735B2 (en) * | 2012-09-27 | 2015-10-20 | Intel Corporation | Enabling polymorphic objects across devices in a heterogeneous platform |
US10747880B2 (en) | 2013-12-30 | 2020-08-18 | University Of Louisiana At Lafayette | System and method for identifying and comparing code by semantic abstractions |
CN111399848B (zh) * | 2020-03-17 | 2023-05-23 | 阿波罗智联(北京)科技有限公司 | 一种硬编码数据检测方法、装置、电子设备和介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5339438A (en) * | 1991-12-12 | 1994-08-16 | International Business Machines Corporation | Version independence for object oriented programs |
US5613120A (en) * | 1994-10-20 | 1997-03-18 | Silicon Graphics, Inc. | System and method for enabling, without recompilation, modification of class definitions and implementations in an object-oriented computer program |
US20070038988A1 (en) * | 2005-08-09 | 2007-02-15 | Dibyendu Das | Method and apparatus for providing class hierarchy information for function devirtualization |
CN1949175A (zh) * | 2006-11-03 | 2007-04-18 | 北京飞天诚信科技有限公司 | 一种对软件中的数据进行替换的方法 |
CN102023854A (zh) * | 2009-09-18 | 2011-04-20 | 上海智问软件技术有限公司 | 一种基于模板的语义变量抽取方法 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6978450B2 (en) * | 1999-01-15 | 2005-12-20 | Hewlett-Packard Development Company, L.P. | Method and system for optimizing compilation time of a program by selectively reusing object code |
CA2262316A1 (en) * | 1999-02-22 | 2000-08-22 | Ibm Canada Limited-Ibm Canada Limitee | System and method for detecting release-to-release binary compatibility in compiled object code |
JP2002108625A (ja) | 2000-09-26 | 2002-04-12 | Toshiba Corp | 言語処理装置及び言語処理プログラムを格納した記録媒体 |
JP2002215451A (ja) | 2001-01-17 | 2002-08-02 | Hitachi Software Eng Co Ltd | データ構造の動的管理方法およびクラスオブジェクト |
US7665075B1 (en) * | 2004-03-17 | 2010-02-16 | Sun Microsystems, Inc. | Methods for sharing of dynamically compiled code across class loaders by making the compiled code loader reentrant |
US7587612B2 (en) * | 2005-06-30 | 2009-09-08 | Intel Corporation | Generating and communicating information on locations of program sections in memory |
US8291395B2 (en) * | 2006-03-31 | 2012-10-16 | Apple Inc. | Fast function call dispatching |
-
2009
- 2009-09-25 CA CA2678095A patent/CA2678095C/en active Active
-
2010
- 2010-09-22 WO PCT/CA2010/001504 patent/WO2011035431A1/en active Application Filing
- 2010-09-22 CN CN201080042419.3A patent/CN102511033B/zh active Active
- 2010-09-22 US US13/496,040 patent/US8813045B2/en active Active
- 2010-09-22 JP JP2012530061A patent/JP5506936B2/ja active Active
- 2010-09-22 GB GB1204883.1A patent/GB2488254B/en active Active
- 2010-09-22 DE DE112010003774T patent/DE112010003774T5/de not_active Ceased
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5339438A (en) * | 1991-12-12 | 1994-08-16 | International Business Machines Corporation | Version independence for object oriented programs |
US5613120A (en) * | 1994-10-20 | 1997-03-18 | Silicon Graphics, Inc. | System and method for enabling, without recompilation, modification of class definitions and implementations in an object-oriented computer program |
US20070038988A1 (en) * | 2005-08-09 | 2007-02-15 | Dibyendu Das | Method and apparatus for providing class hierarchy information for function devirtualization |
CN1949175A (zh) * | 2006-11-03 | 2007-04-18 | 北京飞天诚信科技有限公司 | 一种对软件中的数据进行替换的方法 |
CN102023854A (zh) * | 2009-09-18 | 2011-04-20 | 上海智问软件技术有限公司 | 一种基于模板的语义变量抽取方法 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106233251A (zh) * | 2014-04-22 | 2016-12-14 | 甲骨文国际公司 | 元数据驱动的动态具体化 |
CN106233251B (zh) * | 2014-04-22 | 2019-12-31 | 甲骨文国际公司 | 元数据驱动的动态具体化 |
Also Published As
Publication number | Publication date |
---|---|
DE112010003774T5 (de) | 2012-10-04 |
CN102511033B (zh) | 2014-09-03 |
JP5506936B2 (ja) | 2014-05-28 |
CA2678095A1 (en) | 2009-12-02 |
CA2678095C (en) | 2012-05-01 |
GB2488254B (en) | 2017-02-08 |
GB2488254A (en) | 2012-08-22 |
US8813045B2 (en) | 2014-08-19 |
JP2013506171A (ja) | 2013-02-21 |
WO2011035431A1 (en) | 2011-03-31 |
GB201204883D0 (en) | 2012-05-02 |
US20120174080A1 (en) | 2012-07-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP3143500B1 (en) | Handling value types | |
JP4794437B2 (ja) | 編集処理中にプログラムコンポーネントの整合性を表現しチェックするための拡張型システム | |
TWI533217B (zh) | 用於運行時間系統的電腦實施方法及電腦可讀取儲存記憶體 | |
KR101159310B1 (ko) | 직렬화 방법 및 이 방법을 구현하는 컴퓨터 실행가능 명령어가 저장된 하나 이상의 컴퓨터 판독가능 저장 매체 | |
CN108139896A (zh) | 扩展虚拟机指令集体系架构 | |
WO2001065364A1 (en) | System and method for common code generation | |
US9164735B2 (en) | Enabling polymorphic objects across devices in a heterogeneous platform | |
US20040268301A1 (en) | Adding new compiler methods to an integrated development environment | |
US20040003377A1 (en) | Converting byte code instructions to a new instruction set | |
US20170235473A1 (en) | Method and Apparatus for Loading Application Program View, and Electronic Terminal | |
CN102511033A (zh) | 对象级别兼容性和使用语义值的类大小调整 | |
CN102388363B (zh) | 电子器件及执行虚拟机中指令的方法 | |
CN113791870B (zh) | 一种WebAssembly虚拟机分布式系统细粒度迁移方法及系统 | |
CN102662772A (zh) | 多语言开发系统中实现不同语言间数据通信的方法 | |
CN101620573A (zh) | X86体系结构内存管理单元虚拟化方法 | |
US20030074656A1 (en) | Program execution apparatus and method, computer program for performing the program execution method, image forming system, and address solution method | |
JPH03229352A (ja) | プログラム変更方法 | |
JP6905128B2 (ja) | 情報処理装置、情報処理方法およびプログラム | |
EP1678607B1 (en) | Mapping of dynamic link libraries in a computing device | |
JP2006260281A (ja) | スクリプト生成プログラムおよびバッチ実行システム | |
WO2024134838A1 (ja) | 呼出形式変換装置、plcプログラミング装置、呼出形式変換プログラム、及び記録媒体 | |
US6941549B1 (en) | Communicating between programs having different machine context organizations | |
JP2016051235A (ja) | マイグレーション支援装置 | |
JP3682050B2 (ja) | 組込みソフトウェア開発装置 | |
US11397542B1 (en) | Reducing RAM usage in a runtime environment |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |