CatEricka / paper-scheme

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Paper Scheme

简单的 scheme 实现, 元循环实现和标准库基于 TinySCHEME(http://tinyscheme.sourceforge.net/home.html)

标记指针的实现参考了 Chibi-Scheme (https://github.com/ashinn/chibi-scheme)

特征:

  • 使用标记-整理 (Mark-Compact) 垃圾回收算法
    • 这意味着所有 C 函数都要对栈上的对象参数谨慎使用, 因为垃圾回收会移动对象
  • 支持 int64_t, char, boolean, '(), EOF 类型的标记指针
    • 这些都不是真正的对象, 而是带有特殊标记的指针立即数(详见 include/paper-scheme/object.h),可以节省内存使用,理论上提高性能

已知问题:

  • 内存不足时会直接退出;
  • ungetc 只有在 FILE * 缓存正确设置时生效

TODO:

  • 完成基本类型内存布局的基本定义
  • 完成标记指针实现
  • 实现 OBJ_CHAR, OBJ_BOOLEAN, OBJ_UNIT, OBJ_EOF 立即数
  • 初步完成基本类型系统的定义
  • 完成 int64double number 的标记指针与实际对象的定义和测试
  • 完成 pair 类型定义
  • 构造上下文结构体
  • 实现自动增长的堆结构
  • 实现运行时分配对象的内存对齐
  • 初步构造 gc_collect() 流程
  • 实现 标记-压缩 (Mark-Compact) 垃圾回收算法
  • 实现 C 函数栈上的托管对象保护链和相关 API, 因为 GC 需要追踪 C 调用栈上的对象保证正确追踪对象引用图的根和修正引用
  • 正确实现 GC 移动对象后调整对象引用
  • GC 应当从 context_t 结构体中获取类型信息, 更方便扩充新类型
  • 向上下文结构体添加类型信息与相关信息注册
  • 实现获取对象类型相关的 API
  • 实现大量基础类型: bytes, string, string_buffer, symbol, vector, stack, port, weak_ref
  • 完善基础类型操作 API
  • 实现各种类型的 hash 算法 和 equals 函数, 并注册到全局类型信息表
  • 实现 hashmaphashset
  • 进行各种基础类型反射, hashequals 函数的测试
  • 完成 hashset / hashmap 的测试
  • 实现 weak_ref_hashmap
  • 实现支持 延续 的 scheme stack
  • 实现 environment 链
  • 实现 repl 需要的相关框架
  • 开始实现元循环
  • 实现 proc syntax 相关
  • 实现 opcode/proc 类型检查
  • 实现初始过程和特殊符号表赋值
  • 实现运行时类型与解释器结构
  • 实现 stdio_port / string_port 相关操作
  • 初步实现 opcodes.h
  • 初步实现元循环
  • 实现词法分析
  • 实现 promise
  • 完善元循环
  • 完善内部过程
  • 完善类型系统
  • 完善解释器
  • 实现标准库
  • 完成内部函数
  • 完成最终测试
  • 性能测试
  • 尝试优化性能

致谢

TinySCHEME 的作者 D. Souflis 与贡献者

Mini-Scheme 的作者与贡献者:Atsushi Moriwaki,Akira KIDA,R.C. Secrist

Chibi-Scheme 的作者 Alex Shinn 与贡献者

About


Languages

Language:C 92.8%Language:Scheme 6.7%Language:CMake 0.5%