Fortran|让程序员梦寐以求的编程语言,实现编程的完美开发(上)( 二 )


编程语言不是存在于真空之中 。 “编程”其实是及物动词 , 黑客一般都是为某个系统编程 , 在现实中 , 编程语言总是与它们依附的系统联系在一起的 。 所以 , 如果你想设计一种流行的编程语言 , 就不能只是单纯地设计语言本身 , 还必须为它找到一个依附的系统 , 而这个系统也必须流行 。 除非你只想用自己设计的语言取代那个系统现有的脚本语言 。
这种情况导致的一个结果就是 , 无法以一种语言本身的优缺点评判这种语言 。 另一个结果则是 , 只有当一种语言是某个系统的脚本语言时 , 它才能真正成为编程语言 。 如果你对此很吃惊 , 觉得不公平 , 那么我会跟你说不必大惊小怪 。 这就好比大家都认为 , 如果一种编程语言只有语法规则 , 没有一个好的实现(implementation) , 那么它就不能算完整的编程语言 。 这些都是很正常很合理的事情 , 编程语言本来就该如此 。
当然 , 编程语言本来就需要一个好的实现 , 而且这个实现必须是免费的 。 商业公司愿意出钱购买软件 , 但是黑客作为个人不会愿意这样做 , 而你想让一种语言成功 , 恰恰就是需要吸引黑客 。
编程语言还需要有一本介绍它的书 。 这本书应该不厚 , 文笔流畅 , 而且包含大量优秀的范例 。 布赖恩 · 柯尼汉和丹尼斯 · 里奇合写的《C程序设计语言》(C Programming Language)就是这方面的典范 。 眼下 , 我大概还能再加一句 , 这一类书籍之中必须有一本由O'Reilly公司出版发行 。 这正在变成是否能吸引黑客的前提条件了 。
编程语言还应该有在线文档 。 事实上 , 在线文档可以当作一本书来写 , 但是目前它还无法取代实体书 。 实体书并没有过时 , 它们读起来很方便 , 而且出版社对书籍内容的审核是一种很有用的质量保证机制(虽然做得很不完美) 。 书店则是程序员发现和学习新语言的最重要的场所之一 。
简洁假定你的语言已经能够满足上面三项条件——一种免费的实现 , 一本相关书籍 , 以及语言所依附的计算机系统——那么还需要做什么才能使得黑客喜欢上你的语言?
黑客欣赏的一个特点就是简洁 。 黑客都是懒人 , 他们同数学家和现代主义建筑师一样 , 痛恨任何冗余的东西或事情 。 有一个笑话说 , 黑客动手写程序之前 , 至少会在心里盘算一下哪种语言的打字工作量最小 , 然后就选择使用该语言 。 这个笑话其实与真实情况相差无几 。 就算这真的是个笑话 , 语言的设计者也必须把它当真 , 按照它的要求设计语言 。
简洁性最重要的方面就是要使得语言更抽象 。 为了达到这一点 , 首先你设计的必须是高级语言 , 然后把它设计得越抽象越好 。 语言设计者应该总是看着代码 , 问自己能不能使用更少的语法单位把它表达出来 。 如果你有办法让许多不同的程序都能更简短地表达出来 , 那么这很可能意味着你发现了一种很有用的新抽象方法 。
不要觉得为用户着想就是让他们使用像英语一样又长又啰嗦的语法 。 这是不正确的做法 , Cobol就是因为这个毛病而声名狼藉 。 如果你让黑客像下面这样求和:
add x to y giving z
而不是写成:
z=x+y
那么你就是在侮辱黑客的智商 , 或者自己作孽了 。
简洁性是静态类型语言的力所不及之处 。 不考虑其他因素时 , 没人愿意在程序的头部写上一大堆的声明语句 。 只要计算机可以自己推断出来的事情 , 都应该让计算机自己去推断 。 举例来说 , hello-world本应该是一个很简单的程序 , 但是在Java语言中却要写上一大堆东西 , 这本身就差不多可以说明Java语言设计得有问题了 。 ①
① hello-world程序的唯一作用就是显示出“Hello, world!”这句话 。 使用Java语言 , 你需要这样写:
public class Hello { public static void main(String[] args) { System.out.println("Hello, world!"); } }如果你从来没有接触过编程 , 看到上面的代码可能会很奇怪 , 让计算机显示一句话为什么要搞得这么复杂?有意思的是 , 资深程序员的反应与你一样 。
单个的语法单位也应该很简短 。 Perl和Common Lisp在这方面是两个不同的极端 。 Perl的语法单位很短 , 导致它的代码可以拥挤得让人无法理解 , 而Common Lisp内置运算符的名称则长得可笑 。 Common Lisp的设计者们可能觉得文本编辑器会帮助用户自动填写运算符的长名称 。 但是这样做的代价不仅是增加了打字的工作量 , 还包括提高了阅读代码的难度 , 以及占用了更多的显示器空间 。
可编程性(Hackability)对黑客来说 , 选择编程语言的时候 , 还有一个因素比简洁更重要 , 那就是这种语言必须能够帮助自己做到想做的事 。 在编程语言的历史上 , 防止程序员做出“错误”举动的措施多得惊人 。 这是语言设计者很自以为是的危险举动 , 他们怎么知道程序员该做什么不该做什么?我认为 , 语言设计者应该假定他们的目标用户是一个天才 , 会做出各种他们无法预知的举动 , 而不是假定目标用户是一个笨手笨脚的傻瓜 , 需要别人的保护才不会伤到自己 。 如果用户真的是傻瓜 , 不管你怎么保护他 , 他还是会搬起石头砸自己的脚 。 你也许能够阻止他引用另一个模块中的变量 , 但是你没法防止他日日夜夜不知疲倦地写出结构混乱的程序去解决完全错误的问题 。