Objective-C上没有Smalltalk运行时功能?

时间:2011-09-22 04:07:04

标签: objective-c language-features smalltalk

我不太了解Smalltalk,但我知道一些Objective-C。我对Smalltalk很感兴趣。

它们的语法有很多不同,但基本的运行时结构(即功能)非常相似。运行时支持运行时功能。

我认为两种语言在这个意义上非常相似,但Smalltalk上有许多功能在Objective-C运行时没有。例如,thisContext操纵调用堆栈。或者non-local return解除块执行。 block。它只在Smalltalk上,无论如何它现在也在Objective-C上实现。

因为我不是Smalltalk的专家,所以我不知道那种功能。特别适合高级用户。 Smalltalk中仅提供哪些功能?基本上,我想知道Smalltalk的高级功能。因此,已经在Objective-C上实现的功能就像block

一样

3 个答案:

答案 0 :(得分:7)

虽然我在Objective-C中有相当的经验,但我并不像Smalltalk那么精通,但我已经做了一些。

由于几个原因,很难真正列举哪种语言具有哪些功能。

首先,什么是“语言功能”?在Objective-C中,偶数块实际上是与Foundation API一起构建的,诸如for(... in ...)语法之类的东西需要符合相对高级别的协议。如果不考虑最重要的API的功能,你能真正谈论一种语言吗?同样适用于Smalltalk。

其次,两者在消息传递如何工作以及如何实现继承方面非常相似,但它们在代码从头脑中思考到在机器上运行的方式上也大不相同。在概念上不同的是,它使两者之间的特征逐个比较困难。

两者之间的关键区别实际上归结为它们的基础。 Objective-C建立在C之上,因此,继承了C的所有优势(速度,可移植性,灵活性等)和弱点(实际上是宏汇编程序,愚蠢的调用ABI,缺少任何类型的安全网) &安培;编译到金属语言。虽然Objective-C层叠在一堆相对较高级别的OO功能上,包括编译时和运行时,但由于C的性质,存在限制。

另一方面,Smalltalk采用了更多自上而下的纯OO模型;一切,直到一点点的表示,是一个对象。即使是调用堆栈,异常,接口,......一切......都是一个对象。 Smalltalk在虚拟机上运行,​​该虚拟机本身通常是一个相对较小的本机字节码解释器,它使用一小段字节码来实现更高级别的功能。在smalltalk中,它更少关于创建独立应用程序以及更多关于使用一组状态和功能来配置虚拟机,这些状态和功能呈现您需要的功能(其中该配置可以像应用程序一样有效地进行快照和分发)。 p>

所有这些意味着您始终 - 在锁定模式之外 - 拥有一个非常高级别的shell来与虚拟机进行交互。那个shell通常也是你的IDE。您不必使用edit-compile-fix-compile-run,而是在代码在语法合理的情况下立即生成的环境中编写代码。调试器,编辑器,运行时和程序之间的界限很模糊。

答案 1 :(得分:1)

不是语言功能,但大多数Objective-C框架的零食行为提供了与弹出式调试器,修复和继续smalltalk非常不同的开发体验。

尽管Objective-C现在支持块,但非常难看的语法不太可能导致很多用处。在Smalltalk块中使用了很多。

答案 2 :(得分:0)

Objective-C 2.0 supports blocks

它还具有return的非本地返回in the form,但您可能特别指的是作为参数传递给其他函数的块内的非本地返回。

据我所知,

thisContext并非得到普遍支持。当然,有些Smalltalks不允许使用continuation。这是VM提供的东西,所以我可以设想一个Objective-C运行时提供这样的设施。

Objective-C没有的是become:(它以原子方式交换两个对象指针)。再一次,这是VM提供的东西。

否则我不得不说,就像bbum指出的那样,主要区别可能是(a)工具/环境,因此(b)你从类似REPL的环境中得到的快速反馈。它确实感觉非常不同,在Smalltalk环境中工作并在Xcode中工作。 (我已经做到了。)