Smalltalk有什么特别之处?[关闭]


70

在每个技术出版物以及该站点上,人们总是将OO语言与Smalltalk进行比较。我的Java经验是:Smalltalk是否如此重要以至于我应该学习它?

Answers:


90

Smalltalk是最早的面向对象(OO)语言之一(与SimulaEiffel等其他语言一样),并且可以说在OO方面非常“纯”:

  • 一切都是对象,对象仅通过发送消息进行通信
  • 没有原语(没有ints,booleans等)
  • 无控制结构(无forwhileif等)。听起来不可能,但这是真的!
  • 无静电

它还开创了其他一些现在很常见的东西:

  • 虚拟机(和JIT编译)
  • 通过检查进行调试
  • “热交换”运行代码
  • 现代IDE
  • 关闭
  • 鸭打字
  • UI的模型视图控制器(MVC)架构
  • 测试驱动开发(TDD)和敏捷方法

还有与Smalltalk相关的其他东西,它们并没有真正成为主流:

  • 基于“图像”的系统而不是基于文件的系统。
  • 面向对象的数据库

可以说Java集合API和apache-commons集合API受Smalltalk的影响很大。

我不会说您应该学习Smalltalk本身,但是熟悉这些功能的基础知识(现在已经以许多其他语言提供)肯定对您有利。

请注意,目前在这里只有123个关于该语言的问题,该语言最初是由其创建者艾伦·凯(Alan Kay)用作教育语言(即针对儿童的)。它不再被特别大量地使用。这并不是说它没有被使用。例如,摩根大通(JPMorgan)编写了一个庞大的外来衍生品风险管理系统。


8
Smalltalk肯定不是关闭的先驱-Lisp在那之前很久就这么做了。
帕维尔·米纳夫

3
我不一定是说“先驱者”是第一个。我真的只是说它是第一个。你知道的,就像美国的先驱一样。他们几千年后到达
oxbow_lakes

3
您可以将“测试驱动的开发”添加到先锋列表中。
阿库恩

7
MVC也诞生了Smalltalk
Z-index,2009年

3
重构在Smalltalk中还使用重构浏览器开创了先河。
ewernli 2010年

49

Smalltalk具有许多出色的创新-今天我们都认为这是理所当然的事情,包括:

  • 成为第一个IDE
  • 用鼠标为GUI提供编程支持如果您学习Smalltalk GUI编程,您确实会正确理解MVC。
  • 由少数几个强有力的想法共同构建而成
  • Smalltalk的方式是不碰撞出的意外行为-这是适应。如果将消息发送给不了解的对象,调试器将启动并邀请您编写该方法...,因此它为增量开发提供了出色的支持
  • IDE,您正在编写的应用程序和数据都属于同一系统-因此您 可以更轻松地编写自己的工具和调试工具。
  • Smalltalk中TDD工具集仍然比任何其他语言都更好(请参阅下文)。
  • Squeak Smalltalk具有相当多的前沿设计研究:
    • Morphic环UI -你可以得到熟悉的“活跃度”的概念
    • 海边的Web框架-了解什么是Continuation Server以及其与众不同
    • Squeak与OLPC软件(每个孩子一台笔记本电脑)项目有着紧密的联系-可能会对世界产生重大影响。
    • 找出什么是“特质”...
    • 体验名为Open Croquet的激进3D沉浸式环境
  • 由于Smalltalk是一种更小,更简单和更一致的语言,它拥有自己的内置环境,因此开始讲授OOP的地方就不那么混乱了。走这条路的人最终会成为更好的Java,Ruby和C#程序员,因为他们可以学习基本的OOP,而不会遇到主流语言的所有混乱情况。
  • 一些商业Smalltalks具有惊人的多节点分布式OO数据库环境。我在考虑宝石。
  • 知道Model-View-Controller和Model-View-Presenter之间的区别-查看Dolphin Smalltalk ...

今天学习Smalltalk的最重要的原因是,极限编程和Scrum都是在Smalltalk社区中发明的……与在Java中所做的任何事情相比,您在Smalltalk中体验到的高度交互的编程风格更简单,更强大,更直接。或C#或Ruby ...,直到您尝试在Smalltalk中进行极限编程之前您才能真正理解敏捷方法的效果。很少有其他语言(无论如何也没有主流语言)具有可比较的功能集。

...要真正了解什么是TDD,您需要使用SUnit。JUnit仅向您显示测试失败的地方。实际上,SUnit允许您在测试失败的位置单击调试器,查看实际对象及其连接方式,以便您可以在调试器中看到代码失败的原因并在那里进行修复。


22

是的,Smalltalk非常重要,您应该学习它。为什么?您可以以纯粹,简单的形式理解面向对象的编程。人们会忘记的是,Smalltalk-80“蓝皮书”只有大约90页专门针对该语言,而该语言就是这么简单。其他300页讨论了预定义的类层次结构,这是使用单一继承的基于类,面向对象的语言的设计杰作。与研究对象相比,您将对对象有更深入的了解(例如,类是对象,并且它们具有元类,以此类推,直到无穷大……除非结被小心地绑住以保持系统有限)。混合语言,例如Java或C ++。Smalltalk的重要性不仅在于其历史,还在于其简单性:

  • 非常简单,因此您可以理解整个语言

  • 显示一个想法(您所需要的全部)推到了逻辑极限

