股票代码:688047
请输入搜索条件
邮箱登录
点击图片刷新
忘记密码
点击图片刷新
06-02 2016

聊聊龙芯Java开源

2016-05-18 作者:敖琪
 
Java诞生至今已走过了20多个年头,作为编程语言中的老前辈,虽饱受争议却历久弥新。Java平台无关的特点在计算机设备愈发多样化的今天显得尤为重要,小到智能手表、大到云端服务器,都可以看到Java活跃的身影。Java虚拟机(Java Virtual Machine,简称JVM)作为Java的基石,是Java程序运行的基础,它消除了Java语言对底层硬件的依赖。
TIOBE Index过去14年的排名显示了Java语言的活力

一、龙芯Java简介
龙芯公司于2009年组建Java小组并开始进行Java虚拟机的研究和移植。基于OpenJDK,龙芯最初只是实现了OpenJDK 6的模板表解释器,但这却是在龙芯平台上第一次实现了具有较完整功能的Java虚拟机。之后,龙芯依次实现了OpenJDK 6 的C1编译器、OpenJDK 6的64位版本、OpenJDK 8的64位解释器以及C2编译器[1]。这些版本的Java虚拟机在龙芯的客户中得到了广泛的应用和反馈,通过不断的完善和优化,龙芯JVM最终达到了产品级的标准。
虽然龙芯JVM的基础是OpenJDK,但是一直以来龙芯公司并没有明确开放龙芯JVM的源代码。而现在信息化的竞争已经超出了单一系统软件性能比拼的范畴,更多是体现在生态链的建设上。另一方面,龙芯JVM的开源符合开源协议的要求。遵循自由软件世界的游戏规则并为之做出贡献,使更多的使用者和开发者收益是龙芯JVM的价值所在。因此,龙芯决定将其JVM开源,并希望能够加入到官方OpenJDK中成为MIPS分支,将龙芯多年的工作回馈给社区。
俗话说得好,丑媳妇早晚要见公婆,不怕代码不规范甚至漏洞百出,外界的压力正是龙芯JVM不断进步的动力。同时,加入社区意味着代码的开发和维护会更加规范,产品质量自然就会得到提升。归根结底,龙芯JVM希望通过开源的方式完善自己,为用户提供更好的产品。
二、为开源所做的准备
在开源之前,龙芯的Java研发团队进行了代码自查的工作,自查工作主要包括4个方面:龙芯专有指令和硬件支持,第三方代码,源文件的注释和版权信息,以及公共代码部分。
1.     龙芯专有指令和硬件支持
龙芯CPU对MIPS指令集进行了多种扩展并增加了很多特有的硬件支持[2],如果Java虚拟机使用了这些特性,需要在开源提交的代码中去除。文献[2]全面讲述了龙芯3号CPU新增的指令和硬件支持,以及使用这些支持优化二进制翻译等软件的方法。为了优化性能,龙芯JVM中也使用了一些专有指令和硬件支持,比如128位访存、CAM表、双基址寻址[3][4]等。这虽然给龙芯JVM带来可观的性能提升,但是也带来了兼容性的问题。龙芯此次开源最理想的目的是成为OpenJDK的MIPS分支,因此就要考虑同其他MIPS平台的兼容问题。在开源之前,龙芯去除了对这些专有指令和专有硬件的使用。未来可能会将这些优化以条件编译的方式添加回来。
2.     第三方代码
由于OpenJDK和SunJDK存在一些不兼容的功能,为了保证客户迁移工作顺利进行,早期龙芯的Java研发团队在移植的过程中,使用过一些Sun JDK以及第三方的源代码。这些代码有些涉及版权问题,被称为Encumbered Code,是不能提交至OpenJDK官方代码库中的,因此需要在开源代码中去除。经过此次代码自查,龙芯提交的代码不包含OpenJDK以外的第三方代码。而且,所有的代码修改均出自龙芯Java研发团队。这样,在龙芯签订了OCA(Oracle Contributor Agreement)协议之后,龙芯JVM在产权上已经符合提交至OpenJDK的标准。
3.     代码文件头部注释中的版权信息
OpenJDK是基于GPLv2协议的,该协议声明,对该协议下的代码进行过修改的公司或个人,需要在相应文件中加入修改声明。因此,自查工作还包括对龙芯JVM所有修改过的文件添加修改声明,并对所有新增的文件增加版权声明。
4.     与MIPS平台无关的公共代码修改
本次开源的首要目标是将龙芯在MIPS平台上的移植成果开放出去,以前龙芯修改过公共代码的一些Bug,这些修改与具体平台无关,本次先不提交。目前的原则是在功能上尽量和x86版本的OpenJDK一致,提交的代码量越少越好,这样才能缩短代码合并的周期。
经历了此番代码梳理和排查,龙芯JVM的源码具备了公布的条件。下表列出了准备提交的代码与官方同版本jdk8u25-b17的差别。
目录 增加文件(个数) 修改文件(行数)
jdk目录 1 6
hotspot目录 125 3574
顶层目录 0 18
其他目录 0 0
总计 126 3598
 
 
三、激动人心的开源时刻
2016年5月5日,龙芯Java研发团队将龙芯JVM源代码对外公布,并在OpenJDK的邮件列表里发布这一消息:

