快速上手

从源码到第一个原生可执行文件,只需要几分钟。

1 · 构建编译器

Emo 的参考实现用 OCaml 5 写成,仓库自带一切 —— 不需要安装第二个编译器。 克隆仓库,用 OCaml 工具链(Dune)构建即可得到 emo 命令:

$ git clone https://github.com/emo-lang/emo.git
$ cd emo
# 使用 OCaml 5 + Dune 构建, 详见仓库 README

2 · 第一行代码

新建 hello.emo:

hello.emo
// hello.emo
const who = "中国"
println("你好, ${who}")

直接运行,无需编译步骤:

$ emo run hello.emo
你好, 中国

3 · 编译成原生可执行文件

emo build 把程序编译成独立的原生二进制 —— 一条命令,一个可执行文件: 调度器与网络栈随二进制发布,没有解释器,没有运行时下载。

$ emo build hello.emo -o hello
built hello
$ ./hello
你好, 中国

编译输出与 emo run 逐字节一致 —— 这是 CI 里的断言,不是口头承诺。

4 · 使用包

项目的 manifest 就是一个 Emo 配置文件,依赖写精确版本; 用 require 把包的短名带进作用域:

package.emo
package {
  name = "acme/hello"
  version = "0.1.0"
  targets = ["native", "wasm"]

  deps {
    json = "2.3.1"
  }
}
main.emo
require "acme/json_tools"

def parse_config(text String) Json {
  return json_tools.parse(text)
}
$ emo deps resolve # 解析依赖, 写入 emo.lock
$ emo deps list # 查看解析结果
$ emo build main.emo -o app

依赖解析是构建的副产品 —— 库没有单独的 install 步骤,emo.lock 纳入版本控制,构建永不静默改写它。

5 · 探索示例

仓库的 examples/ 目录里,每个目录都是一个可运行的演示项目:

  • language_tour —— 一个带讲解的程序读懂核心概念,从这里开始
  • pipeline —— 并发流水线:do / <- / receive
  • tcp_echo —— 直接风格网络:一个程序里的服务端与客户端
  • numerics —— 原生后端:foreign def C 绑定与特化数值内核
  • shop —— 模块系统:目录树即模块树,含 internal/ 私有子树
  • http_roundtrip —— 本机 HTTP 服务端与客户端的一次往返

下一步