Smalltalk和Python的区别?

10 投票
5 回答
6204 浏览
提问于 2025-04-15 13:33

我现在在学习Smalltalk。这种语言看起来和Python很像(其实,反过来说,Python更像Smalltalk),所以作为一个Python爱好者,我在想,学习Smalltalk真的值得吗?

除了消息传递之外,Smalltalk和Python之间还有哪些显著的概念差异,可以让我看到新的编程视野呢?

5 个回答

7

Smalltalk 这个编程语言历史上有一个非常棒的集成开发环境(IDE),我在很多其他语言中都很想念这个环境。

Smalltalk 还有一个很特别的特点,就是它通常是在一个“活”的系统中运行。你可以从一个干净的状态开始,然后逐步修改和调整。这基本上就是一个对象持久存储系统。说到这里,这个特点有好有坏。你运行的内容是你系统的一部分,也是你要发布的内容。你可以在分发之前把系统设置得很好。但缺点是,系统里包含了你运行的所有东西,这些都会成为你发布的内容。所以在重新打包的时候,你需要非常小心。

不过,话说回来,我已经有一段时间没用 Smalltalk 了(大约 20 年)。是的,我知道,算算时间真有趣。Smalltalk 是一种很不错的语言,编程和学习都很有趣,但我发现用它来发布东西有点困难。

如果你有机会玩玩它,尽情享受吧。我最近在玩 Python,觉得非常好。

Jacob

10

作为一个刚接触Smalltalk的人,有两件事让我印象深刻:一个是基于图像的系统,另一个是反射到处都是。这两个简单的事实似乎为系统中的其他酷炫功能奠定了基础:

  • 图像意味着你可以通过操作对象来做所有事情,包括编写和编译代码。
  • 反射让你可以检查任何对象的状态。因为类也是对象,它们的源代码也是对象,所以你可以检查和操作代码。
  • 你可以访问当前的执行上下文,这样你就可以查看调用栈,从中找到编译后的代码及其源代码等等。
  • 调用栈也是一个对象,所以你可以把它保存起来,然后稍后再恢复。太棒了,这就是“继续”功能!

以上这些开始以很酷的方式结合在一起:

  • 浏览器让你可以探索几乎所有东西的源代码,包括Squeak中的虚拟机。
  • 你可以做出影响你正在运行的程序的更改,所以不需要重启程序,也不需要重新找到你正在处理的内容。
  • 更棒的是,当你的程序出现异常时,你可以调试正在运行的代码。你修复了错误,更新状态(如果它变得不一致),然后让程序继续运行。
  • 浏览器会告诉你它认为你是否打错了字。
  • 在类层次结构中上下浏览非常简单,或者找出一个对象可以响应哪些消息,或者哪些代码发送了某个消息,或者哪些对象可以接收某个消息。
  • 你可以检查和操作系统中任何对象的状态。
  • 你可以让任意两个对象互换位置,使用`become:`方法,这让你可以做一些疯狂的事情,比如暂时替换掉任何对象,然后在需要时从其他地方懒惰地拉回来。

基于图像的系统和反射让这些对于Smalltalk程序员来说,已经变得非常自然和正常,差不多有三十年了。

18

在Python中,像if/else这样的基本结构、短路布尔运算符和循环都是语言本身的一部分。而在Smalltalk中,它们都被视为消息。从这个角度来看,虽然Python和Smalltalk都认为“万物皆对象”,但Smalltalk更进一步,它还认为“万物皆消息”。

[编辑] 一些例子。

在Smalltalk中的条件语句:

((x > y) and: [x > z])
  ifTrue: [ ... ]
  ifFalse: [ ... ]

注意到and:只是对Boolean发送的一条消息(这个Boolean是通过对x发送消息>得到的),而and:的第二个参数不是一个普通的表达式,而是一个代码块,这样就可以实现懒惰求值(也就是短路求值)。这会产生另一个Boolean对象,它也支持消息ifTrue:ifFalse:,这个消息接受两个代码块(也就是lambda表达式)作为参数,并根据布尔值的结果来执行其中一个代码块。

撰写回答