每个人都可以从Smalltalk中学习一些东西!


19

Smalltalk是最早的两种原始OOP语言之一,另一种是Simula-67。因此,有两个大家族-以方法调用为中心的静态类型模型(由Simula倡导(C ++,Java,C#都属于此处))和以消息传递为中心的动态类型模型(由Smalltalk倡导(Python,Ruby属于此处) )。

如今,Smalltalk本身并不特别重要-有些人仍在使用它来编写内容,但绝对不是主流。学习它可以使您对OOP的发展方式和原因有所了解。


4
我不知道在Smalltalk之后OOP是否会发展很多-好的,有Self和Newspeak,但是我不会说C ++,Java和C#是从Smalltalk演变而来的-它们更像是遗传回归... ;-)
达菲德里斯,

3
那是因为它们不是从Smalltalk演变而来,而是从Simula演变而来。
帕维尔米纳夫

2
我认为Java确实借鉴了一些Smalltalk的想法-一方面,它使虚拟机的想法得以恢复,Sun确实雇用了许多旧的Xerox Parc家伙来进行处理。
达菲德·里斯,2009年

这是因为Java源自Sun在重新实现Smalltalk以后所做的工作,因为他们拒绝了当他们想要许可Smalltalk时所获得的商业条款。
Euan M



6

我同意其他人。我不确定这是否重要本身,但是它很酷(恕我直言)。

我喜欢这种语言没有循环或条件。If-then-else是发送到布尔对象的消息。类型为True的对象做一件事,类型为False的对象做另一件事。(是,True和False是Boolean的子类型,分别具有一个值,分别为true和false)。

它开始有点违反直觉,但是确实为您提供了一个非常有趣的,深刻的,关于OO编程应如何工作的视图...


6

Smalltalk不仅是第一个,而且至今仍是面向对象语言设计的典范。后来出现的更流行的语言(C ++,Java甚至是Objective-C)都比原始的Smalltalk具有更原始的面向对象的语言和更严格的限制。Smalltalk具有无处不在的一流对象,对运行时自省的强大支持,非常自然地使用鸭子类型和闭包,这比我在任何非功能性语言中看到的效果都要好。我的意思是,我们所谈论的是一种语言,它没有本机控制结构(如果,等),但是能够以一种无缝工作的方式从其对象系统中创建它们。多么酷啊?

如今,我不建议Smalltalk进行任何密集型桌面应用程序开发(IMO只是一个不可行的实现),但是如果您想了解OO的含义,并想出一些想法可以在应用程序中使用,Smalltalk是一个不错的地方。


好吧,那真的是第二名((不是模拟游戏还是其他东西?)
Brian Postow

是的,我在那里有点波浪。Simula是第一位的,但是Smalltalk比Simula AFAICT更是现代OO编程的始祖。
Chuck

@Chuck:可以吗?Simula是Stroustrup创建C ++时对Stroustrup的主要影响力,而C ++影响了许多现代OO。我听说过Objective-C被描述为更像Smalltalk,但是C ++和受C ++启发的语言(因此也受到二手Simula的启发)更为普遍。
David Thornley,2009年

6
@查克:我不同意。粗略地看一下Simula报告就可以清楚地看出C ++本质上是将Simula放在首位的C语言,而C#更是如此。例如,诸如protected和的关键字virtual与Simula具有完全相同的含义。
帕维尔·米纳夫

那是个很好的观点。我确定我记得读过Stroustrup将Smalltalk归功于Smalltalk的内容,但是您是对的,现在您提到它与Simula有更多相似之处。我可能误会了。我会编辑。
Chuck

5

如果您只知道一种面向对象的语言,则应该考虑学习第二,第三和第四种知识,以便对使用对象进行编程有更广泛的认识。学习Smalltalk会动动您的大脑,因为我们在其他语言中已经习惯了很多熟悉的概念(例如if-then-else,for(;;),while()等)。显然有等效的方法,但是Smalltalk的做事方式有所不同,学习不同的做事方式总是一个好主意。

祝好运。


5

我刚刚开始恢复对Smalltalk的兴趣,在我看来,Smalltalk有一些引人注目的特殊之处:

  • 高效的开发环境
  • 内置对敏捷/极端编程方法的支持
  • “纯”对象模型
  • 易于使用的图形框架

这些都不对不从事软件开发业务的人员特别有用。我的第一次接触是当我看到使用Smalltalk在PC上原型化的嵌入式设备的用户界面时。这样就可以快速修改和测试用户界面,并在完成后为嵌入式开发人员提供了一个“可执行规范”,该规范比任何文档都要精确得多。令我感到惊讶的是,我没有发现这种技术的使用频率比过去20年来的旅行频率更高。

使用Smalltalk作为原型工具是我的兴趣所在:我认为,针对一个新问题,可以在Smalltalk环境中非常快速,轻松地尝试和验证解决该问题的不同方法,一旦找到所需的解决方案,它就应该相对机械的,可以将其转换为Java / C ++ / C#等。事实上,对于重复的事​​情,很可能可以使用Smalltalk为某些其他目标语言的解决方案的一部分生成代码。



3

仅有两条评论:

  1. Smalltalk不是对象“面向”的,而是真实的对象,只是环境中的对象和消息。

  2. Smalltalk不是一种语言,而是一种具有某种语言(同名)的环境,但是这里的大多数“魔术”都归功于该环境(图像)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.