苹果条约

UPDATE:

有位叫做Lee Brimelow的Adobe雇员,号称Flash传福音者(Evangelist)。我最开始知道他,还是因为那篇提醒你包括成人网站在内的许多站点都会因为iPad不能浏览flash而出问题的blog。此次他在最新的blog之中痛陈苹果的这一行为「扇了开发者的耳光」,并且在文末直截了当地用「Go screw yourself Apple」来结尾。虽然他的个人blog不会代表Adobe官方的反应,但是Adobe显然不会比他高兴到哪里去。

我始终认为,彼此不兼容的虚拟机标准越少越好,如果一定要有,应该是一个开放的、不属于任何人的标准。未来的web不应该被Flash / Silverlight / Java Applet这样的东西占据,如果一个浏览器必须装上七八个不同厂商的插件才能上网,该是多让人悲哀的一件事情。

按照Lee Brimelow的说法,不同意他的都不是真·开发者。好吧,看来我是个伪开发者。


为了使用iPhone OS SDK给iPhone或者iPad开发软件,程序员必须在安装之前接受iPhone Developer Program License Agreement这个协议。此前这一协议的第3.3.1节是:

3.3.1 — Applications may only use Documented APIs in the manner prescribed by Apple and must not use or call any private APIs.

翻译过来就是「应用程式只能按照苹果规定之方式使用官方API,并且不得使用或呼叫任何私有API」。

而刚刚发布的iPhone OS 4 SDK预览版则将这一节扩充为:

3.3.1 — Applications may only use Documented APIs in the manner prescribed by Apple and must not use or call any private APIs. Applications must be originally written in Objective-C, C, C++, or JavaScript as executed by the iPhone OS WebKit engine, and only code written in C, C++, and Objective-C may compile and directly link against the Documented APIs (e.g., Applications that link to Documented APIs through an intermediary translation or compatibility layer or tool are prohibited).

亦即「应用程式只能按照苹果规定之方式使用官方API,并且不得使用或呼叫任何私有API。应用程式必须原本以Objective-C,C,C++或者在iPhone OS WebKit引擎上执行的JavaScript写成,且仅有以C,C++和Objective-C写就的源代码可以编译并直接链接到官方API上(例如,通过一个转译中间层或者提供兼容性的中间层而链接到官方API上就不行)。」

用正常人(相对于程序员)的话来解释这一修改的意义就是,将来你若想给iPhone、iPad写个程序,就得用苹果规定的编程语言来写。世界上有多少种编程语言?数得出来的有超过五六百种。苹果允许你用几种?四种。而且其中三种的关系大致可以这么理解:C++和Obj-C是C向两个不同方向的变异、进化、升级版本,C是Obj-C和C++的始祖,也是两者的交集。如果你对自然语言学有点概念,这三种语言的关系很像拉丁语(C)、意大利语(Obj-C)和西班牙语(C++),不过这个类比最大的缺点在于拉丁语基本上死了,而C活得好好的。苹果允许你使用的第四种语言JavaScript——虽然名字里带Java这个字,但其实跟Java的联系并不比樱木花道和樱花的联系多——跟前面三种语言的差别相当大,最大的不同就是它只能在WebKit,也就是Safari用来把网页显示出来的组件上面运行。

这个规定非常有趣,因为在我的记忆里似乎还从没有什么人这样做过:用户很少、机能低下的冷门平台根本不必这么做,能有人愿意给它们开发程序就已经很不错了;而比较大众一点的平台都忙不迭地标榜自己的开放性,总结成四个字就是:任君调戏。呃,调试。看看诺基亚的S60就知道了:C++能跑么?能。Java能跑么?能。Flash (ActionScript) 能跑么?能。满足了?等等,你若觉得不够,它还能跑Python呢,而且如果你想写个能让XX语言也在上面跑的编译器,S60绝对欢迎。正常人都会试图提供更多选择以吸引开发者,而不是反其道而行之,将自己平台的开发方式加以严格限制。「我是个Java程序员,平生最讨厌的就是垃圾收集。你只让我用C++开发?那好,此地不留爷,自有留爷处。」——普通人是不希望开发者出现这样的想法的。

但乔先生不是普通人,iPhone也不怕没人开发程序。自iPhone发布伊始就有人哭爹喊娘的要给iPhone开发程序,没有SDK,自己黑一个出来也要做。看到粉丝的这种热情,教主决定让iPhone就此解禁,而一群人利用早先的SDK淘到第一桶金的成人励志故事,更是让诸多人打了鸡血一样投身到闯关App Store的独木桥上去。数量的增加往往会带来问题,其中之一就是质量的下降,这和世界上的很多事情都相通——比如,识字的人多了,书面语就会开始变得通俗,文言渐渐成了白话,后来连现代诗都变得人人会写,最终就产生了手机黄段子。

iPhone的问题是,当开发者变多之后,尽管有令人生厌的审核程序,App Store里还是挤满了垃圾应用。虽然这些应用没有android的market place里垃圾得那么纯粹,但仍旧是垃圾应用。这样的应用是怎么开发出来的呢?很大程度上是对于iPhone OS 的进一步「封装」和「转译」而来。请我的亲爱的忠实读者兼geek们回忆一下上一篇blog之中两个图灵机的视频。乐高图灵机和纸笔图灵机尽管工作原理不同,能完成的工作都是一样的:读0和1,并按照给定的规则写0和1。所以给乐高图灵机写的程序必然能转换给纸笔图灵机执行,反之亦然。这种性质叫做图灵等价,而各种计算机语言其实就是一台台看不见摸不着的图灵机,只是构造不同、理念不同、效率不同、封装点不同而已。所以我们可以做这样的事情:将一种计算机语言翻译成另一种,就像自然语言一样,一切可以说的,用各种语言都可以说。一切不可说的,我们应该保持沉默。不过,一如自然语言中从甲语言翻译到乙语言的过程总是会丢失一些东西,从别的语言转译,乃至用别的技术「自动生成」到iPhone OS上所产生的程序,通常会比较烂,尤其是那些对编程者的要求不高的搭积木式的工具。所以苹果此一限制的目的,实际上就是明确地说,为了保证原生程序的质量,请用原汁原味的苹果认可技术。为了不让其他更加流行但是容易质量低下的技术在iPhone os上出现,java和flash这样的翻译官也都当作汉奸,一律驱逐出境。你想开发Web应用,就用有标准,不受控的HTML 5和JavaScript。

一时间开发者界对此议论纷纷。有些人觉得老乔很过分,摧毁了一些他们喜欢的东西,或者干脆认为他疯了。但是最为中肯的评价,我觉得还是来自这一条文更动的发现者,以及这位文笔犀利的仁兄。如果你没什么编程经验,也不必去看了,只需要知道,这两位都觉得老乔这么做,没什么不对。