程序语千百种,想要学 Coding 就必须先确定你的目的是什么,有的是拿来写 App 的,有的是专写操作系统,有的则是拿来写网页的 …… 各种不同的目的都有其最适合的语言。
常见的语言如 C++、JavaScript、VB、VC、Matlab、Python 等,但其实像 WhatsApp 如此受欢迎的 App 就不是前述这几种语言写的,为什么要有那么多的程序语言?
本文作者 Chris Dannen 同时是知名科技媒体《Fast Company Digital》 和《FastCo.Labs》 的编辑,曾经做过管理顾问、户外运动的採访记者以及 Red Bull Energy Drink 的品牌代表,曾写过两本关于 iOS 开发与设计的书。
以下以作者第一人称撰写。
世界上的程序语言已这么丰富,为什么我们还需要更多?
2014年6月初,Apple 发布了一个新的语言 Swift,主要是为了建立 Mac Apps 而开发的,你有想过为什么需要这么多的程序语言吗?难道现在开发的都还不够用吗?
没错,就是一个简单到不行的原因:只要有人想要学习,就会有各种不同的语 言被开发出来。因为科技进步,加上使用语言的目的性不同,越来越广泛也越齐全。
如果把这个问题套用到「鸡生蛋还是蛋生鸡」,这个问题的解答会是蛋生鸡。
许多语言的开端,都是要让编写程序的概念变得更简单、更适合初学者和有兴趣的朋友。事实上,电脑把语言设成二元码(电脑进行储存和运算时,采用二进位,也就是所有资讯都被替代成二进位字串),为什么要这么做呢?
原因很简单:如果你把你所有的指示转换成 Yes 或 No 的问题,并分别以 1 和 0 表示,这么一来电脑就不会搞混了(除非一开始的编码是错的)。
在第二次世界大战时,广播讯号是以非常糟糕又不可靠的无线电导航来传重要讯息,而二元码如此聪明的创新是 Claude Shannon (美国数学家、电子工程师和密码学家,被誉为资讯理论的创始人)所发现的,只要用二元码,电脑就可以把资讯储存与进行处理。
自从二元码诞生,非常多的语言都以它来设计,使工程师能够写得更流畅又更容易读,虽然会感到无聊或是觉得写二元码很冗长。比如说大写字母 A 好了,以二元码表示成 01000001 ,如果是小写 a 呢,则是 01100001 ,写完一个程序要花一些时间,但不用介意长度有几千行,因为大多数的程序都是这样来的。
当一个语言以易懂的英文写,就更容易读了,但另一方面就会显得相当冗长;像是 Apple 的程序语言 Objective-C (是一种通用、高阶、物件导向的程序语言,任何原始的 C 语言承是不需要经过修改就能直接通过 Objective-C 的编译器),就是冗长到不行,但主要也是为了要满足对使用者友善的特色,语言本身就是非常容易使用的。
即使在你的生命中从来没有写过程序,或多或少你也能了解一点工程师想要告诉电脑要做什么,它长的大概是像这个样子:[someInstance doSomethingWithObject:a andAnotherParam:b];
事实上,为什么在物理电子学的范畴里有这么多的骇客套件,主要是因为要让现实世界的装置通常能以最自然的方式转换成写程序的概念,至少对于写程序的初学者而言,这类的程序语言是比较适合的,即使它很冗长。
程序语言就是开发者自我性格的复制
就像其他的创新一样,程序语言通常都是从一个偏执顽固的人开始,试图要走一条只属于自己的路。
举例来说 1971 年,在这个领域的大多数人都在 Lisp (源于列表处理器,List Processor 的缩写,是历史悠久的电脑程序语言家族,于 1958 年基于 λ 演算创造,是第一个函数语言程序设计的语言)写程序,一个在 Stanford 的工程师明白了要如何编辑 Lisp 的编码,也就是我们今天所谓的原始的编辑器。
想像一下,就是一个在 Mac 上的 TextEdit App,但当然不是像现在一样可以直接简单的使用。
然后你必须按 Escape 键跳出页面,检查你所做的那些改变,像是储存或浏览在部落格贴文的草稿等,是否跟你预想中的一样;不管怎么说,重复对照你所想的与结果,这简直是一件痛苦的事。
另一个从 MIT 来的工程师看到在 Palo Alto 的创新后,决定要回 Cambridge 后靠自己把它复製下来,并且做一些改善与调整。而其他同事们为了新界面终于开始写 macros (巨集,根据一系列预定的规则替换一定的文字模式)--可重复使用的编码位元以节省时间。当他们将巨集的集合程序化,结合到一个系统内,他们把这个叫做 EMACS--Editing MACroS 的缩写。
抽象到不行
如果你是念文法商的,别被这样的名词吓到,它代表着一个程序的生命。
换个角度想像,在写作时,我们会把字句的结合叫做段落,这是就写文章的观点来看,它也是一个抽象的概念,当我们要告诉其他人正在讨论文章的哪部份时,我们不需要再重新引述整个段落的文字内容,而是告诉他们第几段就好,说到底它也是抽象的。
同样地,写程序的工程师经常会试着要创造可重复使用的编码字元,因为就像其他人一样,会懒惰,会不想做重复的事情。
大约 30 年前有个大改变,对于藉由可重复使用的部分来建立电脑程序,将它称作为物件(若是在建筑、车子或是家具设计,就很像是模组化), 这样的设计模式称作为物件导向的程序编写,在 NeXT (Steve Jobs 在创立苹果后所成立的公司)的那段期间,这可是相当创新的。当时还将它视为未来程序发展的领航者,所以他们就将这样物件导向的程序拿去卖,并且决定将它取 为在 C 语言架构下属于他们自己版本的名称,于是 Objective-C 就这样诞生了。
当 Apple 买下 NeXT 后继承了 Objective-C,并把他们公司的 OS 变成 Mac OSX。
云端时代,语言也需要新架构
当本质上发生改变的时候,你必须要去适应它,因此有时候你会需要一个新的语言。伴随着云端时代的来临,更是如此。
传统上来说,程序会依下载位置在你的电脑(装置)上跑,就像你所下载的 Apps 和安装到你电脑内的软体。然而有时候,某个叫作网络的东西,它有无限神奇的功能,能够把在某一台电脑运作的 App 传送到另一台电脑上,这些是网络 App,比如说像是 Facebook.com 或是 Twitter.com 等等。
在网络 App 你能够做很多事情并且看到即时的变化,Facebook.com 的 App 是在某处的伺服器运作,而不是你实际的电脑上。
要创一个 App 其实是需要花好一番功夫的,你需要不只是电脑能力和频宽传输,软体是一种服务,从云端来的服务,这些云端是需要花一大笔成本来操作的,所以一群聪明的人聚集在一起,然后创造叫作 Node.js 的开源平台,通过网络跑 App 以大幅降低成本。
许多开发商偏好将他们的 App 视为一种服务,因为一个网站有非常多的下载 App 的优势,像是免费下载,使 App 更便宜且在一定规模下运作,已经造成了 Node.js 一阵轰动,而 Node.js 是由 JavaScript 写出来的,Node 解释了为什么身为一个语言的 JavaScript 最近可以如此受欢迎。
并不是要说上图这几个受欢迎的语言已经霸占了大部分市场,其他的语言像是 Erlang,自从 App 开始移往云端后,它又重新的引起大家的兴趣。事实上,相较于图上这几个语言来说,受欢迎程度相当低的 Erlang 是创造 WhatsApp 的最大功臣。
一个程序语言,承载了一群自造者的文化
一部份人创造的程序语言是为了其他人,因此他们承载着所有自造者的文化产物,部份文化产物又和其他的工程师群不同,他们各自走着属于自身文化产 物下的版本,在电脑科学的历史上这已经发生过无数次,也形成着最受欢迎语言的运算子重载(对已有的运算符号重新定义,赋予它另一种功能以适应不同的数据类 型)。
有些语言对于逻辑思考的类型是有一定帮助的,一个你所用的语言会改变你的思考模式。就像是 Richard Pattis (一个加州大学尔湾分校资讯学的资深讲师)所说,「不只是为了不同的任务而有不同的语言工具,同时它们也形塑着你如何看待写程序的科技」。
这也是为什么会有这么多程序语言存在着,不同的语言代表着一群工程师脑中的思考逻辑模式,当然如果身为语言的使用者而非语言的创造者,太多的选择中要选择一个对工作最有帮助的,最能达成目标的那个。