Erlang简介 #
一、什么是Erlang #
Erlang是一种通用的并发导向编程语言,由瑞典电信设备公司爱立信(Ericsson)于1986年开发。Erlang的设计初衷是为了开发电信系统,这些系统需要高度的并发性、可靠性和容错能力。
1.1 语言名称 #
Erlang的名字有两种解释:
- 以丹麦数学家Agner Krarup Erlang命名
- "Ericsson Language"的缩写
1.2 设计哲学 #
Erlang的设计遵循以下核心原则:
- 一切皆进程 - 程序由大量轻量级进程组成
- 进程隔离 - 进程之间完全隔离,一个进程崩溃不会影响其他进程
- 消息传递 - 进程之间通过异步消息传递通信
- 容错设计 - "Let it crash"哲学,让错误恢复机制处理异常
二、Erlang的历史 #
2.1 发展历程 #
| 年份 | 事件 |
|---|---|
| 1986 | Joe Armstrong在爱立信开始开发Erlang |
| 1998 | Erlang开源发布 |
| 2006 | 多核SMP支持 |
| 2014 | Erlang/OTP 17发布,引入maps |
| 2019 | Erlang/OTP 22发布 |
| 2023 | Erlang/OTP 26发布 |
2.2 关键人物 #
- Joe Armstrong - Erlang之父,核心设计者
- Robert Virding - 共同创始人之一
- Mike Williams - 共同创始人之一
三、Erlang的核心特点 #
3.1 函数式编程 #
Erlang是一种函数式编程语言:
erlang
-module(math).
-export([factorial/1]).
factorial(0) -> 1;
factorial(N) when N > 0 -> N * factorial(N - 1).
特点:
- 变量不可变(单次赋值)
- 函数是第一类公民
- 支持高阶函数和闭包
- 模式匹配
3.2 并发模型 #
Erlang的并发模型基于Actor模型:
erlang
-module(concurrent).
-export([start/0, loop/0]).
start() ->
spawn(fun loop/0).
loop() ->
receive
{ping, From} ->
From ! pong,
loop();
stop ->
ok
end.
特点:
- 轻量级进程(初始约2KB栈空间)
- 进程创建成本极低
- 没有共享内存,通过消息传递通信
- 支持数十万甚至百万级并发进程
3.3 容错机制 #
erlang
-module(supervisor_example).
-export([start_link/0, init/1]).
start_link() ->
spawn_link(fun() -> init([]) end).
init(Args) ->
process_flag(trap_exit, true),
Child = spawn_link(fun child_loop/0),
supervisor_loop(Child).
supervisor_loop(Child) ->
receive
{'EXIT', Child, Reason} ->
io:format("Child exited: ~p~n", [Reason]),
NewChild = spawn_link(fun child_loop/0),
supervisor_loop(NewChild)
end.
child_loop() ->
receive
crash -> exit(crashed);
_ -> child_loop()
end.
特点:
- 进程链接(link)和监控(monitor)
- 监督树(Supervisor Tree)
- "Let it crash"哲学
- 热代码升级
3.4 分布式支持 #
erlang
-module(distributed).
-export([start/0, rpc/2]).
start() ->
Node = 'server@localhost',
Pid = spawn(Node, fun() -> loop() end),
register(server, Pid).
rpc(Request, Args) ->
server ! {self(), Request, Args},
receive
{reply, Reply} -> Reply
end.
loop() ->
receive
{From, Request, Args} ->
Result = handle_request(Request, Args),
From ! {reply, Result},
loop()
end.
特点:
- 内置分布式支持
- 透明的远程调用
- 节点间通信
- 分布式数据库Mnesia
四、OTP框架 #
OTP(Open Telecom Platform)是Erlang的标准库和设计模式集合:
4.1 核心行为 #
| 行为 | 用途 |
|---|---|
| gen_server | 通用服务器 |
| gen_statem | 状态机 |
| gen_event | 事件处理 |
| supervisor | 监督者 |
| application | 应用程序 |
4.2 OTP优势 #
- 经过验证的设计模式
- 标准化的回调接口
- 内置的错误处理
- 代码热升级支持
五、应用领域 #
5.1 电信系统 #
Erlang最初为电信系统设计:
- 交换机软件
- 信令网关
- 短信网关
- VoIP系统
5.2 即时通讯 #
著名的应用案例:
- WhatsApp - 使用Erlang处理数十亿消息
- Discord - 使用Elixir/Erlang处理高并发
- WeChat - 部分后端使用Erlang
5.3 游戏服务器 #
- 高并发连接处理
- 实时游戏状态同步
- 分布式游戏服务器
5.4 物联网 #
- MQTT代理(如EMQX)
- 设备连接管理
- 消息路由
5.5 数据库 #
- CouchDB - 文档数据库
- Riak - 分布式键值存储
- Mnesia - Erlang内置数据库
六、Erlang vs 其他语言 #
6.1 与Java对比 #
| 特性 | Erlang | Java |
|---|---|---|
| 并发模型 | Actor/进程 | 线程 |
| 内存模型 | 无共享 | 共享内存 |
| 容错 | 内置监督 | 需手动处理 |
| 热升级 | 支持 | 需要额外框架 |
6.2 与Go对比 #
| 特性 | Erlang | Go |
|---|---|---|
| 并发原语 | 进程 | Goroutine |
| 通信方式 | 消息传递 | Channel |
| 类型系统 | 动态类型 | 静态类型 |
| 容错机制 | OTP | 需手动实现 |
6.3 与Elixir对比 #
Elixir运行在Erlang虚拟机(BEAM)上:
| 特性 | Erlang | Elixir |
|---|---|---|
| 语法 | Prolog风格 | Ruby风格 |
| 元编程 | 宏 | 宏+协议 |
| 生态系统 | OTP | OTP+Hex |
| 学习曲线 | 较陡 | 较平缓 |
七、为什么学习Erlang #
7.1 学习价值 #
- 并发思维 - 学习Actor模型和消息传递
- 容错设计 - 理解如何构建高可用系统
- 函数式编程 - 掌握函数式编程范式
- 系统设计 - 学习分布式系统设计
7.2 职业机会 #
- 后端开发工程师
- 即时通讯开发
- 游戏服务器开发
- 物联网平台开发
7.3 学习路径 #
text
基础语法 → 数据类型 → 函数 → 模块 → 并发 → OTP → 分布式
八、总结 #
Erlang是一门独特的编程语言:
- 为并发和容错而生
- 函数式编程范式
- Actor并发模型
- OTP框架支持
- 电信级可靠性
准备好开始Erlang之旅了吗?让我们继续学习如何安装和运行Erlang。
最后更新:2026-03-27