Erlang 和 Elixir 都运行在 BEAM 上

动手学Erlang+Elixir

先从值、类型和函数开始。语法读顺以后,再看进程怎样合作。Elixir 和 Erlang 各有一条从零路线。任选一条,不必一起学。

2条从零路线
62节语言短课
7站 BEAM 核心
2 / 2复习 / 双语扩展
BEAM RUNTIME
message
DOWN
reply
VMBEAMprocess · mailbox
scheduler · isolation
01ElixirGenServer
02Erlanggen_server
03OTPSupervisor
S1
S2
S3
四步,前后接上

先写好语言,再读真实系统

语言线负责代码、测试和项目工具。BEAM 主线负责并发、失败与恢复。做完综合练习,再去 Case Chat 看这些选择怎样落进一个语音服务。

03
CAPSTONE

交付一个可靠任务系统

主线终点

把有界队列、监督树、幂等、重试与节点断线放进同一个项目。用故障实验验收,不靠口头保证。

04
CASE STUDY

Case Chat:拆一个语音服务

中文案例

沿着一次语音会话读完整项目。先看全貌,再逐章追 mix、监督树、WebSocket、录音进程和浏览器代码。重点不在抄写,而在看每个选择解决了什么问题。

怎么学

先猜结果,再运行代码

每一课都有代码可改。结果和预想不同时,先看输出,再只改一个地方。这样容易找到原因。

01

先跑代码

每课一段短代码

每个新概念都有一小段代码,可以放进 IEx 或 erl 运行。页面动画会把消息传递画出来。

02

两种写法

同题两种写法

同一个任务,分别用 Elixir 和 Erlang 来写。写法不同,都运行在 BEAM 上。

03

改一处,再运行

49 次小挑战

做一道小题,翻译一段代码,再改一个条件。答错没关系,结果会告诉你下一步该试什么。

04

看看哪里会坏

故意制造故障

让回信迟到,让 mailbox 堆积,让进程退出。观察结果,也记住这个实验不能说明什么。

汇合处

写法不同,骨架相通

学过一门,不必把另一门从头重学。先认出相同的值、模式和函数,再看它们怎样在 BEAM 上使用进程与消息。

  1. 1
    拿熟悉的写法当尺子

    先用学过的语言看清数据和函数。

  2. 2
    对照另一种写法

    找相同的 atom、tuple、模式和模块。

  3. 3
    共用一套运行时本领

    进程、消息和监督,从这里一起学。

看两种语言怎样对暗号
ELIXIR
同一 VM
ERLANG
:ok同一个标签 atomok
Foo.bar()找到同一个模块'Elixir.Foo':bar()
:lists.reverse(xs)借用同一个 Erlang 工具lists:reverse(Xs)
fn x -> x * 2 end都在创建匿名函数fun(X) -> X * 2 end
GenServer同一个 OTP behaviourgen_server
问题课 · BEAM 主线

从一个具体故障,走到可靠系统

核心有 7 站,另有 2 站语言跳级复习和 2 站双语扩展。先用熟悉的语言走完进程、OTP、容量与综合项目;需要互操作时,再补共享 term 与 adapter。

核心进度 · 前置、复习与双语扩展不计入0 / 7 个核心小站
0%
01

准备好,认识 BEAM

先确认工具能跑,再用第一个进程分清函数、状态、PID 与消息。

02

按需补语言

只在需要时补另一门语言。单语言学习者不必在这里停下。

03

处理并发故障

从迟到回复、mailbox 堆积、重启范围和容量上限进入 OTP。

04

守住系统边界

核心从节点断线直达综合项目。需要双语协作时,再走共享 term 与 adapter 支线。

试 3 分钟

发消息,等回信

每个进程都有一个 mailbox,像驿站收信箱。先发几条消息,再逐条处理。打开“故意不回 reply”,看看消息已经处理、reply 却没有发出时会怎样。

  • 01消息发出,不等于已经收到或处理
  • 02timeout 结束等待,但不会撤回消息
  • 03mailbox 会积压,不能只收不处理
消息实验
PROCESS 01client发送 request
→
MAILBOX0
等待消息
→
PROCESS 02server已处理 0 条
mailbox 为空reply: 正常
事件记录最新在上

01等待 client 发送消息

这是浏览器中展示消息传递的模型,不是真正的 Erlang VM。它用来观察消息怎样排队和回复。课程页另有可在 IEx / erl 运行的代码。

第 08 站 · 综合练习

做一个任务调度器

先用 Elixir 或 Erlang 任一门做出核心版:队列有上限,失败有去向,重试有次数。学过互操作以后,再把另一门语言接进来。

有界队列监督树重试 / 幂等双语扩展(选做)Release
查看任务要求
接口层校验 · 归一化 · 回复
调度核心排队 · 分发 · 重试
worker 01
worker 02
worker 03
监督者退出 → 记录 → 恢复