2个不稳定版本
0.2.0 | 2020年11月2日 |
---|---|
0.1.0 | 2020年10月31日 |
#341 在 编程语言 中
275KB
4K SLoC
包含 (静态库,120KB) lib/src/zig-cache/lib/libstd.a
ezc
ez语言的编译器。
这是学校独立学习的一部分。
目标
- 学习很多
ez
应该类似英语- 仅使用Rust标准库
- 编写一个(最小化)可工作的编译器。可能是u64,也可能是数组
- 用另一种语言(zig,rust,c,汇编等)为
ez
编写一个(最小化)标准库
说明
要运行,只需执行 ezc 文件
,使用 -g
标志以获取调试信息(它将生成一个out.asm文件)。然后您可以在gdb或lldb中打开它。
要获取标准库,将 -stdlib-path /path/to/stdlib
传递给编译器。要编译标准库,进入此编译器中的lib目录。然后在那个目录中运行 zig build
,并在 zig-cache/lib/libstd.a
中查找库。您可能需要接近zig的master分支。您可以在以下位置找到它:https://ziglang.org/download/。
要测试代码: cargo test
要测试生成的代码,可以执行 cd tests; ./test.sh
。注意:这需要 gcc
。
依赖关系
- Zig (master)。注意:如果您想在没有zig的情况下构建,请执行
HAS_NO_ZIG=1 cargo ...(您想要的任何命令)
。这可能对在没有zig的系统上构建或在提供您自己的标准库时很有用。 - nasm
- cargo
- gcc(仅用于测试)
资源
- http://www.eis.mdx.ac.uk/staffpages/r_bornat/books/compiling.pdf - 关于编译器的书籍
- http://www.egr.unlv.edu/~ed/assembly64.pdf - 关于x86-64汇编的书籍
- https://ruslanspivak.com/lsbasi-part1/ - 这一系列博客作为编译器前端的参考
- godbolt.org - 一个交互式网页,用于探索编译器如何在后端工作
- http://tinf2.vub.ac.be/~dvermeir/courses/compilers/compilers.pdf - 关于编译器的书籍。
- https://github.com/ziglang/zig - 另一种编程语言的源代码
- http://www.cs.ecu.edu/karl/5220/spr16/Notes/Lexical/finitestate.html - 作为一个状态机的词法分析器的解释
- https://llvm.net.cn/docs/tutorial/MyFirstLanguageFrontend/index.html - 另一篇关于编译器的教程。它是由行业领先的编译器工具链(llvm)的领导者编写的
- http://www.cs.man.ac.uk/~pjj/cs2111/ho/node10.html - 表达式的基于栈的代码生成
- https://craftinginterpreters.fullstack.org.cn/ - 关于解释器的书籍。可能很有用
- https://wiki.osdev.org/System_V_ABI 讨论了这个 System V ABI:用于调用约定。这也涉及 https://wiki.osdev.org/Calling_Conventions
功能
-
词法分析器
-
抽象语法树(AST 项目结构体)
-
解析器
-
代码生成
-
不可变赋值
-
可变变量
-
语义分析。
-
表达式(递归解析的开始)
-
if 语句
-
循环
-
花哨的编译错误(带有箭头)
-
函数
-
模块
-
字符字面量
-
标准库
-
输入/输出
-
数组和字符串字面量
-
完成博客文章
-
完成文档
-
删除所有
TODO