70

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

4

12 回答 12

91

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

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

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

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

还有其他与 Smalltalk 相关的事情并没有真正成为主流:

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

公平地说,Java 集合 API 和apache-commons 集合API 深受 Smalltalk 的影响。

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

请注意,目前这里只有 123个关于该语言的问题,该语言最初是由其创建者 Alan Kay 作为一种教育语言(即针对儿童)而设计的。它不再被特别频繁地使用。这并不是说它没有被使用。例如,摩根大通有一个大型的奇异衍生品风险管理系统。

于 2009-11-30T17:48:23.377 回答
49

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

  • 成为有史以来第一个 IDE
  • 为使用鼠标的 GUI 提供编程支持如果您学习 Smalltalk GUI 编程,那么您真的会正确理解 MVC。
  • 由少量强大的想法构建而成,这些想法非常好地协同工作
  • Smalltalk的方式不是因为意外行为而崩溃——而是适应。如果您向不理解的对象发送消息,调试器会出现并邀请您编写该方法……因此它为增量开发提供了极好的支持
  • IDE、您正在编写的应用程序和您的数据都是同一个系统的一部分——因此您可以更轻松地编写自己的工具和调试仪器。
  • Smalltalk 中的TDD 工具集仍然比任何其他语言都要好(见下文)。
  • Squeak Smalltalk 有相当多的前沿设计研究:
    • morphic UI——你可以熟悉“liveness”的概念
    • seaside web 框架 -了解什么是延续服务器以及它有何根本不同
    • Squeak 与 OLPC 软件(每个孩子一台笔记本电脑)项目有着密切的联系- 并且可能对世界产生重大影响。
    • 找出什么是“特质” ...
    • 玩名为 Open Croquet的激进 3D 沉浸式环境。
  • 因为 Smalltalk 是一种更小、更简单且更一致的语言,所以它有自己的内置环境,是开始教授 OOP 的一个不那么令人困惑的地方。走这条路的人最终会成为更好的 Java、Ruby 和 C# 程序员,因为他们可以学习基本的 OOP,而不会遇到主流语言的所有混乱矛盾。
  • 一些商业 Smalltalks 拥有令人惊叹的多节点分布式 OO 数据库环境。我在想宝石。
  • 知道 Model-View-Controller 和 Model-View-Presenter 的区别——看看 Dolphin Smalltalk...

今天学习 Smalltalk 的一个最重要的原因是极限编程和 scrum 都是在 Smalltalk 社区中发明的……而且你在 Smalltalk 中体验到的高度交互的编程风格比你用 Java 做的任何事情都更简单、更强大和更直接或 C# 或 Ruby...在您尝试在 Smalltalk 中进行极限编程之前,您无法真正理解敏捷方法的工作原理。很少有其他语言(反正没有主流语言)有类似的功能集。

...要真正了解 TDD 可以是什么,您需要使用 SUnit。JUnit 只是向您显示测试失败的地方。SUnit 实际上允许您在测试失败的地方单击调试器并查看实际对象以及它们是如何连接的,这样您就可以在调试器中看到代码是如何失败的并在那里修复它。

于 2009-11-30T18:54:29.190 回答
22

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

  • 足够简单,因此您可以理解整个语言

  • 将一个想法(你只需要对象)推到逻辑极端

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

于 2009-12-01T01:28:07.083 回答
19

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

今天,Smalltalk 本身并不是特别重要 - 有些人仍在使用它来写东西,但它绝对不是主流。然而,学习它将使您对 OOP 如何以及为何演变有所了解。

于 2009-11-30T17:47:25.783 回答
12

上个月,我在一次关于 Smalltalk 的历史和影响力的会议上做了大约 5 分钟的演讲。请参阅使用 Smalltalk 进行基于图像的开发。对于今天的程序员来说,比较陌生的概念之一是“基于图像”的开发。有一些很好的类比,包括 DBMS 和电子表格。

于 2009-12-03T00:03:44.063 回答
9

是的。下载海边的一键图片,按照詹姆斯福斯特的教程开始使用,你至少会学到:

  • 应该如何构建 Web 应用程序
  • 调试应该如何工作
于 2009-12-02T23:10:43.217 回答
6

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

这些天我不会推荐 Smalltalk 用于任何密集的桌面应用程序开发(IMO 只是没有一个可行的实现),但如果你想了解 OO 的意义,也许会找到一些你可以在你的应用程序中使用的想法, Smalltalk 是一个很好的地方。

于 2009-11-30T18:03:40.897 回答
6

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

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

它一开始有点违反直觉,但它确实让你对 OO 编程应该如何工作有一个非常有趣和深刻的看法......

于 2009-11-30T18:54:07.363 回答
5

如果你只知道一门面向对象的语言,你应该考虑学习第二门、第三门和第四门,以便对对象编程有更广阔的视野。学习 Smalltalk 会让您的大脑更加灵活,因为 Smalltalk 中没有我们在其他语言中使用的许多熟悉的概念(例如 if-then-else、for(;;)、while() 等)。显然,有等价物,但 Smalltalk 做事不同,学习不同的做事方式总是一个好主意。

祝你好运。

于 2009-12-03T12:30:31.820 回答
5

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

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

这些都不能使它对不从事软件开发业务的人特别有用。我第一次接触它是在我看到使用 Smalltalk 在 PC 上制作原型的嵌入式设备的用户界面时。这使得用户界面可以非常快速地进行修改和测试,并且在完成后,为嵌入式开发人员提供了一个比任何文档都精确得多的“可执行规范”。令我惊讶的是,在过去 20 年的旅行中,我从未见过这种技术的使用频率比我在旅行中观察到的频率高得多。

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

于 2010-04-02T22:29:21.930 回答
3

关于 SmallTalk 的另一件事是它的校友包括 Kent Beck 和 Ward Cunningham。他们与 SmallTalk 的合作催生了自动化 xUnit 测试软件设计模式CRC 卡和其他融入 XP/Agile 等的实践。因此可以说,SmallTalk 一直是现代编程领域的主要贡献者。

于 2009-12-01T07:42:31.383 回答
3

只有两条评论:

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

  2. Smalltalk 不是一种语言,是一种有语言(同名)的环境,但这里的大部分“魔法”都归功于环境(图像)。

于 2009-12-05T23:11:04.423 回答