文档库 最新最全的文档下载
当前位置:文档库 › why_choose_Erlang

why_choose_Erlang

我为什么选择了Erlang?

许式伟

2007-10-10

面向的受众

?我们不解释Erlang基础文法。假设读者已经对Erlang进行过了解。如果你期望入门资料,那么它并不适合你。

?本文谨献给那么已经初步了解Erlang,仍然赶到迷茫与困惑的人。

Erlang推荐资料

?Programming Erlang

?Course.pdf

?Joes thesis 2003

–面对软件错误构建可靠的分布式系统(段先德译)

纲要

?Erlang为什么广受关注?

–业界趋势

–Erlang的问题域

?Erlang的哲学

?Erlang的困惑

?Erlang流行的困难之处

–如何应对

?Erlang的不足(非设计缺陷)

Erlang为什么广受关注??2007 has been a good year for Erlang –Amazon

?Joe's book (Programming Erlang) is ranked

#86 on the https://www.wendangku.net/doc/753156310.html, bestseller list

(category: computers & internet)

–Google Trends

?https://www.wendangku.net/doc/753156310.html,/trends?q=smalltalk

%2C+erlang

?https://www.wendangku.net/doc/753156310.html,/trends?q=erlang%2

C+ocaml

并行、分布式的趋势

?多核(并行)

–让我们假设Intel是正确的:让我们假设 Keifer

项目会获得成功。如果是这样,那么 32个核心

的处理器在2009/2010年就将会出现在市场上。

–这毫不奇怪,Sun已经制造出了Niagara,它拥

有8 个核,每个核运行4个超线程(这相当于32

个核)。

–《What's all this fuss about Erlang?》

?by Joe Armstrong (Erlang创始人)

软件业发展趋势

?总体趋势

–从卖工具软件转卖服务(软件免费)。

–从纯客户端到B/S或C/S。存储与计算向服务端转移。

–从PC单机到服务器+客户端多元化(手机、PC、PDA、电视机顶盒、车载终端等)。

?结果

–客户可以更加方便地享受到服务。

–信息越来越膨胀(高速增长)。

–服务器承受越来越高的负荷(用户数+数据量)。

–竞争更加激烈、客户更加挑剔。

–服务质量差异显著化。

Erlang:并行/分布

?Erlang:并行/分布式语言。

–从根本上解放了程序员的生产力,让程序员可

以全力关注于自身的逻辑,而不需要被太多的

机器硬件所困扰。这就像GC语言把程序员从内存管理中解放出来一样,现在Erlang解放的是

程序员在并行处理上的困扰,而这比内存管理

的复杂度更大,也更为迫切。

Erlang的问题域

?高并发:应对超大量的并发活动。

?分布式:系统可以跨计算机分布运行。?持续服务:系统应该能不间断运行许多年。?热升级:软件维护/升级应该能在不停止系统的情况下进行。

?可靠:满足苛刻的质量和可靠性需求。包括提供容错功能,在硬件失灵和软件错误时继续提供正常的服务。

Erlang:专注

?Erlang Focus的问题域恰恰是现代服务器的普适需求

–高负荷、高可靠、持续服务、热升级。

?Erlang是一门专注的语言

–有自己Focus的问题域。

–不是用来解决所有问题的语言。

–Erlang是轻量级的语言。

Erlang的哲学

?面向并发编程(COP)

–进程隔离(isolation)

–消息传递

?错误处理哲学

–速错(fail-fast)

进程隔离(Isolation)

?无共享

–进程具有“不共享任何资源”的语意。

–进程被认为是运行在物理上独立的计算机上。

–分布式计算所需的任何数据都必须通过拷贝。

?消息传递

–消息传递是进程间传递数据的唯一方式。

–消息传递必须是异步的。如果采用同步方式,那么当消息的接收者偶然发生一个软件错误时,就会永久阻塞住消息的发送者,破坏了隔离的特性。

–消息传递被认为是不可靠的。要知道消息是否被正确送达的唯一方法就是发送一个确认消息回来。

?位置透明

–你不知道你的联系人(进程)位于什么地方。只要有它的标识(PID)你就可以与之通讯。

消息传递

?消息传递当是原子化的(atomic),意思是一个消息要么整个儿被传递,要么根本就不传递。

?一对进程之间的消息传递是有序的,意思是当在任何一对进程之间进行消息序列的收发时,消息被接收的顺序与对方发送的顺序相同。

?消息不能包含指向进程中的数据结构的指针——它们只能够包含常量和(或)Pid。

错误处理哲学

?故障即停(Halt on failure)

–速错(fail-fast)。

–不成功,便成仁。

?If you can’t do what you want to do, die.

–任它崩溃。杜绝防御式编程。

?让其它进程来监视并修复错误

–无论软件故障、硬件故障,均可监视&修复。

?持久存储

–存储器应当分为持久存储器(stable storage,进程崩

掉时依然存在,用于故障恢复)和临时存储器

(volatile storage,崩掉就没了)。

–由“事务机制”(transaction mechanism)来提供数据和消息的完整性。

Erlang困惑

?Erlang为什么没有数组?

–为什么我不能以O(1)的速度访问列表成员?

–为什么不能进行二分查找(binary search)??为什么Erlang不是OOP语言?

–为什么没有类?

–为什么没有虚拟(多态)?

我的解释

?Erlang为什么没有数组?

–Erlang的Binary是一个无数据类型的数组(可

以认为是C/C++中的void*)。

?例:Buffer从Offset开始取得N字节,赋给Fetch。

<<_:Offset/binary, Fetch:N/binary, _/binary>> = Buffer.

–由于数组的修改代价很大,因此Erlang中的数

组意义不大(相当于传统语言)。但不可修改的常数组有存在的意义。

?例:读取文件内容到FileBuf中,从而在内存中进行

随机访问。

{ ok, FileBuf } = file:open(FilePath, read).

我的解释

?为什么Erlang不是OOP语言?

–OOP的核心——类在于封装变化;Erlang的变量是一次赋值,不可变化。故Erlang与OOP是天生冲突的。

–对比

?Java

stack stk = new stack();

stk.push(10);

val = stk.top();

?Erlang

Stk1 = stack:new(),

Stk2 = stack:push(10, Stk1),

Val = stack:top(Stk2).

Erlang的困难之处

?对软件开发人员来说,养成面对问题就用多线程的方式(并行)来进行思考本身就是一个比较大的跨越。

–养成多线程的代码编写习惯是未来程序员的基本技能之一。

–从我的角度来看,PC平台上的电脑迟早是要淘汰的。未来的终端可能是PDA或者是其它便携的设备,因为将来的用户并不需要一

个这样很大的机器,而是由一个大型服务器作为数据和计算的中

心来完成计算和存储等工作。

–要么就不写程序,要么就写服务器端的程序,当然,你也可以去撰写移动终端设备上的代码,还是上面的观点,在PC平台上做开发的空间很小。我个人还是非常鼓励开发人员做服务器端程序的

开发,同时也希望它们在撰写代码的时候能够养成多线程的习惯

来并行处理他们的应用。

–《程序员》杂志2006年第9期,Sun公司的工程技术总监柯泰博士

Erlang的困难之处

?尽管Erlang程序可以很方便地并行/分布式,但是这并不意味着并行思维模式不需要被理解和掌握。

相关文档