Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang是面向对象的吗?_Erlang_Oop - Fatal编程技术网

Erlang是面向对象的吗?

Erlang是面向对象的吗?,erlang,oop,Erlang,Oop,消息传递是Erlang的一个基本部分。Alan Kay认为,在他面向对象编程的观点中,消息传递是一个比对象更重要的概念(他“发明”了这个术语!) Erlang可以被认为是一种面向对象的编程语言吗?(a la Smalltalk)?我认为在更高的层次上,Erlang是面向对象的,因为您相信围绕该术语讨论的原始概念。我指的是隔离、消息传递和多态性 Erlang的进程可以保持状态,在该状态下执行操作,并且它们与其他进程隔离,因为它们不能直接影响彼此。因为任何进程都可以接收任何消息(并且消息可以很容易地

消息传递是Erlang的一个基本部分。Alan Kay认为,在他面向对象编程的观点中,消息传递是一个比对象更重要的概念(他“发明”了这个术语!)


Erlang可以被认为是一种面向对象的编程语言吗?(a la Smalltalk)?

我认为在更高的层次上,Erlang是面向对象的,因为您相信围绕该术语讨论的原始概念。我指的是隔离、消息传递和多态性

Erlang的进程可以保持状态,在该状态下执行操作,并且它们与其他进程隔离,因为它们不能直接影响彼此。因为任何进程都可以接收任何消息(并且消息可以很容易地委托给另一个进程,该进程可以向原始发送者发送回复),所以我相信它也实现了多态性


当然,较低级别上的Erlang显示了其功能方面,但我认为在较高级别上(在进程之间传递和协调消息),Erlang以面向对象的方式运行。您不能认为面向对象就是关于类、继承和方法调用(这与消息传递不同)。这只是大多数主流语言为我们提供的范例。

引用维基百科,其中引用:

Benjamin Cuire Pierce和其他一些研究人员认为,任何将OOP提取到最小功能集的尝试都是徒劳的

但看看他们自己徒劳的尝试:

  • 动态分派-如果您将Erlang进程视为对象,那么是的,它是受支持的
  • 封装—如果将消息发送/响应视为方法调用,则支持它
  • 子类型多态性-有点-如果你对行为的定义做了足够的扩展,它是受支持的
  • 对象继承(或委托)-无需任何正确性检查,您就可以用一个对象替换另一个对象-所以我们可以这样说
  • 开放递归-受支持(发送到自己的进程)
因此,是的,通过一些冒烟和闪现,您可以尝试声称Erlang是面向对象的。但我可以使用同样的技巧将C作为OO语言呈现,因为您可以在其中使用OO样式并手动实现vtables

任何一个理智的人看Erlang的答案都可能是“不”,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

    . % ()

%% --------------------------------------------------------
%% --------------------------------------------------------
%% --------------------------------------------------------
%% --------------------------------------------------------