Erlang是面向对象的吗?

zz2j4svz  于 2022-12-08  发布在  Erlang
关注(0)|答案(7)|浏览(201)

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

yks3o0rb

yks3o0rb1#

Joe Armstrong在gone on record中说他认为Erlang是“可能 * 唯一 * 的面向对象语言”(上下文添加了“这个词在Alan Kay意义上的OO”)。Json在同一次采访中指出了Sean Copenhaver在他的回答中所说的同样的事情:在小的方面,Erlang是一种纯粹的函数式语言;从大的Angular 看,它与进程完全类似于Kay-style的面向对象。

koaltpgm

koaltpgm2#

引用自维基百科,其中引用自这里:
Benjamin Cuire Pierce和其他一些研究人员认为,任何试图将OOP提炼成最小特征集的尝试都是徒劳的。
但看着自己徒劳的尝试:

  • 动态调度-如果你把Erlang进程当作一个对象,那么是的,它是受支持的。
  • 封装-如果将消息发送/响应视为方法调用,则支持封装。
  • 子类型多态性--某种程度上--如果你把行为的定义延伸到足够的程度,它是被支持的
  • 对象继承(或委托)--无需任何正确性检查,您可以用一个对象替换另一个对象--因此,假设这是可以的
  • 开放式递归-支持(发送到自己的进程)

所以是的--你可以试着宣称Erlang是面向对象的。但是我可以用同样的技巧把C语言描述成一种面向对象的语言,因为你可以在其中使用面向对象风格并手动实现vtable。
任何一个理智的人看到Erlang的答案都可能是"不" Erlang是一种面向函数/消息传递的语言。
另一个答案可能是"为什么要麻烦分类"/"谁需要知道"?

slmsl1lt

slmsl1lt3#

I think that on the higher level Erlang is object-oriented given that you believe in the original concepts discussed around the term. By this I mean isolation, message passing, polymorphism.
Erlang's processes can hold on to state, perform actions on that state, and they are isolated from other processes since they can't directly effect each other. Since any process can receive any message (and a message can just as easily be delegated to another process who could send a reply to the original sender) I believe it also fulfills polymorphism.
Certainly Erlang on a lower level shows its functional aspects but again I think at the higher level (where you are passing and coordinating messages between processes) Erlang behaves in an object-oriented manner. You just can't get caught up thinking object-orientation is all about classes, inheritance, and method calling (which is different from message passing). That is only how the paradigm has been provided for us in most mainstream languages.

v440hwme

v440hwme4#

Joe Armstrong已经在他的博客中发表了一篇关于OO的文章,并回答了这个问题。
随着Erlang的流行,我们经常被问到“Erlang是OO吗”--当然,真正的答案是“不,当然不是”--但我们没有大声说出来--所以我们发明了一系列巧妙的方法来回答这个问题,目的是给予这样的印象:Erlang是OO(排序)OO(如果你经常挥手)但不是真的(如果你听了我们实际说的话,并仔细阅读小字)。
顺便说一句,文章对OO有一个很有趣的批评:http://harmful.cat-v.org/software/OO_programming/why_oo_sucks

n3schb8v

n3schb8v5#

默认情况下不是,但它是can be

xtfmy6hx

xtfmy6hx6#

Erlang的创造者Joe Armstrong有一句名言:

  • 面向对象语言的问题是它们有一个隐含的环境,你想要一个香蕉,但你得到的是一只大猩猩拿着香蕉和整个丛林。*
c3frrgcw

c3frrgcw7#

你会称这段代码为"面向对象"吗?

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

    . % ()

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

相关问题