10

我现在正在学习 Smalltalk。它看起来和 python 很像(其实恰恰相反,python 和 Smalltalk 很像),所以我在想,作为一个 python 爱好者,是否真的值得我去研究它。

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

4

5 回答 5

18

在 Python 中,诸如if/else短路布尔运算符和循环之类的“基本”结构是语言本身的一部分。在 Smalltalk 中,它们都只是消息。从这个意义上说,虽然 Python 和 Smalltalk 都同意“一切都是对象”,但 Smalltalk 更进一步,它还断言“一切都是消息”。

[编辑] 一些例子。

Smalltalk 中的条件语句:

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

注意and:is 只是一条消息Boolean(它本身是作为传递消息的结果而产生的>x,并且第二个参数 ofand:不是一个普通的表达式,而是一个块,可以实现惰性(即短路)评估。这会产生另一个Boolean对象,它也支持消息ifTrue:ifFalse:,将另外两个块(即 lambdas)作为参数,并根据布尔值运行一个或另一个。

于 2009-08-12T23:24:01.217 回答
10

作为 smalltalk 的新手,真正让我印象深刻的两件事是基于图像的系统,而这种反射无处不在。这两个简单的事实似乎引发了系统中其他很酷的东西:

  • 图像意味着您通过操作对象来完成所有事情,包括编写和编译代码
  • 反射允许您检查任何对象的状态。由于类是对象,它们的源是对象,因此您可以检查和操作代码
  • 您可以访问当前的执行上下文,因此您可以查看堆栈,并从那里查看已编译的代码和该代码的源等等
  • 堆栈是一个对象,因此您可以将其保存起来,然后再继续。宾果游戏,继续!

以上所有内容开始以很酷的方式结合在一起:

  • 该浏览器可让您探索几乎所有内容的来源,包括 Squeak 中的 VM
  • 您可以进行影响直播节目的更改,因此无需重新启动并导航到您正在处理的任何内容
  • 更好的是,当您的程序抛出异常时,您可以调试实时代码。您修复错误,如果它变得不一致则更新状态,然后让您的程序继续。
  • 浏览器会告诉你它是否认为你打错了
  • 向上和向下浏览类层次结构非常容易,或者找出对象响应什么消息,或者哪个代码发送给定消息,或者哪些对象可以接收给定消息
  • 您可以检查和操作系统中任何对象的状态
  • 您可以使用 become: 使任何两个对象从字面上交换位置,这可以让您做一些疯狂的事情,例如将任何对象存根,然后如果它发送了消息,则懒惰地从其他地方将其拉入。

大约三十年来,图像系统和反射使所有这些对于一个说小话的人来说完全自然和正常的事情。

于 2009-08-13T09:34:40.513 回答
7

Smalltalk 历史上内置了一个令人惊叹的 IDE。我在许多语言上都错过了这个 IDE。

Smalltalk 还具有它通常存在于生命系统中的可爱特性。你开始干净并开始修改东西。这基本上是一个对象持久存储系统。话虽如此,这有好有坏。您运行的内容是您系统的一部分,也是您发布的内容的一部分。该系统可以在分发之前很好地设置。不利的一面是,系统将您运行的所有内容作为您交付的一部分。您需要非常小心地重新分配包装。

现在,话虽如此,我已经有一段时间没有使用 Smalltalk(大约 20 年了)。是的,我知道,对于那些做数学的人来说,这是一段有趣的时光。Smalltalk 是一门很好的语言,编程很有趣,学习也很有趣,但我发现把东西放进去有点困难。

如果你愿意,享受玩它。我一直在玩 Python 并喜欢它。

雅各布

于 2009-08-12T23:24:14.757 回答
3

Smalltalk 语言本身非常重要。它包含一小组强大的正交特性,使语言具有高度可扩展性。正如 Alan Lovejoy 所说:“Smalltalk 也很有趣,因为定义和使用特定领域的语言并不是事后的想法,它是 Smalltalk 工作的唯一方式。” 语言符号非常重要,因为:“所使用的编程符号的表达能力的差异确实很重要。” 有关更多信息,请在此处阅读全文。

于 2015-11-26T02:49:51.803 回答
2

语言方面通常并不那么重要,而且许多语言都非常相似

据我所知,Python 和 Smalltalk 共享 OOP 理念……但它们的实现和所呈现语言接口的功能却大不相同。

真正的价值在于语法的细微差别在实现方面所允许。看看 Self 和其他重元语言。

看看语法和直接语义,看看细微的差异允许实现做什么。

例如:

Smalltalk-80 中的所有内容都可以在正在运行的程序中进行修改

Python 和 Smalltalk 之间的哪些差异允许更深入的操作(如果有的话)?该语言如何实现编译器/运行时?

于 2009-08-12T23:25:26.237 回答