八卦一下Erlang的发明人Joe Armstrong

转载:http://blog.tianya.cn/blogger/post_read.asp?BlogID=61970&PostID=12484235

 

从SmallTalk Tidbits看来的。Erlang的作者Joe Armstrong到欧洲Smalltalk用户组做了个报告。James Robertson记录了报告的要点,顺便八卦了一下Erlang的历史。当年Armstrong在爱立信逍遥快活,做电话网络方面的开发(多半是交换机了)。他当时用过Smalltalk,可惜那个时候Smalltalk忒慢,不能满足电话网络的高性能要求。但阿伯伯实在喜欢Smalltalk,于是定购了一台Tektronix Smalltak机器(那个时代的牛人们不容易啊。硬件跟不上。为了心爱的语言,只好发展自己的专用机器。有兴趣的可以去读LISP机器的手册。可算是郁闷人生,精彩项目)。机器订要两个月才到。A老大等待中百无聊赖,就开始玩儿起Prolog来了。结果等Tektronix到的时候,他已经对Prolog更感兴趣,于是把死贵死贵的Tektronix送人。接手人呢,好像(找不到出处了)就是现在OO程序员们景仰的Ivar Jacobson。艾老大当年也在爱立信电话交换机部门工作,顺手发明了Use Case和Sequence Diagram。后来他出走爱立信,创立了Objectory,并提出了一套开发流程,OOSE。1991年爱立信买了Objectory,1995年又把它卖给了Rational。然后艾老大就和Grady Booch 以及 James Rumbaugh搞出了UML。UML的U是统一的意思。要统一什么嗫?当然就是号称三架马车(Three Amigo, 和网上曾经流传的那篇著名色情小说可没关系)让众多铁杆拥泵争吵不休的OOSE, OMT,和Booch 方法。看来牛人们也扎堆。嗯,走题了。说回A老大。A老大当然不满足于精通Prolog。再说光是Hoare Logic,也忒单调了点。经过一段时间的试验,A老大给Prolog加上了并发处理。于是Erlang就诞生乐。这也是为什么Erlang的语法和Prolog有不少相似之处,比如它们的List表达都是[Head | Tail]。你说都是学Prolog。有人两个月后就搞出个电信业和银行业广泛应用的牛B语言。我们两个月后却在抱怨Hoare Logic不够强大和直观。天壤之别啊。
   
  顺便八卦一下Erlang。Erlang这们语言最牛的地方就是强大的并行处理能力和容错机制。Armstrong的博客有篇浅显易懂的文章介绍Erlang背后的思想。值得一读。文章标题也很骠悍:“Concurrency Is Easy”。端的豪气万丈。简单说,Erlang能够创建和管理大量的进程(不是操作系统级别的)。那些进程在不同的操作系统上有同样的行为,可以被垃圾回收,对运行地点透明(location transparent),不会破坏其它进程的运行。任意两个进程间完全独立,不共享任何状态,一切交流通过消息来传递,当然也就无需上锁。这样的设计思想造就了适合解决如下问题的Erlang:
  § 系统高度并发 - 支持几十万个并行行为
  § 实时处理
  § 计算高度分布
  § 系统要求高度可靠:每年的脱机时间以分钟算,甚至永不当机
  § 系统高度复杂:代码量以百万行计
  § 持续操作:以年计
  § 系统要求持续在线更新。
   
  而要做到这些,需要:
  并发 进程 
  错误隔离 隔离进程 
  错误侦查 发现什么东西当掉了 
  错误诊断 为什么当掉 
  在线代码更新 持续进化的系统(同时运行多个版本) 
  稳定存储 崩溃恢复 
  
  
  系统彻底独立,遵循所谓的无共享语义是系统稳定和高并发的关键。至于句法么,可以到www.erlang.org上去看指南。
  搞笑的是,爱立信在A老大发明Erlang后勒令A老大放弃使用Erlang。理由是Erlang不过是业余选手的玩儿票语言,未来没有保证。嗯,很像现在对某R字打头的语言的批评哈。A老大一怒之下,就把Erlang开源乐。然后A老大和一群Erlang牛人于1998年成立了Bluetail,专卖用Erlang实现的软件及技术。然后2000年Bluetail就被Alteon Web Systems用一亿五千万美刀买了。 A爷爷则回到爱立信继续逍遥快活。
  

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
尾归是一种高效解决问题的思想,它可以避免递归过程中的栈溢出问题。在Erlang中,由于没有循环语句,所以递归是一种常见的编程方式。而尾递归是一种特殊的递归方式,它可以将递归转化为循环,从而避免了递归过程中的栈溢出问题。 在Erlang中,尾递归函数的最后一步操作是递归调用自身,并且递归调用的结果直接返回给函数的调用者,而不是在递归调用之后再进行其他操作。这样,就可以避免递归过程中的栈溢出问题,因为每次递归调用都会覆盖上一次调用的栈帧,从而减少了栈的使用。 举个例子,下面是一个计算阶乘的尾递归函数: ``` facttail(N) -> facttail(N, 1). facttail(0, Acc) -> Acc; facttail(N, Acc) -> facttail(N-1, N*Acc). ``` 在这个函数中,第一个参数N表示要计算阶乘的数,第二个参数Acc表示当前的阶乘结果。函数的第一行调用了一个辅助函数facttail/2,并将Acc初始化为1。在辅助函数中,当N等于0时,直接返回Acc;否则,递归调用facttail/2,并将N减1,Acc乘以N,作为下一次调用的参数。这样,每次递归调用都会更新Acc的值,直到N等于0时,返回最终的阶乘结果。 总之,尾递归是一种高效的递归方式,可以避免递归过程中的栈溢出问题。在Erlang中,尾递归函数的最后一步操作是递归调用自身,并且递归调用的结果直接返回给函数的调用者。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值