想象一下,你坐在一节最无聊的文学课上:有人在睡觉,有人在笔记本上画画,有人在 ICQ 上聊天,有人在玩《重力反抗》(Gravity Defied)的下一关,而你正在用索尼爱立信手机疯狂地敲击着,编写一个 Basic 程序,随机显示一位同学的名字和一些稍微令人不快的虚假事实。终于,最后的几行代码写完了,你运行程序并展示给同桌看,然后手机传到了下一排……到下课时,班里已经有半数人摩拳擦掌,准备给你一记重重的后脑勺,因为你搞了这样的恶作剧。但后果并不重要,重要的是那种兴奋感——因为你的移动开发之路才刚刚开始。
那是 2006 年。我们很多人还没有电脑,但有带小屏幕的手机,有限的互联网接入,以及大量想要用来实现某个想法的空闲时间。Mobile Basic
移动开发之父可以说是 David Firth——Mobile Basic 的创造者。即使这不是世界上第一个允许在手机上编程的应用程序,但它显然被广泛使用。Mobile Basic 拥有丰富的命令集:算术和字符串操作、日期和时间处理、RMS(应用内部存储)的读/写、用户输入(字符串和按键)、表单输出,以及在 Canvas 上绘图。但这并不总是正常工作:表单有时会导致第五代索爱手机重启,而 Canvas 在所有手机上都会闪烁。

程序输入是基于 Canvas 的方式,这意味着没有 T9 和剪贴板,因此在其他编辑器中输入文本、保存为 .lis 文件然后在 Mobile Basic 中打开会更容易。如果出现错误,你必须返回到另一个应用,修复错误并重复该过程,因为当时的手机无法将应用最小化到后台并打开另一个。然而,由于缺乏替代方案和丰富的功能集,Mobile Basic 受到了普遍欢迎。
Mobile Basic 还有另一个缺点:

作者只允许使用该应用 30 次,并要求 20 英镑(约 26 美元)来解除限制,尽管后来降到了 5 英镑,但我们没有支付能力。
当然,通过简单的重新安装程序很容易绕过限制,但这很麻烦。当时,民间高手(Bloodmage)找到了破解方法,并在翻译版本中直接提供了成功注册所需的数据,此外还添加了西里尔字母输入支持。

当时的最新官方版本是 Mobile Basic 1.8。移动 Basic 用户社区不断壮大,在知名论坛上出现了相关主题。有时甚至一个主题都不够,必须创建单独的主题:Mobile Basic 问题、Mobile Basic 游戏和程序等。还出现了 MBTeam 网站,聚集了当时相当可观的粉丝群体。举办了编程和游戏开发竞赛,其中移动 Basic 游戏经常让在 PC 上使用 MIDlet Pascal 或 Java ME 创建的游戏相形见绌。那些记得 Keitaro 和 Vapigor 的杰作的人会证实这一点。
然后 Mumey 来了,他反编译了 Mobile Basic,成功使获得的源文件可编译,并开始改进程序。Canvas 输入被改为表单,添加了正常的启动菜单、文件系统操作、可以向编译的程序添加资源等功能。
还有一个第五代索爱手机重启的问题,这是由于制造商在表单中的 wait/notify 同步 bug。如果显示表单时调用此代码,会导致重启:
123
| synchronized(someObject){someObject.notify();}
|
这时我提供了帮助,虽然不是从源代码,而是通过编辑字节码。就这样,Mobile Basic 发展到了版本 1.8.6.2,并在很长时间内停留在这个版本。
MobilePascal
CPU 的 MobilePascal 可以说是第一个来自独联体开发者的移动编程语言。不要与 MIDlet Pascal 混淆,那是 PC 程序。像 MB 一样,MP 具有算术、表单、图形功能,甚至具有系统功能,可以拨打电话和发送短信。不幸的是,该程序的关键缺点是它严重针对西门子手机 API,因此即使在尝试移植后,应用也无法在其他手机上运行。尽管如此,许多人都有西门子手机,这种编程语言也有其受众。我见过几个用 Mobile Pascal 编写的优秀实用程序。
ClassEditor
除了在手机上编程,我们还从事 class 文件中的字节码研究。基本上,我们完全不是从通常教授 Java 的角度来学习它。dzanis 的 ClassEditor 是一个专注于编辑类的十六进制编辑器。除了十六进制编辑器标准的数制转换和按字节/字符串搜索功能外

ClassEditor 还有一个反汇编器:

