前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Erlang语言导文

Erlang语言导文

作者头像
ACM算法日常
发布2020-05-27 11:05:34
9010
发布2020-05-27 11:05:34
举报
文章被收录于专栏:ACM算法日常

从业很多年,对于语言其实并没有什么偏执,工作需要什么语言就用什么语言。大家用的最多的可能是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++,早就栈溢出崩溃了。

预期的代码

代码语言:javascript
复制
fun(a, b, c)
  ...

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

写错了的代码

代码语言:javascript
复制
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一开始设计的目标。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ACM算法日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档