Elixir 简明笔记(八)--- 变可变,非常变

Think Different

Dave Thomas大神曾经把学习 Elixir 比成 Take the red pill。诚然,相对于传统的编程语言而言,函数式编程有点“异端”。实际上,恰恰是这些“异端”,可以领阅更多的编程思想,了解更多的编程模型。简而言之就是Think Different。

函数式编程

很多介绍Erlang,Hashkell等书籍都喜欢对读者宣传:学习下一代编程语言。下一代给人的感觉就是新生儿,好似他们都是刚刚发明的。实际上函数式编程语言是很古老的语言。甚至现在很多高级语言还没诞生,他们就出现了。

虽然很早就出现了,可是函数式语言一直在工业领域没什么地位,虽然学术方面成就颇高。可是随着现在网络应用的发展,函数式语言得天独厚的特性逐渐展示出强大的力量。也无怪乎媒体社区都在说下一代编程语言。

并发 并发

函数式语言被称之为下一代编程语言,主要原因还是对并发的处理。随着网络应用的发展,C10k的问题逐渐暴露。用户量增长迅速,网络应用再也不是支持几百人的那种小流量了。而是有可能处理上亿级别的数据。越来越多的服务需要高并发,高时实。而函数式语言几乎都天生支持并发。

函数式语言天生支持并发,主要源自函数式语言的特性,不可变性,函数没有副作用。这样的特性很容易构造分布式系统。

从现在计算机的发展来看,单核的CPU运算相当快了。并且根据摩尔定律,cpu的速度还会提升。可是,还会永远提升么?实际上,尽管cpu的还在升级,可是却很难有数量级的优势了。

也就是说,单纯的通过提高cpu的运算能力来提供服务的性能,将会成为发展的一个瓶颈。既然纵向方法遇到了困难,那么可以横向拓展嘛。

把依靠单核cpu的方式转变成使用多核来提高性能。可是,传统的编程模型中,并发多数是串行的方式。程序的进程通过共享内存来通信。多线程或多进程同步成为一个令开发者头疼的问题。

分布式

与共享内存的不一样的模型是分布式内存,即每个CPU有属于自己的内存,这些CPU内存可以分步在多台机器上,多台机器可以处理同样的计算任务。因此很容易横向拓展。Elixir和Erlang都采用Aacton的并发模型。

它们可以轻易的开启成千上万个进程(process)。这些进程和别的语言的进程不一样,是极其轻量级,甚至比线程还轻。同时,进程之间通过消息(message)通信。这样的模型,很符合我们的真实世界。

OOP的范式通过类、属性、方法定义对象的性质和行为。通过共享类或对象来做状态同步。这样的模型在工业力长盛很多年。Elixir所采用却不是这样,而是通过进程和消息来编程,这其实更符合自然界。自然的通信就是讲话,而不是通过共享大脑。

Elixir/Erlang

Elixir是一门函数式语言。Elixir中的数据类型都是不可变的。变量一旦被绑定了之后,就不能改变了(可以重新绑定)。对于列表[1, 2, 3],如果给他们当中的每一个元素都加 100 的时候,Elixir会根据原列表拷贝一份,并带有新的值。原始的列表并没有被改变。你的任何操作,就不会影响引用了原始列表的代码。

因为数据的不可变,对数据的操作都需要拷贝一份数据,内存中将会有很多数据需要垃圾回收,这样会不会造成低效率呢?

直觉上这样的操作确实让人感到低效,可是Elixir却恰恰相反。因为Elixir中的数据是不可变的,因此当新建一个数据的时候,可以复用原来的数据。

iex(2)> list1 = [3, 2, 1]
[3, 2, 1]
iex(3)> list2 = [4 | list1]
[4, 3, 2, 1]
iex(4)> list2
[4, 3, 2, 1]

list1是一个列表,并且是不可变的,使用|操作符创建了list2。直觉上会觉得先把list1复制一份,然后再和4组合创建成新的list2。实际上,并不需要复制list1,只需要把4list1组合即可。毕竟list1是永远不会变的嘛。

对于内存中大量无用的值,需要被垃圾回收。现代的语言几乎都有这个机制,其实有的人甚至怀疑来及回收本身带来的开销比内存中无用的“垃圾”还大。

Elixir提供了一个很cool的解决方案。写代码的时候可以使用多进程,每一个进程都有自己的内存堆栈。应用程序的数据被分发在这些进程之中。因此,数据在分散在很多内存而不是一个内存中,垃圾回收操作的内存都相对小,因而效率会很高。也就是垃圾回收在小内存中搜索需要清理的数据比在一个很大的内存中搜索要快。

尽管我们一直说Elixir是函数式编程语言,可是至今还没介绍函数,未免有点尴尬。下一章将会介绍Elixir中的函数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 4,088评论 0 23
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,432评论 25 707
  • 在服务器端程序开发领域,性能问题一直是备受关注的重点。业界有大量的框架、组件、类库都是以性能为卖点而广为人知。然而...
    dreamer_lk阅读 1,000评论 0 17
  • 愿你能明白,我们的人生不仅只有琐碎的烦恼、也不仅只有纠缠的情爱、更不仅只有伤心的往事,还有梦想、真爱和希望。
    Melody小仙女阅读 181评论 1 0
  • 8月 (1)调整回正常作息时间,调理好一点身体,加强锻炼,增强精气神,调节好心态 (2)边休息边做简历,了解多一些...
    琥珀色的年华阅读 185评论 0 0