专栏首页ACM算法日常Erlang语言导文

Erlang语言导文

从业很多年,对于语言其实并没有什么偏执,工作需要什么语言就用什么语言。大家用的最多的可能是C/C++语言,毕竟是算竞的主流,也有很多同学使用Java或者python,再有一些可能使用c#、go、php、ruby等等。

语言种类非常多,哪一种是你喜欢的呢?

编程语言主要分为编译执行的和解释执行的,从设计角度又分为面向对象编程、面向过程编程以及我要介绍的函数式编程。

函数式编程顾名思义就是面向函数编程,所有的逻辑都是函数,对于for循环、if判断都是函数的方式完成。Erlang是函数式编程的一种,然而我这篇导文并不是要讨论函数式这个特点,我是要讨论Eralng最重要的并发和分布式特性,也许你会奇怪,为啥不说说C/C++/Java/Python这些语言,这是因为Erlang是一个非常冷门的语言,而它又非常强大。

Erlang语言最大的特点是稳定,这是我个人的一个最深的印象,一旦你的代码能够正常运行,那么它几乎能够永远正常运行下去。在分布式编程方面,没有哪个语言能这么有自信,比如如果使用C++来做多进程多线程的高并发服务器,首先你要在多线程的泥淖里痛苦一番才可能设计好基本模块,而且即使你花了九牛之力,极有可能的情况是哪天跑着跑着就出问题了。

Erlang能够如此稳定是因为Erlang中没有变量,只有常量,然后多进程消息通过复制的方式传递,简单的说就是Erlang中没有共享的结构,这样肯定很难出问题。

为了能够保证程序永远运行下去,Erlang不仅在语言层面做了很多工作,还有一个重量级的工作是它提供了一整套抽象的编程模式,这套模式称之为OTP编程,可以说是Erlang几十年来最重要的框架。这套模式能够非常方便的编写服务器程序,进程间通信也能够很清晰的进行,进程的诞生和死亡都受到super进程的监控,即使挂掉了也可以轻松重启。

有了这些,写分布式高并发的服务器就会很轻松了,可是有人会觉得,这有什么,不就是做了一套框架,我用C++/Java/Go同样能写,这些主流语言写的分布式高并发框架并不少。

那么Erlang到底还有什么让我为之侧目要发这篇短文呢?

发这篇文章的来源是因为markdown的服务器是用erlang写的,前几天出了一个离奇的cpu占满的问题,解决之后才有感而发。

cpu占满的原因是在一次更新中为了兼容2个版本写了一个新的函数,旧版本的函数为fun(a, b),新版本的函数为fun(a, b, c),旧版本的函数内容修改为fun(a, b, 0),c是新加的参数,默认为0,但是旧版本的函数写错了,内容写成了fun(a,b),这样旧版本的函数会自己调用自己,成了死循环,如下面的代码所示。如果是C++,早就栈溢出崩溃了。

预期的代码

fun(a, b, c)
  ...

fun(a, b)
  fun(a, b, 0)

写错了的代码

fun(a, b, c)
  ...

fun(a, b)
  fun(a, b)

当时找到问题的时候就很纳闷,栈溢出了还能开心的运行下去,这是打不死的小强啊,有童鞋会说,即使没有崩溃,CPU跑满了也会影响服务器运行啊,用处不大。

No,童鞋你有所不知,CPU跑满了没有关系,只要是Erlang跑满的CPU,你不用担心别的客户端会受到影响。

上面说到了,Erlang最大的特点是稳定,其实稳定的因素除了函数式以外,还有一个特性是其他语言没有的,那就是语言层面实现的公平。对于操作系统来说,CPU的利用往往是不公平的,比如编译大型程序的时候,其他的进程会受到严重影响,鼠标卡着,输入困难等症状,这种症状在Linux系统会格外明显,Windows系统可能会好些,因为Windows设计的时候是面向用户的,也就是说用户的操作与响应是优先级最高的(和chrome浏览器的设计类似)。

Erlang为了保证每个进程都公平,采用了时间片的机制,也就是说,每个进程只能用一定的时间片,用完了就只能等下一次了,这样即使你死循环了也没事,因为你就只有那么多时间,用完就没了,其他进程该干什么干什么,因为他们拥有同样多的时间片,操作系统也控制不了的事情Erlang彻底的解决了,为了稳定也是费尽心思。

Erlang还能够非常方面的进行热更新,也就是代码自动更新,不需要重启服务器,这点在开发的时候很方便。

在分布式方面,Erlang内置了节点的概念,节点通信就和本地进程通信一样简单。

但是,Erlang毕竟是一个解释型语言,性能会是一个可能存在的问题,除此之外,上手有一定的难度,你需要先熟悉语法,真正实践的时候还必须学会OTP的三板斧,不然学不到精髓。

对于语言,并没有优劣之分,只有合不合适,Erlang无论是用于服务器分布式开发,还是函数式语言学习之用,以及软公平语言的实现参考,都是很有价值的。

Erlang目前的应用其实很广,只是因为国内用的人少,所以非常冷清。国外有名的是WhatsApp的服务器,国内可能就是阿里云的云数据库等服务,另外很多大型的电信系统会使用,毕竟这个是Erlang一开始设计的目标。

本文分享自微信公众号 - ACM算法日常(acm-clan),作者:dansen

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Facebook面试官:如何突围大厂算法面试?

    “给你a、b两个文件,他们各存放50亿条URL,其中每条URL各占用64字节,内存限制是4G,请你编写代码找出a、b文件中相同的URL”。这是某家大公司在201...

    ACM算法日常
  • POJ2318 TOYS 判断点与直线位置关系 【计算几何】

    Calculate the number of toys that land in each bin of a partitioned toy box.

    ACM算法日常
  • 照明系统设计(动态规划)- UVA 11400

    You are given the task to design a lighting system for a huge conference hall. A...

    ACM算法日常
  • 这有“三高一快零故障”网络架构实践,还有掉坑逃生指南

    内容来源:2017 年 11 月 04 日,中兴高级系统架构师魏猷君在“2017厦门软件技术峰会”进行《高可靠性网络架构实践》演讲分享。IT 大咖说(微信id:...

    IT大咖说
  • Erlang 入坑指南

    想了半天憋出这么个题目来,这也的确只是一篇入坑文。之前程序君写过一篇 Erlang 文章,我用谷歌翻译出来给 Joe Armstrong 老爷子看,老爷子看后大...

    tyrchen
  • 回顾Erlang简要

    世界是并行的,Erlang程序反应了一种思考和交流的方式,个体通过发送消息进行交流,如果有个体死亡,其他个体会注意到。

    半吊子全栈工匠
  • Erlang 和 Elixir 介绍

    时见疏星
  • Promise与Callback函数

    1,callback函数处理异步:代码逻辑复杂,可读性差----回调地狱;不可return; 2,promise处理异步: 对比callback,易读,可以...

    程序员不务正业
  • Frida hook带handler的method

    E/AndroidRuntime( 2434): java.lang.ExceptionInInitializerError E/AndroidRuntime...

    一个会写诗的程序员
  • 手算梯度下降法,详解神经网络迭代训练过程

    望月从良

扫码关注云+社区

领取腾讯云代金券