smalltalk不一致

spo*_*ang 6 oop smalltalk metaprogramming squeak

我是Smalltalk的新人,并在Squeak中学到了它.但我发现很多事情在Smalltalk中令人困惑.在佳乐,MetaClassMetaClass class彼此的相互类.如果我想创建对象,MetaClass我应该向new它的类发送一条消息MetaClass class.但它必须首先作为一个对象存在,才能接受这个消息.所以我必须首先创建对象MetaClass class,这只能通过向尚未创建new的对象发送消息来完成MetaClass.所以这是鸡蛋或鸡蛋问题.

当然我现在可以在Squeak中创建对象,因为在打开Squeak时已经自动神奇地创建了MetaClassMetaClass class对象.但我不知道怎么做.也许它们是以某种方式创建而不是通过发送消息.但它与Smalltalk的精神相矛盾:一切都是通过发送消息而发生的,除了几点(变量声明,赋值,返回和原语).

上述推理有什么问题吗?提前致谢.

Tob*_*ias 12

你的问题是双重的,让我们分开回答.

如何创建相互依赖的类?

你是对的,Metaclass并且Metaclass class在Smalltalk类和元类的并行层次结构中是一个奇点.它们是如何创建的?

这取决于您使用的Smalltalk.对于GNU Smalltalk,我不确定,但对于原始Smalltalk-80(VisualWorks,VA aka VisualAge,SqueakPharo)的后代,它们是在Bootstrap过程中创建的,用于创建初始图像.

然而,至少对于Squeak来说,这个引导程序至少发生在15年前,如果不是更多的话.Metaclass它的班级甚至可能长达30年.

简而言之,这两个类都是在典型的图像处理之外创建的,并且手动链接在一起.

但如果物品已经存在多年,那就会产生问题

Smalltalk创业公司会发生什么?

与Ruby或Python等面向对象的语言相反,Smalltalk也不需要像Object每次启动时那样创建基本的对象环境.为什么?

当Smalltalk保存并关闭时,它基本上会获取其所有对象的快照,并将这些活动对象保存到文件中.当它再次启动时,它只需要从快照中读取对象并"恢复"它们.

因此,对于MetaclassMetaclass class,两个对象都从快照中读取并恢复,从这一点开始,它们完全正常运行; 它们不需要再手动创建.


Joh*_*n B 11

"自动创建"过程实际上称为bootstrapping.这就是鸡蛋问题得到解决的方法.一旦系统被引导,所有其余的都可以用系统本身表示.因此,与Smalltalk的理念并不矛盾,即所有事情都是通过发送消息而发生的,因为一旦它被引导,它就变成了一个Smalltalk系统.


aka*_*ice 8

Metaclass class class = Metaclass是一个奇怪循环的经典学术范例.但是如果你稍微询问一下,你可以在Smalltalk中找到很多其他人.

  • 对象超类是nil,它是UndefinedObject的一个实例,它是Object的子类(通过Squeak中的ProtoObject更长链Object superclass superclass class superclass = Object)
  • MethodDictionary的方法存储在MethodDictionary(MethodDictionary methodDictionary class = MethodDictionary)的实例中.
  • Symbol的名称是Symbol的一个实例(与Squeak中的ByteSymbol一起使用ByteSymbol name class = ByteSymbol).
  • ArrayedCollection的子类存储在Array的实例中,Array是ArrayedCollection(Array superclass subclasses class = Array)的子类.
  • Smalltalk是一个SystemDictionary,它通过#Smalltalk键指向Smalltalk(这在Squeak中不太直接(Smalltalk globals at: #Smalltalk) = Smalltalk).

我让你自己继续列表.

无论实现什么,最终的问题是你是否可以设计一个像Smalltalk这样的自我描述系统而没有这些奇怪的循环,如果你遵循http://en.wikipedia.org的子链接,你可能会瞥见一个不那么正面的答案./维基/ Kurt_G%C3%B6del#The_Incompleteness_Theorem

与此类系统遇到的引导问题相关,一种有效的方法是克隆自己以改变自己,当您想要更改用于更改/描述类的基类时,在Smalltalk映像中尤其如此.
因此,我的先前和简明的答案通过应用规则的字母(https://stackoverflow.com/help/deleted-answers)而删除,而不是我认为的精神:

以下是解决方法: http ://en.wikipedia.org/wiki/Drawing_Hands

最后一点,我宁愿阅读,Smalltalk的难以置信的一致性,但我绝对有偏见.

  • @spockwang它不是一本书,它是对Smalltalk比任何主流语言更加一致的事实的参考 (3认同)