将本机函数内嵌到编译的Java代码中的方法和系统技术方案

技术编号:2850494 阅读:182 留言:0更新日期:2012-04-11 18:40
提供了用于将本机函数内嵌到编译的Java代码的方法、装置、和计算机指令。本发明专利技术提供了用于将本机函数的中间表示转换为即时(JIT)编译器的中间表示的转换引擎。使用所转换的中间表示,内嵌器将所转换的JIT编译器的中间表示递归地内嵌到本机调用点,以消除调用该本机函数以及由该函数进行的随后的本机调用的需要。该内嵌过程继续进行,直到遇到对不透明函数的调用,或直到达到了JIT编译器中间表示增长极限。内嵌器也将对大多数不可内嵌的或透明的本机函数的调用替换为对合成的本机函数的调用,所述合成的本机函数提供了对包含原始不可内嵌调用的实现的本机库的访问。

【技术实现步骤摘要】

本专利技术涉及改进的数据处理系统。具体地,本专利技术涉及数据处理系统中的Java本机函数。更具体地,本专利技术涉及在数据处理系统中将Java本机函数调用内嵌(inline)到编译的Java代码中。
技术介绍
Java是一种面向对象的编程语言和环境,其专注于将数据定义为对象以及可应用于这些对象的方法。Java仅支持单继承,这意味着每个类在任何给定时间仅能从一个其他类继承。Java也允许创建被称为接口的完全抽象的类,这种类允许定义可与若干类共享的方法,而不管其他类如何处理这些方法。Java提供了分发软件和扩展Web浏览器的能力的机制,因为程序员能编写小应用程序一次,而该小应用程序能在Web上的任何Java使能的机器上运行。Java虚拟机(JVM)是一种仅存在于存储器中的虚拟计算机组件。JVM允许Java程序在不同平台上被执行,而不是仅在为其编译代码的一个平台上被执行。Java程序是为JVM编译的。以这种方式,Java能够支持用于很多类型的数据处理系统的应用,这些数据处理系统可包含多种中央处理单元和操作系统体系结构。为了使得Java应用能在不同类型的数据处理系统上执行,编译器通常生成一体系结构中性的文件格式—编译的代码可在很多处理器上执行,倘若存在Java运行时系统的话。Java编译器生成非特定于具体计算机体系结构的字节码指令。字节码是由Java编译器生成并由Java解释器解释的独立于机器的代码。Java解释器是JVM中的交替地解码和执行一个或多个字节码的模块。这些字节码指令被设计为易于在任何机器上解释,并易于被动态地(on the fly)转换为本机机器码。可使用开发环境,例如可从Sun Microsystems公司获得的Java开发工具包(JDK),来从Java语言源代码和库构建Java字节码。可将这种Java字节码存储为Web服务器上的Java应用或小应用程序,可通过网络将该Java应用或小应用程序从该Web服务器下载到用户的机器并在本地JVM上执行。Java运行时环境被特别设计为限制Java应用可能对它运行于其上的系统造成的损害。这对于万维网尤其重要,在万维网上当用户访问包含Java小应用程序的网页时,Java小应用程序被自动下载和执行。一般说来,人们不想执行任意的程序;它们可能包含病毒,或者它们甚至可能本身就是潜在恶意的,而不仅是无意地携带了不受欢迎的代码。除非用户特别地允许它(通过设置到JVM的用户接口中的适当标志),Java小应用程序不能向附加的存储设备(除非可能向一特定的、受限制的区域)读或写,它也不能向存储器位置(除非向一特定的、受限制的区域)读或写。不仅Java小应用程序是为通过网络下载设计的,标准的Java库也特别地支持客户机-服务器计算。Java语言包括用于多线程和用于网络通信的规定。与其他语言(例如C)相比,编写这样的一对程序更容易得多,一个程序在用户的计算机上本地执行并处理用户交互,另一个在服务器上远程执行并可能执行更复杂和处理器密集的工作。尽管Java语言被设计为是独立于平台的并主要在安全环境中执行,程序员可通过Java本机接口(JNI)使用C风格的调用约定来使用主机操作系统上的编译的本机二进制代码,从而扩展Java应用。以这种方式,Java应用可具有对主机操作系统的完全访问权,包括对附加的I/O设备、存储器等的读或写。由于此,Java程序可以成为特定于平台的代价完成通过JVM通常不允许的任务。然而,使用设计良好的体系结构,Java语言程序员可干净地将独立于平台的部分隔离,并向其他Java组件呈现一干净的、独立于平台的对象API,而同时完成特定于平台的任务。当在编译的Java代码中通过JNI调用本机函数调用时,涉及到开销。例如,必须在运行时进行工作以便为进行调用准备该调用。一般而言,必须在调用本机函数时或之前加载包含该本机函数的本机库。也必须在运行时系统中解析(resolve)本机函数,并且必须更新相关的JVM数据结构以指示该本机函数的使用。此外,JVM也必须根据底层操作系统体系结构的函数调用约定设置本机栈和/或寄存器,并对引用自变量执行空检查(null-checking)。对于某些JVM,还需要进行设置以添加用于垃圾收集的信息。在从本机代码返回时,在将来自于本机代码的返回值返回到Java运行时环境后,必须恢复所使用的栈和/或寄存器。已做出了若干尝试来最小化调用本机函数的开销。最初的尝试是基于程序员的最优化,这种最优化将责任加于应用程序员,要其在编写使用本机函数的Java代码时实施高效的编码技术。例如,批处理本机调用,并且每函数调用向本机代码传递尽可能多的数据,从而可能减少Java程序中的边界跨越。另一种最小化开销的尝试涉及限制在本机代码中提供的功能的类型。例如,回避构造本来会存在于调用栈上的本机调用帧(call frame)之前的特殊的包装器(wrapper)代码的机制。然而,这种机制只能用于那些被保证不会要求包括垃圾收集、异常处理、同步或安全性的栈遍历(stackwalking)支持的方法,因为所述垃圾收集等是包装器代码帮助提供的服务。在又一种最小化开销的尝试中,执行工作以通过将字节码映射到低级的汇编语句来将非管理的存储区引入JVM。使用对非管理的存储区的高速访问,可实现共享存储段、存储器映射文件、通信和I/O缓冲器、和存储器映射硬件。然而,这种尝试不会识别和映射长而复杂的字节码序列,或将映射应用于虚拟方法调用,因为代码映射不能处理动态类加载。尽管上述尝试最小化了本机函数调用的某些开销,每种尝试都有其自己的缺点。因此,有利的将是具有一种改进的目标为最优化本机函数调用的方法、装置、和计算机指令,以便最小化开销。
技术实现思路
本专利技术提供了用于将本机函数内嵌到编译的Java代码的方法、装置、和计算机指令。当检测到Java程序中的本机函数调用时,使用由本专利技术提供的转换引擎来将该本机函数的中间表示转换为即时(JIT)编译器中间表示。接着,由一JIT编译器内嵌器将该即时编译器中间表示内嵌到Java本机调用点(callsite),并且包含在该内嵌的代码中的任何本机调用也被递归地内嵌。如果在内嵌时内嵌器确定达到了即时编译器增长极限,进行对一不透明函数的本机调用,或者在本机函数实现中不存在另外的本机函数调用,则递归内嵌过程终止。不透明函数是即时编译器不能为其生成中间表示的函数。所述转换引擎通过在本机函数的中间表示(其由高级语言编译器产生)进行迭代并为该中间表示中的每个指令生成一即时编译器中间表示来转换该中间表示。所述本机函数的中间表示是从包含该本机函数的本机二进制代码和中间表示两者的本机库中检索的。响应于确定该本机函数调用不是针对不透明函数的,内嵌器使用所述中间的即时编译器中间表示将该本机函数调用替换为该本机函数的实际实现,并具体化(materialize)一JNI环境指针并将该指针传递给该本机函数调用的实际实现。响应于确定该本机函数调用是针对不透明函数的并且该本机函数调用不代表从Java到一本机函数的调用,则内嵌器合成到一Java可调用函数的新的调用,该Java可调用函数的用途是调用该本机函数,并将该原始的本机函数调用替换为对该合成的本机函数的调用,其中该合成的本机函数提供了对包含该不本文档来自技高网
...

