Steve Wozniak如何从零做起为早期苹果写BASIC的

steve-wozniak

为了[庆祝BASIC的50周年](http://bit.ly/1koOQMm),Steve Wozniak【注0】写了一些回忆录,关于这门受欢迎语言的首次体验,以及他如何从零做起为苹果I和苹果II电脑创立自己的BASIC。一个难以置信的壮举!

在1967年或1968年,我是高中的一名毕业班学生,我们的电子学老师(我生活中很多教学名声中最好的老师)安排我到桑尼维尔(西尔韦尼亚)的一家公司给电脑编程,因为我已经全部掌握了学校的电子学课程。McCollum先生每年为具备电子学能力的学生做这样的事情,找到当地有工程师和项目的公司让高中生去积累一些经验。我在这台IBM电脑上学习用FORTRAN编程。

我最初体验BASIC是在高中的同一年。我们学校还没有电脑,除了GE,我猜的,引进了带有modem的终端来做他们的分时业务。我们很少的数学好的学生被给几页的指令,我们用BASIC写一些非常简单的程序。我觉得对于上手,这是一门非常简单、易于学习的语言,不过那个终端仅仅在我们学校放了几天。我们的数学班主任要求我写一页,说明为什么我认为拥有这个终端对于学校是一件好事。我的确写了一页,关于逻辑思考和解决问题的,但是学校没有跟进调查分时程序。

在我大学几年里,我的高级编程语言属于科学的类型,FORTRAN、PL-1、Algol。当然我也在大学以及自己独立的时候用很多汇编语言做了大量的编程。

在Homebrew电脑俱乐部,我们被成堆的书包围,我喜欢称之为‘圣经’。一本是Ted Nelson写的《电脑革命/梦幻机器》,描述了以书面形式链接到下一步事物的意义的未来世界。他的想法就像科幻小说,但是我们都知道它们是技术上可实现的,我们都提倡这种看待未来电脑的方式。另一本‘圣经’是一本书《BASIC的101个游戏》。我是一个电脑游戏粉丝,知道如果我有一台属于我自己的电脑,我会打算敲入所有这些游戏并玩一遍。根据我自己感觉的判断,我猜测这将是发起一场家用电脑革命的关键所在。我的非商人特点阻止我去讨论市场和财务。

我不确切知道一台真正的电脑需要做的、电脑为公司做的大量财务工作,电脑以高价卖给了公司。那些是值得花钱的电脑。我所知道的一切就近在咫尺。我模拟了HP的芯片设计和逻辑设计,以及工作在计算器上。我的电脑将不得不那样做。我的电脑也要不得不玩游戏。至少那时候我确定我的电脑可能能够做那些价格昂贵电脑做的重要事情,只是那时候我不敢肯定。

游戏的关键是BASIC。比尔盖茨那会儿在电子学爱好者的世界之外还不出名。我们俱乐部的每个人都知道他在为Intel微处理器写BASIC。我意识到,让我的电脑变得优秀(受欢迎)的关键是包含一个高级语言,它一定是BASIC。使用FORTRAN编程的工程师们不会是发起一场家用电脑革命的力量。

学习语言,写一个BASIC解释器

问题是我还不了解BASIC,只有来自于3天的高中经验,它有行号。因此某天深夜我找到HP上的一本BASIC手册,开始阅读,并就该语言的命令做了笔记。需要一提的是,我生命中从来上过一节编写编译器(或解释器)的课程。但是我的朋友Allen Baum送给我了关于这个主题的、MIT课本的影音拷贝,因此我可以声称我在MIT受过教育,哈哈。我在大学的第二年,我坐在数学分析课堂上,尽量教自己如何开始写一个FORTRAN编译器,却不知道编写编译器的技术。回到这个回忆里,我开始为我的6502微处理器写以行读取用户敲入的、用于分析和错误检查的字符的代码。

我了解语法图(Syntax Chart),就为这个BASIC建立了一份。我不知道HP...

采用一门新编程语言,或不采用

我大体上对编程语言感兴趣。特别低,我一直对另一门编程语言 如何能够提供给我表达程序的新特性以及允许我成长为一名程序员 感到好奇。

我在校时学到了第一门语言。那儿的电脑——一屋子都是PET 2001,那时候他们是新潮的——只有BASIC,很快就让我失望了。在大学,我开始了一门Pascal的课程,闲暇做了很多编程。Pascal很快填补了我在BASIC发现的恼人的不足。

带着兴趣我学习了FORTRAN基础,但是从来没有真正用过。Modula 2 出现了,甚至有更大的编程分配,但是没有真正引起我的兴趣。我发现Ada更有意思,不过在进程控制课程之外很少有机会使用。我接触了一点儿Forth,但是再一次没有真正的应用程序来实践。

当我接触C时,最终被吸引住了。那是,最终的,“真正的语言”,在某种程度上,我可以完全掌控的一门语言,不仅在技术情景——对于我的大部分专业生涯,它是让我过得很好的主要因素之一。

我在大学还学了其它有意思的语言,比如,Tcl,不是最伟大的语言,但它是一个非常易于嵌入的解释器。很快,我把它嵌入了我写的每一个主要程序。我学了一点儿Prolog,但还不够,我很遗憾。

但是我对函数式语言产生了极大兴趣,并在那个领域取得了更多进步——主要是Lisp、Hope、ML,Lisp是我自己构建实现的唯一语言——或者,不止一个。起初对于一项任务,和一名合作学生一起,在Modula 2上。我们不喜欢那门课程里的某些要求,没有如此多的实现语言,因此随后,我们用C做了一个相似的。数年后,我用Java做了一个Lisp解释器,后来还用C做了另一个Lisp解释器。所有这些都不是真正完全的——特别是后面的垃圾回收有点儿着急,回收了它不应该回收的东东,但是两者都实现了一个小型但“真正”的Lisp,能够使用递归和高阶函数,有可用的基本内建命令。在此期间我用Go写了一个,它是它们当中最完整的,尽管还在我收藏的玩具语言分类、而不是有用的编程环境。

正如前面提到的,C对于我的大部分专业工作是有帮助的,也是我目前在用的。但是其他语言进入了视野,主要是Perl。当我想尝试某个东东或不得不只实现一点儿功能时,Perl甚至变成了我的默认语言。这不是因为我对Perl的技术有点有着高度评价,不过它随处可用,每个人了解它,因此和C比起来,很多事情用Perl不可否认地更加容易,所以Perl已经变成了一种习惯。虽然我不是Perl的最大粉丝;我发现它处处不雅和粗野,总在试图鼓励其它语言的有疑问的编程习惯。还有,它用相对较少的努力就能把事情搞定。

在此过程中还有其它语言我发现有意思,但是没有找到足够时间(或实践机会)去真正学习它们——LUA、SNOBOL,APL(或J)浮现在脑海。我迟早不得不要用JavaScript工作,但是我认为它非常无聊。

然后我看了越来越多的Go。Rob Pike的一篇文章最终让我深入进去,关于我一直想去做的东东。现在它貌似是一门好的语言,内建了伟大思想,还有继承了与C和其后代语言一起成长的程序员的习惯。Go有潜力把我带回20年前我脑子里充满C的那种愉悦,结合了一门最终的优雅语言(虽然不如Lisp或更加现代的函数式语言优雅)的舒适和实用(像Perl)。我将拭目以待;现在除了一些简单程序和用Go实现的上面提及的Lisp解释器,我没有做更多。

后来有了Haskell。我在90年代早期就对Haskell感到好奇,当时我做为一名学生(参考上面)接触了其它函数式语言。有人给我一篇关于在ACM SIGPLAN Notics上面的Haskell的文章。Haskell那时候还是新的,但是它已经成长了数十年,它仍然存在,我认为这是好的信号。由于我总是喜欢函数式编程,这或许是我一起成长的语言。

现在对我来说,采用一门新语言的最大障碍不是学习的难度和为了实际任务的加速学习,而是其他人。让我遗憾的是,我的工作场所有一种文化,人们大部分在独立地做他们的开发项目,当原作者在度假、或者原作者离开后做进一步开发时,其他人能够修复问题,这仍然被认为是重要的。当然我同意这一点。但是当其他人只是对同样事情不感兴趣时,才会使得采用一门新语言变得困难。哎,他们好像不是这样。

...

关于改善你的Objective-C应用程序错误处理的简单建议

Objective-C多数时候倾向于用错误对象代替异常。如果某个地方失败了,错误将被包含在一个合法的指针里,否则它就是nil。如果你不关心错误,你可以在几乎所有API里传入nil。然而,如果你和一个很大的代码库或一个团队工作,或者如果你想写一个不错的健壮应用程序,你应当小心地处理所有错误。过去我的惯例是强迫调用者传入一个合法指针而不是NULL。它简单得就像放置一些断言。这里是当我想强迫调用者处理错误检查时,要做的。

下一步就是确保调用者实际上处理错误或者适当地冒泡。那是完全不同的处理,但至少我们这样子开始了。

> > - (BOOL)fetchProfilePictureWithError:(NSError * __autoreleasing *)error > { > NSParameterAssert(error != NULL); > NSParameterAssert(*error == nil);...