在大多数情况下,我们只是通过更改常量池中的字符串来翻译程序。有时我们会修改游戏,添加无限生命或立即解锁的关卡。我们还会修复操纵杆按键代码,使针对一种手机品牌适配的游戏在另一种手机上正常工作。反汇编器非常有帮助,可以检查一切是否正确,节省时间。否则,就必须将编辑后的 class 文件从手机放入存档,重新安装程序并看到应用错误。
dzanis 不仅是这个程序的作者,还乐于与我们分享字节码知识,提供示例和任务。
LM
也有尝试创建自己的编程语言。第一个可能是 V.E.A. 的 LM(Language for Mobile phones)。
作者开始开发时,Mobile Basic 还没有西里尔字母输入,因此他的编程语言旨在解决这个问题。但随后 MB 发展非常快,V.E.A. 决定将 LM 重新定位为第一个带有俄语命令的手机编程语言。
LM 代码示例(取自作者自己的文档):
123456
| { цвет 100,100,255 стиль жирный надпись "Привед медвед!",%1,%2 нарисовать}
|
TextCompiler
我们还有编译器。Counter 的 TextCompiler 是一个独特的项目,因为它允许将改进的 Basic 风格代码(不存在的 1.8.7 版本)转换为移动 Basic 1.8.6 的代码。而且该程序是用……Mobile Basic 1.8.6 编写的。
TextCompiler 没有强制命令编号,但有标签、带局部标签的块,可以连接多个源文件,通过指令将所有内容保存到临时文件(某种预处理器)。
1 2 3 4 5 6 7 8 910111213141516171819
| @inp:INPUT"X=?",X%IFX%<0THENGOTO@lessIFX%>0THENGOTO@greaterPRINT"X=0":END@less:IFX%=-100THENGOTO100PRINT"X<0, X<>-100"END100PRINT"X=-100":END@greater:IFX%=100THENGOTO100PRINT"X>0, X<>100"END100PRINT"X=100":END
|
程序运行速度不是很高,而且在访问文件系统时必须确认访问权限,因此 Counter 为了方便还在每次此类请求之前添加了声音播放(这是可配置的)。
Jasmin Java Assembler
尽管 Mobile Basic 很受欢迎,但 Basic 被认为不适合初学者,因为它没有面向对象思维,而且习惯了 GOTO 后,很难过渡到现代语言。因此社区的一部分人转向了 Java。
于是 Mumey 移植了 Jasmin 和 ProGuard 的预验证器,我们开始更深入地学习 Java 字节码,并尝试直接用它编写程序。
当然,我们不是从头开始编写,而是使用现成的示例或反汇编现有的 class 文件,幸好 Mumey 几乎立即制作了反汇编器。
Online Java Compiler
Counter 不仅作为 TextCompiler 的作者而闻名,还作为 php 编译和预验证源代码的 Web 服务 java2class 的作者。你可以从浏览器上传源代码,等待 2-5 分钟,获得编译和预验证的类。如果编译失败,可以看到编译器错误列表。
对于那个时代,这是一个非常好和高质量的服务,甚至可以说不逊色于用于创建 Java 组合的服务。
不幸的是,该服务经常迁移到其他域名,很快 Counter 本人消失了,之后最后一个已知实例也过期了,甚至在 Web 存档中也没有留下痕迹。
Janino
Mumey 没有停留在 Jasmin 上,很快移植了 Janino 编译器。不可能的事情变得可能了。这是一个突破,因为现在我们拥有在手机上用 Java ME 编程所需的一切。

Jcc
Jcc 是 J.Peter 的编程语言和虚拟机。它有三个版本:前两个更像 C,第三个像 Java。解析器是在 JavaCC 中生成的并适应了 Java ME。这里的代码编辑器是自己的(比 MB 方便得多),带有语法高亮——J.Peter 将 Jane 编辑器开发为单独的程序,在这里只是嵌入了开发成果。
到第三版本,Jcc3 获得了良好的工具,包括元类生成器(Jcc 的 API)和单独的运行时,将程序字节码放入其中就得到了自己的应用。
尽管作者投入了巨大的资源,该语言并没有获得大量粉丝。但 Jcc 可以用作程序,在其中轻松编写某个算法并在运行时检查其工作,然后将代码转移到 Java 并用 Janino 编译。
J2ME SDK Mobile
进步没有停滞,手机变得越来越强大,用户需求增长,但我们绝对没想到 Mumey 会制作 IDE。尽管如此,作者将带语法高亮的编辑器、编译器、预验证器和 jar 打包器合并到一个程序中,该死的,这一切都在 RAM 约 1MB 和存储约 32MB 的手机上运行!
该应用的一个非常酷的功能是使用 MIDP 2.0 API 自动启动。首先,你打开文件,编辑源代码,当你按下 Compile 时——程序保存所有编译参数,将自己设置为下一分钟的自动启动(需要用户许可)并关闭。然后按定时器启动并开始编译。此时 RAM 已不再被编辑器占用。编译后,过程重复:再次定时器、关闭、预验证模式自动启动。最后,再次进行 jar 打包。



MobPascal
当时 PC 上的 MIDlet Pascal 已经获得了大量粉丝、库和示例,因此 P@bloid 尝试创建移动版本,重复其语法并与大哥的库兼容。就这样出现了 MobPascal。

