Erlang简介 #

一、什么是Erlang #

Erlang是一种通用的并发导向编程语言,由瑞典电信设备公司爱立信(Ericsson)于1986年开发。Erlang的设计初衷是为了开发电信系统,这些系统需要高度的并发性、可靠性和容错能力。

1.1 语言名称 #

Erlang的名字有两种解释:

  • 以丹麦数学家Agner Krarup Erlang命名
  • "Ericsson Language"的缩写

1.2 设计哲学 #

Erlang的设计遵循以下核心原则:

  1. 一切皆进程 - 程序由大量轻量级进程组成
  2. 进程隔离 - 进程之间完全隔离,一个进程崩溃不会影响其他进程
  3. 消息传递 - 进程之间通过异步消息传递通信
  4. 容错设计 - "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 学习价值 #

  1. 并发思维 - 学习Actor模型和消息传递
  2. 容错设计 - 理解如何构建高可用系统
  3. 函数式编程 - 掌握函数式编程范式
  4. 系统设计 - 学习分布式系统设计

7.2 职业机会 #

  • 后端开发工程师
  • 即时通讯开发
  • 游戏服务器开发
  • 物联网平台开发

7.3 学习路径 #

text
基础语法 → 数据类型 → 函数 → 模块 → 并发 → OTP → 分布式

八、总结 #

Erlang是一门独特的编程语言:

  • 为并发和容错而生
  • 函数式编程范式
  • Actor并发模型
  • OTP框架支持
  • 电信级可靠性

准备好开始Erlang之旅了吗?让我们继续学习如何安装和运行Erlang。

最后更新:2026-03-27