en

聊聊龙芯java开源-网上捕鱼网络版

loongson news

栏目导航

聊聊龙芯java开源

发布时间:2016-06-03    已阅读:次

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