【技术保护点】
一种在数据处理系统中用于将本机函数内嵌到编译的Java代码的方法,该方法包括:检测到在Java调用点处的本机函数调用;将本机函数的中间表示转换为即时编译器中间表示;以及将该即时编译器中间表示内嵌到该Java调用点中。

【技术特征摘要】
US 2005-2-18 11/062,2931.一种在数据处理系统中用于将本机函数内嵌到编译的Java代码的方法,该方法包括检测到在Java调用点处的本机函数调用;将本机函数的中间表示转换为即时编译器中间表示;以及将该即时编译器中间表示内嵌到该Java调用点中。2.根据权利要求1的方法,其中所述内嵌步骤被递归地执行,直到发生以下情况之一确定达到了即时编译器增长极限,其中该即时编译器增长极限指示可内嵌多少本机函数以便限制对指令高速缓存的负面副作用;确定所述本机函数调用是针对不透明函数的;以及确定在本机函数实现中不存在另外的本机函数调用。3.根据权利要求1的方法,其中所述本机函数调用是使用Java本机接口被调用的,并被递归地内嵌,从而内嵌的本机函数包含的任何本机调用也可随后被内嵌。4.根据权利要求1的方法,其中所述转换步骤包括在所述本机函数的中间表示中进行迭代;以及为该本机函数的中间表示中的每个指令生成即时编译器中间表示,其中该本机函数的中间表示是从包含该本机函数的本机二进制代码和中间表示的本机库中检索的。5.根据权利要求1的方法,其中所述内嵌步骤包括确定所述本机函数调用是否是针对不透明函数的,其中对该不透明函数的调用调用即时编译器不能为其呈现中间表示的过程;如果该本机函数调用不是针对不透明函数的,则使用所述即时编译器中间表示将该本机函数调用替换为该本机函数调用的实际实现;以及具体化本机接口环境指针,并使该指针对该本机函数调用的实际实现可用。6.根据权利要求5的方法,还包括如果所述本机函数调用是针对不透明函数的,则确定该本机函数调用是否代表从Java到本机函数的调用;如果该本机函数调用不代表从Java到本机函数的调用,则合成Java可调用本机函数,并将该本机函数调用替换为对该合成的本机函数的调用,其中该合成的本机函数提供了对包含该不透明函数的实现的本机库的访问;以及如果该本机函数调用代表从Java到本机函数的调用,则确定该本机函数调用是否是启动整个内嵌过程的原始函数调用。7.根据权利要求6的方法,还包括如果所述本机函数调用是启动所述整个内嵌过程的原始函数调用,则恢复即时编译器处理;以及如果该本机函数调用不是启动该整个内嵌过程的原始函数调用,则将该本机函数调用的中间表示转换为即时编译器中间表示。8.根据权利要求1的方法,其中所述即时编译器中间表示在所述转换步骤后被即时编译器随后当作Java字节码。9.根据权利要求5的方法,其中所述内嵌步骤还包括将参数映射为自变量;以及合...

【专利技术属性】
技术研发人员:AH基尔斯特拉LS斯特帕尼安KA斯图德雷
申请(专利权)人:国际商业机器公司
类型:发明
国别省市:US[美国]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1