【编者按】本文作者 Peter Wayner 是 InforWorld 特约编辑,也是超过16本书的作者,其著作涉及开源软件、全自动汽车、保密加强型计算、数字交易等广泛题材。其最新著作为《未来的驾座(Future Ride)》第二版,主要描绘全自动汽车在未来将如何改变世界。本文系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文。
但凡是以编程为生的人,肯定不会给出不要心怀怨怼的好意规劝。只要经历过复杂到万劫不复的逻辑,你就会了解那些最糟糕的程序错误有多恐怖。
当然,每个人都会爱上他们最早相遇的计算机语言。为什么不呢?最简单的“hello world”示例,短短三行代码就能表现出这门语言的神通广大。虽然编程语言应该具备隐含逻辑,但这并不意味着他们的逻辑应该随处可见。一个讨人喜欢的酒保能使整个酒吧的气氛更加欢乐。一个勇敢的消防员会辐射出鼓舞人心的胆量。但是,编程语言的逻辑机制却往往孕育出不合逻辑、混乱甚至疑惑。
不过,声称编程语言没有逻辑显然是不合常理的。但我们还是经常这么说,因为我们知道逻辑也有其限制。从 Gödel 到 Turing,我们逐渐意识到逻辑机制在其边缘地带也会催生出可怕的场景。当然,这可能是我们人类的责任,因为我们的误用或编程不当所致。但是,如果编程语言促使我们选择了危险的道路,语言本身也是难辞其咎的。
而且,我们往往对此无能为力。已经安装好的基础环境或许太大,因此我们无法放弃让自己恼怒的语言。老板可能特别钟爱某个技术栈,以致于无法容忍来自办公桌的怨言。更为残忍的现实是:你没有更好的选择。我们已经在使用人类所能打造的最佳工具了。
以下是7种我们常常抱怨但却离不开的编程语言。
1、C
有关该语言的问题如此之多,以致于它更应被称为“可移植汇编器”,而不是完整的计算机语言。有人喜欢编写分开的头文件么?有人在用预处理器处理复杂的内容时不会感到烦躁么?
理论上,我们应该可以运用指针运算巧妙地实现丰功伟绩,但是大家除了用其分配数据结构,还做了什么呢?巧妙地利用指针是否真的值得鼓励?这正是代码开始崩坏的地方。如果你能巧妙地使用指针,往往还需要编写非常长的注释以实现完善的文档,而这常常会消耗很长的时间,甚至抵消了巧妙代码所节省的时间。有人能记住为了避免所有可能的安全漏洞(比如缓存溢出)所需牢记的所有 C 语言编写规则么?
但是,我们别无选择。Unix 是用 C 语言写的,而前者运行着大多数手机与大多数云。并非每个为这些平台编写代码的程序员都需要使用 C 语言,但是总得有人熟悉星号与花括号,否则一切都可能崩塌。此外,还有许多设备驱动程序与其他嵌入式程序。总得有人承担维护 Linux/Unix 代码库并不断开拓进取的重担。
2、JavaScript
JavaScript 的创造者试图打造更为先进的语言。可惜的是,他们的聪明智慧导致我们要不停地计算花括号,方括号以及圆括号的数量——同时还要保证它们的嵌套合理。此外,在匿名函数、闭包以及 JSON 数据结构之间的往来调停,导致我们总是在键盘上忙个不停。
此外,还有许多奇奇怪怪的细节。假设 x
是包含着字符 1
的一个字符串,则 x+1
会得到字符串 11
,而 x-1
会得到数字零。有人记得 false
,null
, NaN
以及 undefined
之间的区别么?他们看起来很相似,但是 JavaScript 为什么要设置它们四个呢?而且,它们为什么表现不一致呢?
不过,我们抱怨再多也没有用。网络、万维网以及不计其数的浏览器并不会因此改变。并且,机灵的 Node.js 团体来了,迫使我们在服务器端编写 JavaScript 代码。坚持不用 JavaScript 的想法估计只能持续几秒钟,一旦开始检查邮箱,或者网络购物,就只好屈服了。笔者相信,JavaScript 会相伴我们很久很久。
3、PHP
PHP 其实不算真正的计算机语言。它更像是为静态 HTML 添加智能的工具。你可以在数据库中存储信息,并使用静态标签连结这些信息。可能还存在一些别的特性,但对笔者而已,PHP 的主要功能是连结从数据库中抓取来的字符串。
不过,争论无足轻重的代码或幼稚的语法显然没有必要。现而今,大多数网站都是用 PHP 搭建的。WordPress, Joomla 以及 Drupal,大多数网站内容都是通过 PHP 代码呈现的。此外,还有用 PHP 搭建的 Facebook,越来越多地占用了人们花在网络上的时间。我们应该感到高兴,Facebook 开发了 HipHop 虚拟机,启发 Zend 打造了 PHP 7.0。这些全新的 PHP 引擎往往能带来两倍的速度提升,节省数百万元的电力,这几乎是令人无法抗拒的诱惑。在未来,PHP 仍将继续保持活力。
4、Cobol
Cobol 早在1959年就出现了。按理说,它应该是充满百来个限制词,语法复杂的老古董才对。但是,Cobol 的拥趸仍在不断更新其版本,从其他语言中借鉴新思想,再融入年近六旬的框架中。你知道 Cobol 2014 么?它包含了动态表格——人们早在2002年就想将其纳入该语言。Cobol 其实没有那么老。你以为它在70年代就无人问津了?其实你大错特错了。
我们可能拥有更好的用来编写业务逻辑以操控数据库的工具,但是没人在意这些工具。原因是,我们只需购买一个更大的计算机,就能让 Cobol 代码继续运行。在笔者写这篇文章时,Dice.com 网站上有543个涉及“Cobol”的任务。在保险公司与国防承包商的系统中,充满了 Cobol 任务。最早采用大型主机的企业们还在使用 Cobol,并且能够顺利完成工作。计算机科学家可能会有些退缩,但是只要客户还在稳定增长,老板会说:“既然还没坏,就不用修了。再买一台大型机吧。”
5、XSLT
所有人一开始都会爱上 XSLT,一种转换 XML 的函数式语言。当你需要抽取 XML 文档的零碎片段时,XSLT 是能够顺利运行的智能方案。但是,一旦老板要求一些比简单的搜索、替换更为复杂的数据,开发就会陷入困境。XSLT 是显式的函数式语言,我们很快就会发现,当文档中出现“变量(variable)”时,其使用方法更像是代数老师,而非程序员的做法。仔细想想 XSLT 专家 Bob DuCharme 充满禅意的这句话吧:”XSLT 变量实际上与许多编程语言中的常量有很多相似点,并且使用目的也很相似。“如果你想把 XSLT 中的变量用得像其他计算机语言中的变量一样——也即,其值可变——你要非常聪明才行。
XML 或许正失势于 JSON 之类更加高效的数据格式,但它仍是许多大数据处理器的强有力基础。你可以不使用 XSLT,转而编写能解析文本自身的基础代码。然而,编写这些代码以解析 XML 往往比掌握 XSLT 结构更加费时费力。
6、Java
Java 虚拟机与函数库可能来自90年代,但是其语法却来自 C 语言诞生的70年代。自动内存管理似乎是很大的进步,但是当垃圾回收程序占据主动时,应用代码就得歇一歇了。Android 开发者常常交换意见,讨论何时适当地提早请求垃圾回收,从而确保在重要事件,诸如急救电话中途避免垃圾回收。
Java 开发者已经就诸多问题抱怨了很长时间,其中一些问题可能已经得到 Oracle 的解决,或至少引起了一定的重视。但是,这引来了一个新问题。一些新的代码与库没法与旧版本的 VMs 兼容。笔者曾经花了一天的时间探索 java.lang.UnsupportedClassVersionError
,但未能找到永久的解决方案。似乎,自 1.4 之后的每个 Java 版本,都是一种新语言。
不过,以上问题都不重要。Java 是 Web 与移动手机的基础。它是许多高中开授的第一种计算机语言。其函数库的集合比几乎任何一种语言都更为丰富,也更具价值。为何还要使用其他语言呢?
7、Python
Python 是年轻程序员热衷使用的摩登语言。其标点符号很少,所以代码看起来更加简洁。那有什么缺点呢?Python 2.7 与 3.0 版本间的代沟颇为明显。这是使 Python 更上一层楼的唯一选择,但是这一飞跃的幅度太大,以致于使用者必须时刻了解自己当前使用的语法版本。也就是说,我们永远都要记得检查所安装的 Python 版本。
此外,有多少人喜欢计算用来缩进代码块而添加的空格数?计算花括号的数量已经够磨人了,计算空格符的数量则需要等宽字距(monospace)编辑器。
但是,这些问题并不重要。因为人文科学家们已经带着热情而又模糊的情感倾倒在 Python 的脚下。生物学家与经济学家们认为 Python 是唯一选择。一些人甚至建议在股票与债券的售股章程中纳入对 Python 编码的需求,好像投资银行家可以通过 Python,而不是精心编造的银行学说辞忽悠我们。
不过,好消息是,Python 语言比银行家的”语言“更好懂。这真是一大进步——即便这意味着我们要计算空格的数量。新的潮流已经到来,而且它收获了许多人文科学家的支持。
本文系 OneAPM 工程师整理呈现。OneAPM 能为您提供端到端的应用性能解决方案,我们支持所有常见的框架及应用服务器,助您快速发现系统瓶颈,定位异常根本原因。分钟级部署,即刻体验,性能监控从来没有如此简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客。
本文转自 OneAPM 官方博客