该消息一经发布,得到了包括OpenJDK Porters项目负责人、IcedTea项目负责人等国内外开发者的回应和好评,当然更重要的是收获了很多宝贵的建议:
“great to hear from yet another port and welcome to the OpenJDK!”
“I would like to see this port merged, as I believe it makes the whole of Java stronger. I also have a hobby interest in the MIPS platform.”
“Thank you for your announcement and sharing your valuable source code with the community.”
“Although I have not contributed to the tree myself, and am not an official member of the porters group, I have worked with large open source groups before, and can help guide you through the process or even help with grunt work.”
国内JVM领域领军人物之一的RednaxelaFX也在第一时间对龙芯开源的声明进行了转载和评论[5]

四、只是迈出了第一步……
要想最终被社区接纳,成为OpenJDK的MIPS分支,龙芯Java研发团队还有很多的工作要做、很长的路要走。正如OpenJDK的Porters项目负责人Dalibor Topic给龙芯的建议那样:
“…If that sounds like a lot of work, that is because it is a lot of work.”
说不定在未来OpenJDK的某个版本中,出现龙芯的贡献。梦想还是要有的,万一实现了呢!
附:如何获取龙芯JVM源代码
1. 安装版本库管理工具Mercurial(以Fedora为例)
# yum install mercurial
 
2. 下载代码
$ hg clone http://hg.loongnix.org/jdk8-mips64-public
$ cd jdk8-mips64-public
$ sh ./get_source.sh
3. 编译方法同官方相同,可参考源码目录下的README-builds.html文件
参考文献:
[1] http://wiki.loongnix.org/index.php/JAVA
[2] Hu W, Wang J, Gao X, et al. Godson-3: A scalable multicore RISC processor with x86 emulation[J]. IEEE micro, 2009 (2): 17-29.
[3] Cai S, Yang Y, Lin C, et al. JVM virtual method invoking optimization based on CAM table[C]//Networking, Architecture and Storage (NAS), 2011 6th IEEE International Conference on. IEEE, 2011: 122-129.
[4] Ao Q, Jin G, Su W, et al. Optimizing Memory Access with Fast Address Computation on a MIPS Architecture[C]//Networking, Architecture, and Storage (NAS), 2014 9th IEEE International Conference on. IEEE, 2014: 143-147.
[5] http://zhuanlan.zhihu.com/p/20853163

Copyright © 2008-2022 龙芯中科技术股份有限公司 京ICP备14017781号-1京公网安备 11010802035786 号

本网站由龙芯3C5000服务器提供强劲动力