模块 00查看课程目录
起跑线:两门语言,一台机器
先把 Erlang、Elixir、BEAM、OTP 与 Mix 的关系说清楚。
先修正心智模型,再增加 API
很多初学者把 Elixir 当作“换了语法的 Ruby”,把 OTP 当成一个可以随时补学的库,又把 Mix、Hex 和 BEAM 混成同一层。这样会在并发、错误处理、依赖和项目结构上不断用错心智模型。本章先固定地图:Erlang 与 Elixir 是语言,BEAM 是运行时,OTP 是构建可靠系统的一组设计原则与组件;Mix 是随 Elixir 提供、负责创建、编译、测试和组织项目的构建工具。
可验证的学习目标
- 能画出“源码 → BEAM 字节码 → BEAM VM → OTP 应用”的关系
- 能分别启动 erl、iex,并解释两者提示符的差异
- 能用版本输出定位安装层、语言层与 OTP 层的问题
- 能解释 Mix 与 IEx、OTP、Hex 的职责边界,并运行最小 Mix 项目
- 会使用终端执行命令
- 知道函数和变量的基本含义
先抓住三个词
BEAM
Erlang/OTP 的虚拟机。它负责调度轻量进程、隔离堆、投递消息和装载代码。
OTP
不是另一门语言,而是一套库、behaviour 与系统设计原则;Supervisor、GenServer 都属于它。
Mix
随 Elixir 安装的构建工具。它通过任务创建、编译、格式化、测试项目并管理依赖;`mix.exs` 是项目配置入口。Mix 不是 BEAM、OTP,也不等于 Hex 包仓库。
先对齐协议,再看标点
两段语法不同,但都在创建一个 BEAM 进程、发送一个 tuple,再用模式匹配接收它。
# 在 IEx 中
parent = self()
spawn(fn ->
send(parent, {:hello, :from_elixir})
end)
receive do
{:hello, source} -> {:received, source}
end%% 在 erl 中
Parent = self(),
spawn(fun() ->
Parent ! {hello, from_erlang}
end),
receive
{hello, Source} -> {received, Source}
end.确认版本,并让 Mix 跑起第一个项目
不要从安装成功的提示猜结论。先比较 Erlang、Elixir 与 Mix 报告的工具链,再让 Mix 生成项目、运行测试,并从项目上下文读取 OTP release。
- 01
运行 `erl`,输入 `erlang:system_info(otp_release).`
- 02
运行 `elixir --version` 与 `mix --version`,标出 Erlang/OTP、Elixir、Mix 三类版本
- 03
执行 `mix new beam_probe`,观察 `mix.exs`、`lib/` 与 `test/` 分别承担什么职责
- 04
进入项目运行 `mix test`,再用 `mix run -e` 从同一项目读取 OTP release
erl -noshell -eval 'io:format("OTP ~s~n", [erlang:system_info(otp_release)]), halt().'
elixir --version
mix --version
mix new beam_probe
cd beam_probe
mix test
mix run -e 'IO.puts("OTP #{:erlang.system_info(:otp_release)}")'- Erlang、Elixir 与 Mix 的输出指向同一套 OTP 工具链
- Mix 生成 `mix.exs`、源码目录和测试目录,而不是另一台 VM
- 生成的示例测试通过,`mix run` 能直接调用 Erlang 的 `erlang` 模块
退出 `beam_probe` 目录后运行 `mix test`。观察 Mix 如何通过缺少 `mix.exs` 判断“这里不是 Mix 项目”,并把它与编译错误区分开。
Mix 已随当前 Elixir 安装,可在这套 OTP 上创建、编译和测试一个最小项目。
示例测试通过不代表所有第三方依赖兼容,也不代表该项目已经具备生产级 OTP 结构。
下面哪一项最准确地描述 OTP?
环境诊断卡
写一份不超过 12 行的诊断输出,包含 Erlang/OTP、Elixir、Mix 版本与当前 Mix 项目状态,并为“命令不存在”“缺少 mix.exs”和“版本不兼容”各写一个排查动作。
提示 1轻推一下
先运行 `elixir --version`、`mix --version` 和 `mix help`。
提示 2缩小问题
区分 shell 找不到命令、Mix 找不到 `mix.exs`,以及 VM 能启动但版本不满足。
提示 3接近实现
把输出保存下来,它会成为后续提问时最有价值的上下文。
提示 4用验收标准反推
从下面每一条验收标准倒推一个最小测试。若某条无法写成测试,先把表述改成可观察结果。
- 能看到 OTP、Elixir、Mix 三类版本信息
- 能说明 `mix.exs` 是项目配置入口,并区分 Mix 与 Hex
- 三种故障分别对应不同排查路径
- 没有把操作系统线程称作 BEAM 进程
复习卡
- 1语言是入口,BEAM 是运行的地方,OTP 是构建可靠系统的方法。
- 2Elixir 调 Erlang 不是跨语言 RPC,而是同一 VM 内的普通模块调用。
- 3Mix 负责项目与构建任务,Hex 提供包生态;从第一天起就把它们与运行时分层诊断。