苹果公司推出了一个新的 Mac/iOS 应用开发语言——Swift。以下是一个门外汉对此的理解。 对于Swift编程语言的兴奋劲逐渐消散之后,早上我醒来后在《纽约时报》看到了Farhad Manjoo的推文,他非常好奇,为什么还有人会需要新的编程语言。
I would love to read a somewhat but not extremely technical article on this question: Why are we still seeing new programming languages?
如今计算机已经普及到各个领域,我们拥有的计算机语言难道还不够用吗?最简单的答案就是:不够。只要有人想学新语言,我们就会开发新语言。这么做的原因很简单,而且能让反对机械自动化的人都可以接受。(向我们的Node.js项目中的高手Chris McClellan致敬,他和我讨论了这个话题。)
教人编程 如果这个问题可以看做”先有鸡还是先有蛋”的问题,那么我们先从蛋开始。许多语言(譬如我接触的第一个语言,BASIC)的开发初衷是为了将编程概念简单化,好让初学者、爱好者甚至所有人都能掌握。计算机实际上是以二进制代码在“思考”。这个说法的理由很简单:如果你将下达给机器的指令都用“是”或“否”(分别用1和0来表示)的问题来表达,那么计算机是不可能将事情搞得一团糟的(当然,如果你的代码有错的话另当别论)。这个天才的想法是一个名为克劳德·香农的人想出来的,他在二战后认识到无线电信号在传输重要信息的时候非常地不可靠,这些信息现在你可能会交给计算机来存储或者处理。
自二进制代码以后,几乎每种的语言都是为了让人们可以简易可靠地读写机器指令而存在的。如果要人用冗长的二进制来写这些指令的话,他们会无聊到自抠双目的。(譬如大写字母A,用二进制代码表示的话,是01000001。小写字母a是01100001。因此,这样写一个单词就得花不少时间,更不用说一般的程序都得有成千上万行的代码了。)
如果某种语言使用了大量的通俗英语单词而简单易读的话,那么它是“冗长”的。Objective-C,Apple的编程语言,其荒谬的冗长程度臭名昭著,而这也为Apple赢得了“对用户友好”的名声。简单易用的并不仅仅是计算机,还包括语言本身。以下是一段虚拟代码,Objective-C中的函数就是这个样子的。即使你从来没有编过程,你也可以一星半点地明白程序员是想让计算机做什么事:实际上,使用这么多“黑客工具”的原因在于 理解编程概念最愉悦的方式就是将其转化成现实中的东西。如此一来,刚开始编程的人就可以很好地接受这些概念。如果以上这些你听来觉得无聊的话,并不意味着编程不适合你,只是你可以从硬件开始编程,而不要从软件开始。
自我复制 和其他创新一样,语言最开始也是由一些固执的人想用自己的方式做事而创造出来的,“自己的方式”也就是“最佳方式”。下面这个故事发生在很久以前。
1971年的时候,人们用Lisp编程。斯坦福大学的一个工程师发明了一个工具来编辑Lisp代码,今天的话我们会将其称为原始的文件编辑器–就和Mac上的TextEdit应用一样。但它用起来相当不直观。
要替换字符的话,人们无法直接将其键入到文档中,而得将一个字符先写到TECO命令语言中,让其切换到输入模式,然后键入要替换的字符,在此期间被编辑的文档并不会显示在屏幕上。
然后你得敲击ESC键来查看更改的地方,就和“保存并预览”博文的草稿一样。总之,这事让人挺痛苦的。另一个来自于麻省理工的工程师,在访问帕罗奥多(斯坦福大学所在地)时看到了这项发明,回到剑桥市(麻省理工所在地)之后决定自己重做一个改进版。他的同行们最后开始为这种新的接口编写“宏”–重用部分代码来节省时间。当他们将这些宏规范化到系统中之后,他们将其称EMACS,“Editing MACroS”的缩写。
你也许会说:“可这根本不算一个新语言啊。”的确如此,但和人类语言一样,编程语言经常也是从一个相近的语言发展而来,当发展到和原语言相当不一样的时候,就会被它的支持者们冠以“新语言”的名头。EMACS的故事说明了新语言被发明的另外一个原因:它们省事。
抽象 如果你是一个自由主义艺术家,不要被抽象这个术语吓到–它在编程中的意思和生活中的意思其实是一样的。试着这样想下:在写作的时候,我们将一段文字称为“段落”。这是对一种想法,或者一些语句的概念作出的抽象。我们采用“段落”这个词,于是我们向别人说起这段文字时不用将整个段落的文字背诵出来。
同样的道理,程序员总是在创建可重用的代码,因为和其他人类一样,他们很懒,不想做重复劳动。大约30年之前,产生了一项重大的开发运动,计算机程序几乎都可以用可重用部件组装而成,程序员们将这些部件成为“类”。(这和建筑、汽车或家具设计中的模块化运动相似。)这个设计模式就是人们熟知的“面向对象编程”。NeXT,也就是乔布斯在Apple之后创立的公司,将这个创意无限的模式称为编程的未来。他们对对“面向对象编程”兴趣十足,决定将其用来命名他们自己版本的C语言,于是Objective-C诞生了。Apple在收购NeXT之后也继承了Objective-C,并将OS变成了Mac OS X。
Swift,Apple编程语言的新生儿,就是基于Objective-C的另一个抽象层,Web开发人员因此可以用更合适他们风格来写代码。但是当程序运行时,Swift还是将其编译成旧风格的C语言代码。很多语言都是这样–仅仅是为了适应开发者的风格。另一个例子是CoffeeScript,它是另一种风格的JavaScript,但是当计算机编译运行程序时,还是将CoffeeScript代码转换成JavaScript。(Swift和Objective-C的不同之处)
新的基础结构
有时你会为了适应构造上的改变而需要一种新的语言。在“云”的概念出来之后,这种情况一直在发生。传统上程序是运行在本地计算机上的。这些程序就是你下载并安装在计算机上的那些“应用”。有时,被称为“网络”的东西可以将一台计算机上的应用运行到远程的其它计算机上。这些被称为网页应用,譬如Facebook.com或者Twitter.com。它们被称为应用程序,因为他们并不仅仅是静态的信息页面。在网页应用中,你可以做出动作,并立即看到随之产生的改变,虽然真正的Facebook.com应用是运行在某处的服务器上的,而不是在你自己的计算机上面。
创建这样的应用实际上代价是很高的:你耗费大量的计算力和带宽来将分发“作为服务的软件”,也就是“运行于云端”。运行这些云要耗费大量的金钱,尤其是用于冷却服务器的空调。因此最近一群天才聚集到一起创造了一个被称为Node.js的开源平台,它可以大幅度地降低网页中运行应用的成本,至于原因,在此我不会有所涉及。
许多开发者更愿意他们的应用能作为服务来运行,因为网页与可下载的应用相比有更多优点,譬如:没有东西可下载!Node.js可以让网页应用大规模地降低运行成本,因此参与到此项目中的人数有爆炸性地增长。Node.js平台使用JavaScript写的。Node(以及其他的一些流行的库,譬如Meteor.js和Angular.js)解释了为何JavaScript的使用人数最近呈爆炸性增长。 。 这并不是说最流行的语言就独领风骚。其它语言譬如Erlang重新激起了人们的兴趣,因为应用正在趋向于运行在云端。实际上,正是这款并不怎么流行的语言 Erlang给WhatsApp提供了强劲的动力。
文化 编程语言是由一些人为另外一些人创造的。因此,它们承载着创造者的文化印记,有些文化印记不为其他群体的工程师们喜爱,因此他们转而创造出了自己的版本。这在计算机科学历史中无数次上演,导致产生了许多流行语言的方言。最明显例子就是首个阿拉伯语编程语言。去年有篇关于Ramsey Nasser的文章,他创造了第一个表情文字编程语言:
Nasser评论到:“我们使用的工具承载着它们创造者的文化设想。”当Nasser创造قلب的时候,他在将true和false翻译成阿拉伯语时遇到了困难。最终他使用了correct和incorrect这两个词,虽然两者的概念并不完全吻合,但是他说这最终演变成了一场他不得不和他父母以及朋友进行的奇妙对话。Nasser旨在创造编码的通用性:“Emojinal意在甩掉文化包袱。”
这是一个古老格言的另一种版本:你说的语言改变了你思考的方式。有些语言有助于某些类型的思考;而有些有助于其他类型的。正如我们在四月份写下的文字所说:
“语言不仅是针对不同工作的不同工具,它们还是可以描绘你思考编程的技术。”Richard Pattis说。他是加州大学的信息学高级讲师,他于1981年发明了Karel教育编程语言。Pattis建议多才多艺的程序员要扩展思维的话,最好学习不同编程范式的语言,从面向对象语言(譬如C++/JAVA),到函数式语言(譬如ML和Haskell),到脚本语言(譬如Lisp和Python),到逻辑基础语言(譬如Prolog),到低级语言(譬如C,Java虚拟机或者机器语言)。目标不是为了熟练运用这些语言,而是能从不同的角度来思考解决问题。好的程序员不仅仅学习如何编程,还要学习核心概念,用其武装自己的大脑,从而写出高效的代码来解决问题。
程序员们,如果你对为何编程语言会兴起(或衰落)有任何见解,请在Twitter上告诉我,请@chrisdannen。更新:在”抽象”部分提到的编程中设计模式的重要性是不可以低估的。在我发布这篇推文时,开发人员Matt Drance回答了这个问题。如果要我挑出一句话来回答的话,这句话也许是最精准的了:新语言之所以兴起,是因为目前的设计模式(也就是目前的开发语言)可能无法满足我们在未来的需求了。
|