Erlang是面向对象的吗?
消息传递是Erlang的一个基本部分。Alan Kay认为,在他面向对象编程的观点中,消息传递是一个比对象更重要的概念(他“发明”了这个术语!)Erlang是面向对象的吗?,erlang,oop,Erlang,Oop,消息传递是Erlang的一个基本部分。Alan Kay认为,在他面向对象编程的观点中,消息传递是一个比对象更重要的概念(他“发明”了这个术语!) Erlang可以被认为是一种面向对象的编程语言吗?(a la Smalltalk)?我认为在更高的层次上,Erlang是面向对象的,因为您相信围绕该术语讨论的原始概念。我指的是隔离、消息传递和多态性 Erlang的进程可以保持状态,在该状态下执行操作,并且它们与其他进程隔离,因为它们不能直接影响彼此。因为任何进程都可以接收任何消息(并且消息可以很容易地
Erlang可以被认为是一种面向对象的编程语言吗?(a la Smalltalk)?我认为在更高的层次上,Erlang是面向对象的,因为您相信围绕该术语讨论的原始概念。我指的是隔离、消息传递和多态性 Erlang的进程可以保持状态,在该状态下执行操作,并且它们与其他进程隔离,因为它们不能直接影响彼此。因为任何进程都可以接收任何消息(并且消息可以很容易地委托给另一个进程,该进程可以向原始发送者发送回复),所以我相信它也实现了多态性
当然,较低级别上的Erlang显示了其功能方面,但我认为在较高级别上(在进程之间传递和协调消息),Erlang以面向对象的方式运行。您不能认为面向对象就是关于类、继承和方法调用(这与消息传递不同)。这只是大多数主流语言为我们提供的范例。引用维基百科,其中引用: Benjamin Cuire Pierce和其他一些研究人员认为,任何将OOP提取到最小功能集的尝试都是徒劳的 但看看他们自己徒劳的尝试:
- 动态分派-如果您将Erlang进程视为对象,那么是的,它是受支持的
- 封装—如果将消息发送/响应视为方法调用,则支持它
- 子类型多态性-有点-如果你对行为的定义做了足够的扩展,它是受支持的
- 对象继承(或委托)-无需任何正确性检查,您就可以用一个对象替换另一个对象-所以我们可以这样说
- 开放递归-受支持(发送到自己的进程)
另一个答案可能是“为什么要费心分类”/“谁需要知道”乔·阿姆斯特朗(Joe Armstrong)说他认为Erlang“可能是唯一的面向对象语言”(上下文中添加了“Alan Kay词中的OO”)。Johnson在同一次采访中指出了Sean Copenhaver在回答中所说的同样的事情:在小范围内,Erlang是一种纯粹的函数式语言;在大型的进程中,它看起来完全像Kay风格的对象定向。默认情况下,它不是。但是它。乔·阿姆斯特朗(Joe Armstrong)在他的博客上发表了一篇关于OO的文章,并回答了这个问题 随着Erlang的流行,我们经常被问到“Erlang是OO吗”——当然 当然,真正的答案是“不,当然不是”——但我们没有说 这是大声说出来的——所以我们发明了一系列巧妙的方法 回答这个问题是为了给人留下这样的印象 Erlang是(有点)OO(如果你经常挥手的话),但不是真的 (如果你听了我们实际说的话,读了小字 仔细地)
顺便说一句,这篇文章对OO来说是一个非常有趣的评论家:有一段很好的引用,作者是Erlang的创建者乔·阿姆斯特朗(Joe Armstrong): 面向对象语言的问题是,它们拥有所有这些隐含的环境。你想要一根香蕉,但你得到的是一只大猩猩拿着香蕉和整个丛林。你会称这段代码为“面向对象”吗 这是“Erlang类”时钟的实现
X先生确实像艾伦·凯(Alan Kay)所说的那样明确地谈论OO,这比“OO”现在的意思要不那么模糊。显然,C在Kay意义上不是OO,因为该语言没有消息传递的概念。(而且消息传递不是方法调用!)阿当,我完全忘记了那个采访+谢谢你把它放在那里。InfoQ与Joe Armstrong有一对搭档,听到他谈论Erlangers是如何看待事物的非常有趣。引语是:“我不太确定我是否相信这一点,但erlang可能是唯一的面向对象语言。”
main() ->
Clock1 = clock:constructor() ,
H1 = Clock1:getTime() ,
timer:sleep( 1500 ) ,
H2 = Clock1:getTime() ,
Clock1:setTime( 100 ) ,
timer:sleep( 1500 ) ,
H3 = Clock1:getTime() ,
Clock1:stop( )
. % main ()
%% --------------------------------------------------------
%%
%% clock.erl
%%
%% --------------------------------------------------------
%% ------------------------------------------------
%% ------------------------------------------------
-module( clock ).
-export( [ constructor/1, constructor/0, loop/1,
getTime/1, setTime/2, stop/1,
ticTac/1
] ).
%% ------------------------------------------------
%%
%% ------------------------------------------------
-record( clock, { time } ).
%% ------------------------------------------------
%%
%% ------------------------------------------------
constructor() -> constructor( 0 ) . % ()
%% ------------------------------------------------
%%
%% ------------------------------------------------
constructor(H) ->
%%io:fwrite( "\nclock:constructor()\n" ) ,
LoopPid = spawn( ?MODULE, loop, [ #clock{ time=H } ] ) ,
TicTacPid = spawn( ?MODULE, ticTac, [ LoopPid ] ) ,
{clock, LoopPid}
. % ()
%% ------------------------------------------------
%%
%% ------------------------------------------------
ticTac( LoopPid ) ->
timer:sleep(1000) ,
LoopPid ! ticTack ,
ticTac( LoopPid )
. % ()
%% ------------------------------------------------
%%
%% ------------------------------------------------
loop( State ) ->
%% io:fwrite( "\nclock:loop()\n" ) ,
receive
{Pid, get} -> Pid ! State#clock.time ,
loop( State ) ;
{set, H} -> loop( #clock{ time=H } ) ;
stop -> ok ;
%%after 1000 -> % creo que se reinicia tras cada recepción
ticTack ->
io:fwrite( ".\n" ) ,
loop( #clock{ time=State#clock.time+1 } )
end
. % ()
%% ------------------------------------------------
%% helper
%% ------------------------------------------------
getTime( {clock, PidLoopClock} ) ->
PidLoopClock ! {self(), get} ,
receive
Time -> Time
end
. % ()
%% ------------------------------------------------
%% helper
%% ------------------------------------------------
setTime( H, {clock, PidLoopClock} ) ->
PidLoopClock ! {set, H}
. % ()
%% ------------------------------------------------
%% helper
%% ------------------------------------------------
stop( {clock, PidLoopClock} ) ->
PidLoopClock ! stop
. % ()
%% --------------------------------------------------------
%% --------------------------------------------------------
%% --------------------------------------------------------
%% --------------------------------------------------------