它具有来自 Jcc 的带语法高亮的编辑器,编译成单个 class 文件,然后需要通过 Mumey 的预验证器运行。项目的成功被严重的编译错误所阻碍:比小型演示更复杂的东西可能无法正确编译,预验证器或手机本身都会拒绝与编译的程序一起工作。
很快 P@bloid 放弃了开发,发布了源代码,Vasiliy_LiGHT 和 vl@volk 继续修改,添加了库支持并修复了微小的错误。
Mobile Basic 1.9
当一些人从手机上征服 Java ME 的高峰时,另一些人继续发展 Mobile Basic。
David Firth 发布了 1.9 版本,只添加了一个功能。同时,1.8 版本中的所有问题仍然存在。但是 Firth 开放了源代码,于是 kiriman 基于这些源代码和反编译的 1.8.6.2 版本(Mumey 没有开放他的版本的源代码)开始进行修改。后来 dzanis 加入(是的,就是他)。他们一起优化了解释器速度,删除了浮点数的软件模拟(在 CLDC1.1 规范中 float/double 早就有了),并重绘了图形,结果修复了 Basic 最古老的问题——游戏中的闪烁。
然后 vl@volk 和 garfild63 接手了修改,添加了更多命令和修复。
Mobile Eclipse JDT
来自菲律宾的开发者 Assembler 将 Eclipse JDT 的编译器移植到 Java ME。外表上,该程序类似于 Janino,只是重量超过 800KB 且没有优化,因此只能在强大的设备上使用或编译非常简单的源代码。由于整个俄语社区习惯了 Janino 和 J2ME SDK Mobile,该程序仅用于测试或在紧急情况下,万一它能编译 Janino 无法编译的东西。
Mobile Basic 的附加工具
还有几个项目值得一提,它们影响了移动编程的进步。
grafmoto 的 RMSBackup
在 1.8.3 版本之前,Mobile Basic 无法保存到手机文件系统。当时找到了一个变通方法:将一个特殊的类放入所需程序的 jar 中,将其注册为第二个 midlet,启动时可以将应用内部存储(RMS)中的保存备份到文件,然后在需要时恢复。这是一个通用工具,被高级用户广泛用于游戏和应用中备份保存。
kiriman 的 MB Refactor
到 MB 1.9.1 版本时,Basic 的二进制 BAS 文件结构已经被彻底研究,所以这个小工具应运而生。它能够重命名变量、增加行步长、格式化源代码,以及进行混淆。后者是必需的,以免源代码被盗。

HoldFast 和 vl@volk 的 MB Compiler Online
在线转换器 bas 到 lis 及反向转换、混淆器和 jar 文件打包器,包括添加资源。支持版本 1.8.x 和 1.9.1。不仅从 PC 使用,还在弱手机上使用,当 RAM 不足以用图像编译游戏时。
MB IDE
这可能已经不属于手机上的移动编程,但这个项目值得一提。MB IDE 存在于三个版本中:MB IDE .NET。JGDger 的第一个版本MB IDE。HoldFast 的 Java SE 版本。语法高亮和错误行,能够使用版本 1.8.x 和 1.9.1,支持将程序打包为 jar 并在 MicroEmulator 模拟器中运行。后来还添加了在 Android 上的 Java ME 模拟器 J2ME Loader 下的打包。
HoldFast 的 php 在线 MB IDE。能够做 Java SE 版本的所有事情,只是在模拟器中运行。
特别感谢
实际上,不仅是上述应用程序的作者在发展移动编程。以归档器为例。没有它,就不可能打包 Mobile Basic 的游戏或向其中添加图片,也无法从程序/游戏中提取必要的文件进行后续修改,然后再添加回去。感谢:
kys
开发了 MiniCommander——带有出色归档器的文件管理器,在 Nokia、Motorola、Samsung 和其他品牌上运行良好。
Malcolm
开发了 PowerGrasp——zip/gzip/tar 归档器。主要在 Sony Ericsson 上使用。Malcolm 是索尼爱立信俱乐部论坛的明星,帮助初学者编程,包括我,因此我要特别感谢他。
Salat-Cx65
他提议将专门用于编程的程序的主题移至西门子手机俱乐部论坛的 Java ME 开发部分。他还是该部分的版主,提出想法并将我们联系成一个群体。他还是 Janino 的 beta 测试员。
上述论坛的所有常客
他们提出了实现有趣功能、编写手册、分享示例源代码并帮助解答问题。
MierivaL
提供了真实手机上的截图。
日落之后
日落之后是黄昏,天空中出现第一批星星。然后是夜晚,照亮天空的是无数这样的星星。我愿意相信,其中一些星星至今仍在闪耀。我愿意相信,那些通过手机学习编程的人中,有一部分达到了目标,至今仍是程序员。