简介
编译器之争的理想目标是创建一个能在2核2G内存的机器上运行的解释器或编译器。
你的解释器或编译器应该处理一种称为"抽象语法树"的结构,它以JSON格式存储。这个抽象语法树将由我们使用本仓库中提供的特定工具生成。
你的任务是接收包含抽象树的JSON,然后根据抽象树中提供的信息来解释或编译程序。
简而言之:
- 我们给你一个包含树结构的JSON
- 你运行这个JSON
- 你对出现的结果感到高兴
运行方法
每个项目都应该有自己的Dockerfile
,以便我们能够运行
如何测试
要进行测试,你可以使用files/fib.rinha
文件,并使用我们在这里提供的程序生成JSON,或者你可以直接使用files/fib.json
中的JSON。
在比赛期间,我们会添加其他测试 :)
要求
你需要提交一个PR,修改PARTICIPANTS.md文件,添加一行包含你的仓库地址。这可能会在之后有所改变(请保持关注)。
你的仓库需要在根目录下有一个镜像,我们将在排名过程中构建该镜像。
规范
该语言需要基于某个文件运行,该文件是这里指定的Rinha AST的JSON。
- 文件需要从
/var/rinha/source.rinha.json
读取 - 如果你想手动读取AST,也可以从
/var/rinha/source.rinha
读取
这是一种动态编程语言,类似于JavaScript、Ruby等。
编译器之争项目有一个JSON的"解释器",它返回一个AST,代码需要以不同方式进行测试,如斐波那契之外的其他算法。
示例
斐波那契示例
let fib = fn (n) => {
if (n < 2) {
n
} else {
fib(n - 1) + fib(n - 2)
}
};
print("fib: " + fib(10))
比赛
提交PR的截止日期是9月23日,之后将拒绝接受项目。
将允许在9月27日之前进行调整,你可以在测试公布后修改你的实现。
结果
排名 | 姓名 | 语言 | 类型 | 得分 |
---|---|---|---|---|
1 | Raphael M. R. Victal | Golang | 树遍历 | 72786 |
2 | Tacio | Golang | 树遍历 | 72582 |
3 | cleissonbarbosa | Haskell | 树遍历 | 72458 |
4 | Danfs | TypeScript | 树遍历 | 70096 |
5 | Valmor Flores | Flutter | 69584 | |
6 | Victor Augusto | TypeScript | 树遍历 | 69273 |
7 | fabiosvm | C | 字节码解释器 | 68737 |
8 | coproduto | ⚡Zig | 树遍历 | 68647 |
9 | Adriano dos Santos Fernandes | C++ | 树遍历 | 68309 |
10 | Ítalo Paulino (irbp) | Dart 🎯 | 树遍历 | 67919 |
资源
一些学习如何制作自己的解释器或编译器的有用资源:
- https://www.youtube.com/watch?v=t77ThZNCJGY
- https://www.youtube.com/watch?v=LCslqgM48D4
- https://ruslanspivak.com/lsbasi-part1/
- https://www.youtube.com/playlist?list=PLjcmNukBom6--0we1zrpoUE2GuRD-Me6W
- https://www.plai.org/
请关注,一些有用的视频和文章即将发布。