查看原文
其他

Joe Armstrong最喜欢的一段Erlang程序

Joe Armstrong 高可用架构 2020-11-06

导读:最近网友又翻出一篇Erlang之父Joe Armstrong生前经典的帖子,并引发了热议,高可用架构翻译如下。


前几天,我收到了来自罗文大学的Dean Galvin的邮件。 Dean在做一个Erlang项目,所以他问“哪个示例程序最能体现Erlang的特性”。

他想要一段很小的代码,以便在十分钟的演讲中完美的展示这门语言。 我想了一会儿...并迅速编写了我最喜欢的程序,这就是“通用服务器”。

这就是我的“通用服务器”代码:

universal_server() -> receive {become, F} -> F() end.

代码还是挺容易理解的。 一旦创建了universal_server,它就会等待{become,F}消息,然后有消息到来的时候调用F。


阶乘服务器


阶乘服务器是等待整数并返回整数的阶乘的服务器。代码同样很简单:

factorial_server() -> receive {From, N} -> From ! factorial(N), factorial_server() end.

factorial(0) -> 1;factorial(N) -> N * factorial(N-1).

现在万事俱备。


整合代码


我将编写一个很短小的函数来创建通用服务器,该服务器向其发送“become factorial_server”消息,然后向其发送一个整数,等待响应并输出返回值:

test() -> Pid = spawn(fun universal_server/0), Pid ! {become, fun factorial_server/0}, Pid ! {self(), 50}, receive X -> X end.
所有这些函数都位于模块/code/fav1.erl。


现在我们要做的就是启动一个Erlang shell并运行测试程序

$ erl1 > c(fav1).{ok, fav1}2 > fav1:test().30414093201713378043612608166064768844377641568960512000000000000


旁白


几年前,当我在SICS时,我可以使用Planet Lab。 Planet Lab是9000台计算机的研究网络。加入Planet Lab很容易,您所要做的就是购买一台标准PC,将其连接到网络,并将其捐赠给Planet Lab组织。将您的机器捐赠给网络后,您可以使用Planet Lab中的所有其他机器作为回报。

Planet Lab是用于分布式应用程序的实际测试平台,目前在562个站点上有1171个节点。

我想用Planet Lab做什么?我没有头绪。我最终要做的是编写一些脚本,以在所有Planet实验室机器上安装空的通用Erlang服务器(非常类似于本文中的代码)-然后,我建立了一个gossip算法,让become消息充斥网络。然后我有了一个空的网络,在几秒钟内它将变成我想要做的任何事情。

大约一年后,我不得不写一篇论文。成为研究人员的缺点之一是为了赚钱必须发表论文,也许论文内容你永远不会感兴趣,但是必须是研究项目期望的内容。

我在Planet Lab上建立了gossip网络,我可以说它变成了任何东西,后来我让它成为了内容分发网络,并使用gossip算法在网络上所有计算机上复制了同一文件,并写了一篇论文描述它。


原文链接:

https://joearms.github.io/published/2013-11-21-My-favorite-erlang-program.html


参考阅读:



本文作者 Joe Armstrong,由高可用架构翻译。技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。


高可用架构

改变互联网的构建方式


长按二维码 关注「高可用架构」公众号


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存