快速上手
从源码到第一个原生可执行文件,只需要几分钟。
1 · 构建编译器
Emo 的参考实现用 OCaml 5 写成,仓库自带一切 —— 不需要安装第二个编译器。 克隆仓库,用 OCaml 工具链(Dune)构建即可得到 emo 命令:
$ git clone https://github.com/emo-lang/emo.git
$ cd emo
# 使用 OCaml 5 + Dune 构建, 详见仓库 README
$ cd emo
# 使用 OCaml 5 + Dune 构建, 详见仓库 README
2 · 第一行代码
新建 hello.emo:
// hello.emo
const who = "中国"
println("你好, ${who}")直接运行,无需编译步骤:
$ emo run hello.emo
你好, 中国
你好, 中国
3 · 编译成原生可执行文件
emo build 把程序编译成独立的原生二进制 —— 一条命令,一个可执行文件: 调度器与网络栈随二进制发布,没有解释器,没有运行时下载。
$ emo build hello.emo -o hello
built hello
$ ./hello
你好, 中国
built hello
$ ./hello
你好, 中国
编译输出与 emo run 逐字节一致 —— 这是 CI 里的断言,不是口头承诺。
4 · 使用包
项目的 manifest 就是一个 Emo 配置文件,依赖写精确版本; 用 require 把包的短名带进作用域:
package {
name = "acme/hello"
version = "0.1.0"
targets = ["native", "wasm"]
deps {
json = "2.3.1"
}
}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
$ emo deps list # 查看解析结果
$ emo build main.emo -o app
依赖解析是构建的副产品 —— 库没有单独的 install 步骤,emo.lock 纳入版本控制,构建永不静默改写它。
5 · 探索示例
仓库的 examples/ 目录里,每个目录都是一个可运行的演示项目:
- language_tour —— 一个带讲解的程序读懂核心概念,从这里开始
- pipeline —— 并发流水线:
do/<-/receive - tcp_echo —— 直接风格网络:一个程序里的服务端与客户端
- numerics —— 原生后端:
foreign defC 绑定与特化数值内核 - shop —— 模块系统:目录树即模块树,含
internal/私有子树 - http_roundtrip —— 本机 HTTP 服务端与客户端的一次往返
下一步
- 语言漫游 —— 八个小节读完语言核心
- 语言特性 —— 每个设计决定的理由
- github.com/emo-lang/emo —— 源码、文档与 issue