这本出版物连续第二个月聚焦于一种特定的编程语言。上个月,格雷厄姆用以下几句话开始了他关于Java的文章:
让我从承认开始:我花了几个星期的时间才弄清楚要为de Programmatica Ipsum的Java问题谈些什么。这件事实在是太多了。
我的这篇关于Smalltalk的文章必须以类似的免责声明开始。我花了几个星期的时间才想好要为“de Programmatica Ipsum”的Smalltalk一期谈些什么。我只是对此一无所知。
我对待这种情况就像对待它一样:我必须学习一门未知的编程语言,而且有一个硬性的截止日期。我想出了一个主意:我决定用它重写我的一个爱好项目。本文将概述我作为一个绝对的初学者所遵循的步骤、帮助我的信息来源,以及我是如何最终用Smalltalk编写我的第一个工作应用程序的。
TL;DR:Smalltalk是我到目前为止所见过的编程领域中最肥沃、最有激情、最具开创性的星系之一。
我需要做的第一个决定是,使用哪种Smalltalk方言?实际上,有相当多的选择可供选择;最常见的选择是Squeak(有趣的是,它本身是用Smalltalk编写的)或Pharo,后者是Graham推荐的。但事实证明还有更多,包括免费(如啤酒)、免费(如在libre中)和商业实现:VA Smalltalk、Dolphin Smalltalk、VisualWorks、Cuis、Gemstone、Cincom、GNU Smalltalk…。
在我的研究中,我发现Smalltalk还为新的语言和环境(如NewSpeech或Amber)提供了样板灵感。
还有一个名为Monticello的官方Smalltalk源代码版本控制工具,其中包括一个从Monticello到Git的迁移工具。当然,我们可以找到相应的托管服务:SqueakSource和SqueakSource3,后者取代了过时的SmalltalkHub。
Seaside和Zinc可以帮助开发人员使用Smalltalk创建Web应用程序。然后,您可以构建Docker镜像并将其部署到Kubernetes集群,因为这是使用Smalltalk进行DevOps的方式。
但我最终没有听从格雷厄姆的建议,我只是简单地安装了gnu-smalltalk。读到这篇文章的Smalltalk专家非常懊恼,虽然我觉得Smalltalk图像的概念很吸引人,但我对西蒙·刘易斯(Simon Lewis)在“Smalltalk的艺术与科学”(The Art And Science Of Smalltalk)一书(Prentice Hall,1995,免费提供)的介绍中所说的“第一种”Smalltalk知识很感兴趣:
GNU Smalltalk被证明是第一次接触Smalltalk的完美方言,它提供了非常传统的命令行体验。Vim提供了我编写这些初始代码行所需的语法突出显示。
首先,有一些熟悉的方面。在这方面,我猜我作弊了,因为我觉得我以前对Ruby和Objective-C的了解在第一步肯定对我有帮助。这并不令人惊讶,因为知道两者都与Smalltalk有很多共同点。这在Objective-C的情况下更加明显,在这种情况下,您不能错过Cocoa和GNUStep中可用的类和方法名称中奇怪的相似之处。如果您不确信,只需查看GNU Smalltalk的Object类中的方法名称即可。
然后是可爱的方面;其中最突出的是用第一人称编写的代码文档注释。因此,对于前面提到的对象类:
我是Smalltalk课程体系的根源。系统中的所有类都是Me的子类。
然后是编程体验本身。使用Smalltalk带来了一种绝对自由的感觉,因为只有纯动态的媒体才能提供这种感觉。错误在运行时发生;就像Objective-C的情况一样,编译器实际上不会为您检查任何东西。这种语言的语法绝对是极简主义的。这也可能是一个问题:忘记代码中某处行尾的句点,它将会编译,但会崩溃,并显示一条相当神秘的错误消息。去过那里,做过那件事。
顺便问一下,如何接近语法?我想出了一个非常简单的思维导图:在有句点的地方,想想分号。有方括号的地方,想想花括号。如果有插入符号(^),请考虑回车。结尾处的句号让我想起了COBOL。数组索引从1开始,这让人联想到BASIC。比较(=)和赋值(:=)运算符的选择让我想起了Pascal和ALGOL。又回到了1973年7月9日。
但是,尽管Smalltalk语言承载着这些过去的记忆,Smalltalk感觉非常现代:有lambdas、异常、垃圾收集、可重写的自定义操作符、可供您使用的(非常)高级对象库、对象自省,所有这些都捆绑在40年前标准化的语言中。甚至对任何类都有“扩展方法”,这是当今任何Objective-C、C#、JavaScript、Swift或Kotlin开发人员都熟悉的概念。
然后就有了惊喜。IF/ELSE语句?留言。While循环?留言。操作员?留言。当然了!。一切都是对象。
在我的第一次接触中,Smalltalk感觉是永恒的。几乎没有需要学习的规则,以及支持我工作的稳定性和连贯性的巨大建设。引用杰弗里·詹姆斯和他的“编程之道”:
一个程序应该遵循“最小惊奇法则”。这条法律是什么?很简单,程序应该总是以最不令用户惊讶的方式响应用户。
在大约2个小时内,我就可以掌握Conway应用程序的核心元素的要点:Cell类、Coord类和一个主程序。我实现Conway的Game of Life的核心元素之一是使用Coord键和单元格值的字典;GNU Smalltalk的Dictionary类开箱即用;经过大约10个小时的工作,我让程序完全按照我想要的方式运行,包括单元测试。
回过头来看,要做的最复杂的事情是找出printPaddedWith:To:是Integer上的方法,而不是String上的方法。在其他语言中,这些东西也会让我感到头疼,就像每当我想要连接字符串数组时,Python都会得到我一样,然后我重新发现Join是String类上的方法,而不是Array类上的方法。不管怎么说。
最后,我发现可以通过向块发送重复消息来触发无限循环,我觉得这很棒。在Smalltalk中,一切都是对象。
尽管我发现GNU Smalltalk是“传统的”(在命令行意义上),但在编写Smalltalk的前几行时,我最大的问题是寻找帮助。说白了,官方的帮助页面太糟糕了。
我发现简明的Squeak指南是我能找到的最简单、最完整的小抄,我直接在里面找到了许多问题的答案。我极力推荐。
大量不同的Smalltalk方言给资源搜索带来了困难。Stack Overflow中的问题通常很少,并不总是有帮助,但值得庆幸的是,也有例外。
此外,遗憾的是,Smalltalk现在并不是一种真正的“主流”编程语言(我通过这种语言可以理解大量开发人员在行业中使用的语言)。在撰写本文时,该语言没有出现在TIOBE排名页面(甚至没有出现在“Next 50”列表中),也没有出现在PYPL排名中,并且大致出现在RedMonk排名图表的中间,没有进一步提及。这并不意味着Smalltalk语言实际上没有在行业中使用;我从同事那里听到很多公司仍然在使用它。但当然,这种情况可能比使用Java的情况要少几个数量级。
Smalltalk是编程史上一种非常重要的语言。我很快就重读了迈克尔·希尔特齐克(Harper Business,2000)在“闪电交易商”(Dealers Of Lightning)中关于Smalltalk的零星故事,这本书讲述了施乐的帕洛阿尔托研究中心(PARC)的故事,Smalltalk就是在那里创建的。我还重读了艾伦·凯(Alan Kay)在Bergin&;Gibson的“编程语言历史,第2卷”(Addison-Wesley Professional,1996)中的论文和演讲。后者包含第二届编程语言历史会议(HOPL II)的会议记录;还有一篇关于Smalltalk的论文将由Daniel Ingalls在即将召开的HOPL IV会议上发表。
哦,别忘了阅读Byte Magazine 1981年8月出版的关于Smalltalk的在线免费版。这是一件标志性的作品。
我在网上发现了不少关于Smalltalk的傲慢观点。我倾向于不喜欢他们。作为一种表达工具,Smalltalk在其社区中不需要这样的态度。我宁愿继续阅读Bret Victor关于Smalltalk的文档汇编;Squeak文档网站上的官方论文和书籍列表;在线Smalltalk报告的完整集合;关于Pharo的书籍;关于GNU Smalltalk的免费电子书;以及由Stéphane Ducasse汇编的免费的绝版Smalltalk书籍列表。
最后,如果您对标准感兴趣,您可以阅读1997年的ANSI Smalltalk标准,并对该语言的未来发展有更多了解。
在写这篇文章的时候,我想到了一个简单的想法:Smalltalk对编程的最大贡献是聚集在它周围的明星人物。阿黛尔·戈德伯格、艾伦·凯、丹尼尔·英格斯、沃德·坎宁安、布雷特·维克多,在我看来,他们中最重要的是肯特·贝克,他是本月本刊《图书馆》文章的主题。
Smalltalk银河起源于图形用户界面(GUI)、极限编程(XP)、设计模式、敏捷宣言、单元测试、维基,等等。
通过直接或间接地影响Objective-C和下一代工作站的设计,Smalltalk诞生了万维网、Doom,甚至Excel的数据透视表(一个现已被遗忘的电子表格Lotus Improv中引入了一个概念)。由于Java受到Objective-C的强烈影响,Smalltalk的遗产被放大了更多。
通过它的日本继承人Ruby,Smalltalk通过Ruby on rails点燃了Web2.0,并在其上构建了一长串突破性的服务。
我一直知道总有一天Smalltalk会取代Java。我只是不知道它会叫红宝石。
(肯特·贝克(Kent Beck)引用于:贾尔斯·鲍克特(Giles Bowkett,2007)“Smalltalk,Outside the象牙塔?”(在Giles Bowkett.blogpot.com,2007年7月15日-来源)。
在笔者看来,造成这种影响的原因是显而易见的。Smalltalk从一开始就将后期绑定和鸭子打字作为建模世界的方式。
在我们的生活中,似乎很少有东西是由编译器预先确定的;事物以不同的类型出现在我们面前,我们可以动态地查询这些事物,以了解更多关于它们的信息。我们可以在任意异构的集合中收集不同种类的对象。在这个我们称之为生活的运行时环境中,我们与我们周围的各种对象交互,与人交互,总是发送和接收消息。
Smalltalk将后期绑定方法调用的风险赌注发挥到了极致;这一选择不幸地在一开始就削弱了它的性能,在一定程度上损害了它在某些圈子中的声誉。但这首先也是最重要的一种选择,即赋予学者先驱们一个肥沃的操场,让他们在虚拟空间中重新想象我们的世界。
在我们围绕本月问题的谈话中,格雷厄姆非常简单而有效地总结了这种影响: