#language #compiler #wasm-binary #binary-format

bin+lib june-lang

一个在 wasm 上运行的小型静态类型语言

1 个不稳定版本

0.1.0 2024 年 1 月 21 日

WebAssembly 中排名第 1195

MIT 许可证

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