Smalltalk和Python之间的区别?

10

我现在正在学习Smalltalk。它看起来非常类似于Python(其实相反,Python很像Smalltalk),所以作为一个Python爱好者,我想知道是否值得学习。

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


离题问题:你用什么来运行Smalltalk?多年前我找到的唯一东西是Squeak,但我不太喜欢它。你现在用什么来学习呢? - OscarRyz
我刚刚安装了Squeak,但也有GNU Smalltalk。不幸的是,我需要Fink来运行后者,而我懒得在我的旧笔记本电脑上安装Fink。 - Stefano Borini
5个回答

18
在Python中,“基本”结构如if/else、短路布尔运算符和循环都是语言本身的一部分。在Smalltalk中,它们只是消息。从这个意义上说,虽然Python和Smalltalk都认为“每个东西都是一个对象”,但Smalltalk更进一步,还断言“每个东西都是一个消息”。
[编辑]举几个例子。
在Smalltalk中的条件语句:
((x > y) and: [x > z])
  ifTrue: [ ... ]
  ifFalse: [ ... ]

注意,and:只是在Boolean上的一个消息(它本身作为将消息>传递给x的结果),而and:的第二个参数不是一个简单的表达式,而是一个代码块,使得惰性(即短路)求值成为可能。这会得到另一个Boolean对象,它也支持消息ifTrue:ifFalse:,接受另外两个代码块(即lambda)作为参数,并根据布尔值运行其中一个或另一个。


7
一切皆可变的元崩狂潮......我非常喜欢它。 - Aiden Bell
看看Viewpoints的研究...这会让你大开眼界。 - Aiden Bell
4
非常接近,ifTrue:是发送给布尔值的一条消息,它接受一个代码块作为参数。 - Chuck
@AidenBell 你提到的Viewpoints研究是什么?我想要被震撼到,请告诉我。 - undefined

10
作为一个初学Smalltalk的人,真正打动我的两件事是基于图像的系统以及反射无处不在。这两个简单的事实似乎催生了系统中所有其他酷炫的功能:
- 图像意味着您通过操作对象来完成所有事情,包括编写和编译代码。 - 反射允许您检查任何对象的状态。因为类是对象且它们的源也是对象,所以您可以检查和操作代码。 - 您可以访问当前执行上下文,因此可以查看堆栈,从而查看已编译代码及其源等等。 - 堆栈是一个对象,因此您可以将其保存并稍后恢复。轻松实现续延! - 所有以上内容开始以酷炫的方式组合在一起: - 浏览器可让您探索字面上所有东西的源代码,包括Squeak VM中的源代码。 - 您可以进行更改,影响您的活动程序,因此无需重新启动并导航到您正在处理的任何内容。 - 更好的是,当您的程序抛出异常时,您可以调试活动代码。您修复错误,如果状态不一致则更新状态,然后让程序继续执行。 - 浏览器会告诉您是否存在拼写错误。 - 轻松浏览类层次结构,查找对象响应的消息,发送给定消息的代码,或者可以接收给定消息的对象。 - 您可以检查和操作系统中任何对象的状态。 - 使用become:您可以使任意两个对象文字上切换位置,这让您可以疯狂地做一些事情,例如将任何对象存根化,然后在需要时从其他地方惰性地引入它。
图像系统和反射已经使得这些对于Smalltalker来说成为自然而然的事情已经有30年了。

7
Smalltalk历史上拥有一个了不起的IDE。我在许多语言中都错过了这个IDE。
Smalltalk还具有可爱的特性,通常是在一个活动系统中。您启动干净并开始修改内容。这基本上是一个对象持久存储系统。话虽如此,这既有好处也有坏处。您运行的内容是您的系统和您所发布的一部分。在分发之前可以很好地设置系统。缺点是,系统中包含您所运行的所有内容作为您所发布的一部分。在重新分发时需要非常小心打包。
话虽如此,我已经有一段时间没有使用Smalltalk了(约20年)。是的,我知道,对于那些做数学的人来说是有趣的时光。Smalltalk是一种不错的语言,有趣的编程方式,有趣的学习方式,但我发现它有点难以发布。
如果您喜欢,请享受使用它。我一直在玩Python并且很喜欢。
Jacob

这个IDE看起来确实很可爱。如果我能看到一些代码……那就更好了。 - Stefano Borini

3

Smalltalk语言本身非常重要。它由一组强大而正交的特性组成,使得该语言具有高度可扩展性。正如Alan Lovejoy所说:“Smalltalk之所以有趣是因为定义和使用特定领域语言(DSL)不是事后想法,而是Smalltalk工作的唯一方式。” 语言符号表示法非常关键,因为“所使用的编程符号表达能力的差异确实很重要”。欲了解更多信息,请在此处阅读完整文章。


2
语言方面通常并不是非常重要,很多语言都非常相似。据我所见,Python和Smalltalk分享面向对象编程理念…但在它们的实现和呈现语言界面的强大性方面却有很大区别。
真正的价值在于语法的微妙差异对于实现的影响。看看Self和其他元编程语言。
请不要只看语法和直接的语义,还要看微妙差异所允许实现做什么。
例如:
Smalltalk-80中的所有东西都可以在运行程序中进行修改。
Python和Smalltalk之间的差异有哪些允许更深入的操作?语言如何使编译器/运行时实现?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接