我的手机丢了,只好再买一个,西门子的M55,彩屏的,还支持Java,才1000多元。现在的手机真便宜很多了。
这手机支持Java,不错呀。我下载了很多Java的应用、游戏,比原来一成不变的手机好玩多了。后来想,何不试试自己给手机写点Java呢。
很多年前玩过Java的,觉得一般般,但是速度特慢,于是搁置很多年了。当然也对java有了点认识。始终觉得Java还是有很多缺点,不会成为c/c++一样的垄断地位(它的发明者和拥趸号称会这样的)。
反正这么多种编程语言,其实也差不多。现在重新捡起Java也不难。我安装了Borland JBuilder, 下载安装了Siemens Moblie Toolkit(SMTK),照着例子写吧。最初写了个时钟程序,运行起来不错哦。
于是想玩点复杂的,来点全屏作图的吧,比如Mandelbrot Set, Game of Life等比较好玩的。可是遇到点问题了。Java作图用到的Graphics对象,居然没有直接画点的命令,网上论坛问了,就是这样,那只能用drawLine来代替了。而且全屏幕每个点,只能一个个点子当做一根根线条来画,所以,这速度就很慢了。实际测试下来,竟然画一个屏幕要约8秒钟。
但那些Java游戏运行可绝没有这么慢的,肯定是还没有发现正确的画屏幕的方法。后来仔细看SMTK,发现果然其中对游戏开发、作图等提供西门子特定的类库,用这些就可以高效率作图,并方便按键输入、前景背景作图等功能的实现。
回顾这种情况,果然印证了我对java的一贯看法。完全通用的Java很难,因为每种硬件平台都不同,为了发挥每个特定硬件平台的特性,不同厂商和硬件的java肯定会为他们自己的Java提供特制的类库,以帮助发挥本硬件的特色功能,或者高效率的运行速度。但同时,这样也就丧失了Java的通用性。这样开发出来的Java只能用在这种特定的平台上了。
我的Java编程在继续,在一个算法中需要实用浮点数,并对浮点数有开平方根运算。查资料开平方根的函数是Math.sqrt(),但我打Math.,发现提示的只有min, max, abs等简单几个,硬输入sqrt,编译当然通不过。后来经网友指点,说手机上的java环境j2me没有浮点数,更没有开平方根这种函数,要用的话只能自己写。当时吃惊,我还没碰到过不支持浮点数的编程语言环境呢。于是自己用牛顿叠代法实现了开平方根的函数,但数据类型还是double的。编译通过,下载到模拟器一运行,不行了,报错说有至少一个累找不到。我明白了,这类显然指double类了。
可能j2me在设计的时候,考虑到移动设备往往性能弱小,速度、空间等都有限,所以象浮点数、专用数学函数等都没有实现进去。我可以理解J2me的这种现实。
但反过来想想呢?如果一个使用了浮点数的java应用要移植到手机等这样的j2me平台上,会怎么样?当然是不能运行。一定要移植,也可以呀,改程序,自己写个浮点数类库,加入到程序。可这样以来,java的通用性不是又落空了吗?
我现在明白了,这Java号称的通用性,其实仅仅是指.class代码指令和格式上的通用性,都使用相同的Java CPU指令系统、内存管理等,可是仅仅这样是不够的。一个程序的运行,还需要操作系统的系统调用的支持,否则不等于脱离操作系统自己写裸代码了吗(比普遍意义上的汇编还低级)?
举个例子,同样是x86结构,我们可以运行流行的Windows,也可以运行Linux,甚至比较少见的Sco Unix, BeOS等等。这些操作系统上的应用软件,都使用的是x86 ia32指令系统,但通用吗?能将Windows下的随便什么exe程序拿到 Linux下直接运行吗?显然不行。因为Linux根本不会提供Windows程序运行所需要的Win32 API运行环境。当然,可以在Linux下运行wine来模拟一个Win32环境,执行Windows软件。
我举这个例子,是要说明,程序的通用性,不是指令系统一致就可以了,还必需要统一的系统调用等运行环境。而Java虽然做到了执行系统的通用,但没有做到系统调用上的通用。Java为了适应不同的应用场合,自己就分出了j2ee, j2se, j2me等类别,不同类别下开发的软件就不能通用。而java划分这些类别,也是不得已,从移动设备、嵌入式系统到桌面PC、企业级服务器等的运行环境、实现功能差别实在太大,进行这样的划分是必需的。
好,就算同样的一个类别,比如j2me,还是有这样不通用的情况。西门子的手机为了发挥西门子自己的特性硬件,提供了西门子自己的类库;同样诺基亚也有自己的类库。使用这样不同类库写的程序,就不再通用了。那能不能不用这些特定类库呢?基本也可以,但缺点就是不能发挥每种手机的特长,实现运算、功能的效率可能还要低下很多。
写了这么多,就是整理一下思路,再来认识一下Java的通用性神话。
我也用的这款手机,我根本没兴趣去玩那些个游戏,简直慢死了。
开始用的时候还有很多问题出现,现在消条短消息反应都好慢,真是太差劲了,就更不用说去用什么java了,反正我也看不懂。