翻译“寿星天文历”有感

本来计划这周发布日期工具类DateUtil第四版的,但我在翻译“寿星天文历”的过程中,遇到了很多麻烦,加上还有工作要做,因此这周可能无法发布第四版了,无奈只能先来吐槽叙述下。

寿星天文历是许剑伟先生开发的一块精度极高的万年历,采用非常科学先进的天文算法和系列定律,并参考了大量古今农历数据和相关书籍,其最终的计算精度堪比刘安国教授制作的“日梭万年历”,但相比“日梭万年历”,寿星天文历计算未来几千年(9999年)的农历时间更为准确和具有参考价值,支持的查询范围更广(“日梭万年历”只能估算到2100年),并且最为重要的是寿星天文历是开源的!因此为我们程序员提供了一个非常好的工具!

然而寿星天文历是基于javascript语言开发,并无其他语言版本,所以才有了“翻译”之说。我要将javascript的代码翻译成java代码,起初以为工作量不会太大,但当我真正做起来后才发现,这是一个非常耗人耗力的大工作!

以前认为语言是一通百通的,但经历这次后,我才深深的认识到:根本不是这么回事。共通的只能说是基本语法和基本类型很相似,其他的很多时候都是不太一样的。而javascript和java更是在理念上有很多差异的,javascript是脚本语言,java是面向对象语言。举几个例子:

1. 计算

8/24。js结果是0.3333333333333333,,java结果是0

2. 类型

js是弱数据类型,java是严格的数据类型。var a;

变量a,可以看成是任何类型,而且类型还会根据赋值的类型不同而动态变化。而java就不是了,它有严格的类型区分,虽然可以通过Object类型去完成,但我相信大多数人是不建议这么做的。

3. 方法、变量代码的最大字节

java某一方法或变量支持书写代码的最大量是65535字节(就是某一方法或变量的代码超级多,注意我说的是书写的代码,而不是方法、变量本身支持的字节,例如List类型的变量可以有上亿的数组成员,但你无法将这上亿个成员一一用代码写出来一并赋给List,只能动态的赋值给List),这是JVM本身的问题,而js却没有限制。

4. substr

js中的substr与java的substring可不是一个概念。js的substr中的第二个参数代表的是截取长度length,而java的是结果索引endIndex。并且substr中的length超过字符串本身长度的话,则方法返回的是空串,但java的endIndex超过字符串长度的话就直接报错了。(其实js里也有substring,功能与java的类似,但仍然有不同)

5. 两个字符串的相等判断

js直接“==”即可,但java则是用equals方法

以上只是我列出的几点而已,这么多差异我事先并不是都知道的,虽然我也经常写js,但如此之多的不同,我也是今天才知道的,(吐槽一下,现在才发现自己以前写js其实还是以面向对象的理念去写的,翻译寿星天文历也让我对javascript语言有了新的认识),造成翻译过程中遇到了很多问题,我不得不参照javascript代码去一个个验证java代码,因为里面实在有太多的计算了,我必须检查计算精度。

再有,通过这次翻译,也同样增加了我对java语言的认识和理解,我发现浮点运算,double类型是有误差的,查阅资料才发现bigDecimal才是专门用来高精度计算的,虽然以前就知道一些,但现在才是“真明白”了

总而言之,言而总之,困难是遇到了,但我的心情却是愉悦激动的,也明白自己离“代码艺术大师”还有多远。

日期工具类,我会在近几天之内发布,由于double计算精度的问题,初版并没有大量的更改为bigDecimal(这也是工作量啊),只是将误差较大的计算更改为了bigDecimal类型,其余的虽有误差,但误差非常小,完全可以忽略不计(更何况算法本身就存在误差),所以日后如果我有时间再都改为bigDecimal吧。

你可能感兴趣的:(翻译“寿星天文历”有感)