是否存在不基于类的面向对象的编程语言?


44

是否有任何不基于类范式的面向对象的编程语言


1
从技术上讲,C。尽管定向很容易理解,但从语言的角度来看,它是一种延伸。我知道这不是您要寻找的答案,但是,如果您希望研究C的工作方式,它可能会提供一些有关类实际作用以及替代方法如何工作的见解。
kylben

4
@kylben:“定向”是一种不可取的延伸。您可以将C压缩为面向对象的行为。您不能轻率地将其定向为这种方式。
David Thornley

Answers:


74

据我所知,Self是发明基于原型的“无类”范例的原始语言。它早在1980年代就已经存在(处于实验阶段),并将Smalltalk原型模式的优雅使用推向了极致,从而完全消除了类。

它影响了我所知道的所有其他“无类” OO语言:

  • 最著名的Javascript
  • 经典的编程语言和环境Squeak(基于Smalltalk构建)
  • 多范式脚本语言Lua

2
@Adam:没有静态类型,难道不是全部都是语法糖吗?
凯文·克莱恩

5
@DeadMG OO语言不是使您能够实现OO思想的一种语言,而是为您实现的一种方法:)
Piotr Dobrogost 2011年

4
实际上,无论是Simula(1960)还是Smalltalk-71(以及Smalltalk-72)都没有上课,这比Self早了近三十年。仅在Simula-67和Smalltalk-74中添加了类(Alan Kay认为它们是一个错误,或更确切地说是必要的邪恶)。
约尔格W¯¯米塔格

2
@kevincline:不确定您基于什么;OO和静态类型是完全正交的。
Paul Biggar

2
除Simula(采用类范例)外,1979年MIT还引入了Flavors,它是CLOS的前身,两者均早于Self。
马修·弗林

32

像JavaScript这样的语言是基于原型的,通过克隆现有对象来重用行为。我链接到的Wikipedia文章表明Lua,ActionScript和许多其他语言都遵循此范例。


2
任何ECMAScript变体都使用原型范例。
zzzzBov

好吧,几乎任何变体。尽管基础VM可能会根据原型来实现它们,但是ActionScript(Flash语言)使用了类。
mjfgates 2011年

@ mjfgates,ActionScript 2以前是基于ECMAScript的,与Javascript非常相似。Actionscript 3正在远离这一点,但仍保持其动态特性。您可以对任何变量进行强/弱类型的输入,因为从本质上讲,所有内容都是对象。
2011年

13

世界上最流行的面向对象编程语言没有类,它被称为Javascript且基于原型:http : //en.wikipedia.org/wiki/Prototype-based_programming


11
“世界上最流行的面向对象编程语言”?我完全不确定那个说法。
Thomas Owens

8
@ThomasOwens,由于它包含在网络中,因此您可以轻松地说,每个支持Web的现代平台(包括移动设备)都包含一个JavaScript解释器。这是目前最流行的基于原型的语言,这是一个非常有力的案例。(除非您认为可以对“ SELF”做出类似的论点)
riwalk

1
Javascript当然是世界上使用最广泛的编程语言之一,但是我希望大多数用法都是古老的命令式或过程式,也许这里有一些面向方面的编程(回调?AJAX?事件处理程序?)。在那里,因此将javascript称为“最受欢迎的OOP语言”还不够合理。
tdammers 2011年

9
我也要说“无处不在”,以避开对其受欢迎程度的讨论。
Anthony Pegram

3
@ Stargazer712:我不喜欢成为语言迷,但他确实声称“世界上最流行的面向对象编程语言[ed:Javascript]没有类”。它可以分解为两个主张:“ Javascript是最流行的面向对象编程语言”和“ Javascript没有类”;我都同意。
Lie Ryan

6

面向对象是几个重要概念的总称,这些概念仅部分地相互依赖。例如,继承可以在实例之间而不是在类之间根据情况进行声明,或者prototype像Thomas所写的那样,整个类可以由具体对象表示 。将结构描述与实例创建分开是更常见的做法。同样,后期绑定意味着具有名义上相同方法的对象在调用时不一定执行相同的操作,并且决策是在运行时做出的。使用基于原型的方法同样可能。封装本质上完全独立于您的对象是否是已声明类的实例。

也就是说,大多数面向对象的语言都牢牢地基于类。但是即使那样,也有一些习惯用法使界限模糊:领域驱动的设计通常会导致系统中特定对象的标识比静态类图重要得多,并且装饰器允许相同类或接口的对象具有非常高的静态性。不同的行为。


6

Fortress是一种基于特征而非类的面向对象的语言。区别主要在于实现组成。对象的行为(方法定义)仍然由程序文本中特定点处的声明确定。因此从某种意义上讲,它类似于基于类的系统。

有一些对象计算(我认为是Cardelli),完全基于对象。每个方法都是实例成员。您可以通过获取现有对象的内容并添加,删除或替换其某些成员来形成新对象。它与原型稍有不同,因为新对象没有指向旧对象的链接,只是其中的一些内容。

IIRC,可以使用Python和其他面向哈希表的语言以类似的方式进行编程:您可以将函数添加为实例成员,然后将其作为方法调用。


5

Ada,自1995年修订版起,Ada是面向对象的,但是与许多其他OO语言不同,它没有将面向对象的类型和模块组合到称为“类”的单个结构中。您无需声明一个类型为“ class Foo”,而是将所有关联的方法声明放入该类声明中,而是声明一个并声明该类型(作为record)和包中的其他内容。它不是像其他提到的语言那样“无类”的,它只是组织事物的方式略有不同。

Ada 95的面向对象功能已添加到该语言的现有1983版本中。它扩展了现有的记录和包结构以支持继承等。


这就是我记得的,您还需要将记录传递给每个成员函数
Nikko,

@Nikko:这就是每种面向对象语言在幕后发生的事情,并且在Python和CLOS(常见的lisp)中相当明显地发生了。
Marcin

5

Io是另一种基于原型的面向对象语言。实际上,它是从其他答案中已经提到的几种语言中汲取灵感的。

IO是一种动态的基于原型的编程语言。Io中的思想主要受Smalltalk(所有值都是对象),Self(基于原型),NewtonScript(差异继承),Act1(并发的actor和future),Lisp(代码是运行时可检查/可修改的树)和Lua(小,可嵌入)。


4

二郎 是的,Erlang 一种面向对象的语言,因为它满足了OO定义的所有三个方面。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.