我现在正在学习 Smalltalk。它看起来和 python 很像(其实恰恰相反,python 和 Smalltalk 很像),所以我在想,作为一个 python 爱好者,是否真的值得我去研究它。
除了消息传递之外,Smalltalk 和 python 之间还有哪些显着的概念差异可以让我看到新的编程视野?
在 Python 中,诸如if/else
短路布尔运算符和循环之类的“基本”结构是语言本身的一部分。在 Smalltalk 中,它们都只是消息。从这个意义上说,虽然 Python 和 Smalltalk 都同意“一切都是对象”,但 Smalltalk 更进一步,它还断言“一切都是消息”。
[编辑] 一些例子。
Smalltalk 中的条件语句:
((x > y) and: [x > z])
ifTrue: [ ... ]
ifFalse: [ ... ]
注意and:
is 只是一条消息Boolean
(它本身是作为传递消息的结果而产生的>
)x
,并且第二个参数 ofand:
不是一个普通的表达式,而是一个块,可以实现惰性(即短路)评估。这会产生另一个Boolean
对象,它也支持消息ifTrue:ifFalse:
,将另外两个块(即 lambdas)作为参数,并根据布尔值运行一个或另一个。
作为 smalltalk 的新手,真正让我印象深刻的两件事是基于图像的系统,而这种反射无处不在。这两个简单的事实似乎引发了系统中其他很酷的东西:
以上所有内容开始以很酷的方式结合在一起:
大约三十年来,图像系统和反射使所有这些对于一个说小话的人来说完全自然和正常的事情。
Smalltalk 历史上内置了一个令人惊叹的 IDE。我在许多语言上都错过了这个 IDE。
Smalltalk 还具有它通常存在于生命系统中的可爱特性。你开始干净并开始修改东西。这基本上是一个对象持久存储系统。话虽如此,这有好有坏。您运行的内容是您系统的一部分,也是您发布的内容的一部分。该系统可以在分发之前很好地设置。不利的一面是,系统将您运行的所有内容作为您交付的一部分。您需要非常小心地重新分配包装。
现在,话虽如此,我已经有一段时间没有使用 Smalltalk(大约 20 年了)。是的,我知道,对于那些做数学的人来说,这是一段有趣的时光。Smalltalk 是一门很好的语言,编程很有趣,学习也很有趣,但我发现把东西放进去有点困难。
如果你愿意,享受玩它。我一直在玩 Python 并喜欢它。
雅各布
Smalltalk 语言本身非常重要。它包含一小组强大的正交特性,使语言具有高度可扩展性。正如 Alan Lovejoy 所说:“Smalltalk 也很有趣,因为定义和使用特定领域的语言并不是事后的想法,它是 Smalltalk 工作的唯一方式。” 语言符号非常重要,因为:“所使用的编程符号的表达能力的差异确实很重要。” 有关更多信息,请在此处阅读全文。
语言方面通常并不那么重要,而且许多语言都非常相似,
据我所知,Python 和 Smalltalk 共享 OOP 理念……但它们的实现和所呈现语言接口的功能却大不相同。
真正的价值在于语法的细微差别在实现方面所允许的。看看 Self 和其他重元语言。
看看语法和直接语义,看看细微的差异允许实现做什么。
例如:
Smalltalk-80 中的所有内容都可以在正在运行的程序中进行修改
Python 和 Smalltalk 之间的哪些差异允许更深入的操作(如果有的话)?该语言如何实现编译器/运行时?