1 个不稳定版本
0.1.0 | 2024 年 1 月 21 日 |
---|
在 WebAssembly 中排名第 1195
89KB
2.5K SLoC
june-lang
一个小型静态类型(进行中)语言,可以在 wasm 上运行
目的
我想编写一个针对我自己没有创建的虚拟机(VM)的编译器,并想实现静态类型检查,这两者我之前都没有做过。设计理念是“Go 但更简单”,功能集对应于我认为解决 Advent of Code 挑战赛所必需的。
特性
- 支持编译到 wasm 二进制格式
- 嵌入 wasmtime 以进行 wasm 二进制文件的即时编译
- 静态类型:程序在编译时进行检查
- 基本类型:int、float、bool、string
- 常见的算术和逻辑运算符、循环、条件语句
- 递归、相互递归、全局变量的前向引用
- 用户定义的结构体
- 常见集合:map、set、vec
- 垃圾收集
- 文件 I/O
非特性
- 一等函数
- 子类型、接口
- 用户定义类型的泛型
- 并发
TODO
基本程序的端到端(即函数、局部变量、字符串、字符串处理的基本内置函数、垃圾收集)
- 扫描器
- 解析器
- 分析器和类型检查器
- 生成器
- 生成并执行手动翻译的 AST
- 嵌入 wasmtime VM 并使用外部打印
- 翻译器
- 添加字符串
- 泛型打印
- 垃圾收集
添加功能
- 返回类型
- 条件语句
- 循环
- 赋值
- 递归和相互递归
- 全局变量的前向引用
- 结构体
- vec
- map
- set
- 文件 I/O
- 基准测试
- 集成测试
重构
- 在 AST 中编码调用类型不变性
- 重构类型化 AST
- 在 AST 和解析器中避免复制
- 扫描器中只有一个 Fromio::Error
- 添加回 (行,列) 跟踪
- 更好的 peek
- 更好的标记
- 优雅的错误报告
- 改进代数
- 简化糟糕的函数
- 缩小公共接口
- 更好的 main.rs 中的 structopt?
- 阅读并应用 https://thume.ca/2019/04/18/writing-a-compiler-in-rust/
- 阅读并应用 "Rust for Rustaceans" 书籍
- 性能分析和优化
生产化
- 浏览编译器工程的相关部分
- 浏览类型和编程语言的相关部分
示例
请参阅 examples
目录。
安装
依赖项
- Rust (如果是从源代码构建的话)
从源代码构建和安装
git clone [email protected]:dhconnelly/june-lang.git
cargo test
cargo install --path .
从crates.io安装
TODO
使用预构建发布版本
TODO
使用方法
june examples/hello.june
有关更多使用信息,请运行 junec --help
。有关示例,请参阅 examples/
。
前期工作和参考文献
关于wasm和wasmtime的更多详细信息
这是我的第八个爱好语言实现。以下是我之前的一些实现
- parents: 一种动态语言的字节码虚拟机和编译器。使用TypeScript实现。管理自己的堆,并实现标记-清除垃圾回收而不是委托给JS运行时。支持一等函数和闭包,并使用它来实现列表等。这是我第一次实现垃圾回收。
- june-old (不完整): 一种Scheme变体的字节码虚拟机和编译器。使用C++实现。仅编译和评估条件语句和赋值。
- ungulate: 一种Scheme变体的解释器,使用OCaml编写。
- crab (不完整): 一种简单动态语言的字节码虚拟机和编译器。使用Rust实现。我没有实现垃圾回收和赋值,只是复制整个值。这是我第一次从头开始编写编译器的经历。
- yalig: 另一种Scheme变体的解释器,使用Go编写。
- adso: 一个非常简单的解释器,使用JavaScript实现。
- ts: 另一个非常简单的解释器,使用C++实现。这是我第一次从头开始编写解释器的经历。
这些语言都不太有趣:它们都是Scheme变体或JavaScript类似物。June是我第一次尝试创建静态类型语言。尽管我使用过很多语言 - 我以专业身份编写过C、C++、Objective-C、Java、Scala、JavaScript、TypeScript、Python和Go(不包括领域特定语言),以及Rust、Clojure、Haskell、OCaml和Scheme(作为爱好),但我对语言设计不如实现感兴趣 :)
我阅读了很多使这成为可能的内容。以下是我帮助最大的资源
此外,我还阅读了大部分SICP,并在《工程编译器》和《ML中的现代编译器实现》教材中翻阅。
在此之前,我还曾在Google的GCL团队上工作过一段时间。(GCL是一种奇怪的内建语言,用于在各种场景中生成协议缓冲区,包括配置Borg作业以及实时实验;有关更多信息,请参阅这篇论文)。由于各种原因,我没有待够长的时间以产生影响,但我很幸运有机会审查团队为新语言实现编写的大量代码,包括一些字节码虚拟机和编译器以及垃圾回收。这是一次很好的(尽管短暂的)学习经历。
在那之前,我还曾在Google Web Toolkit(一个Java到JavaScript编译器)团队实习,并在Google Sheets团队的大部分时间里实习,专注于J2ObjC,一个Java到Objective-C编译器。
许可证
MIT
依赖项
~15–28MB
~388K SLoC