来自 Scrapscript 编译器的一些技巧

  • Scrapscript是一种小型、纯函数式、内容可寻址、以网络为先的编程语言。

    • 之前的帖子讲了编译器,此篇讲后续添加的优化技巧。
    • 这些技巧是语言运行时的标准操作程序,目标是在不使编译器或运行时显著更复杂的情况下添加尽可能多的功能,完全功能的优化编译器即将推出但尚未准备好。
  • 编码小整数和其他对象:

    • 编译器假设编译到 64 位机器,每个指针有 8 字节可用,已用低字节标记,还有其他用于小整数、堆对象、空列表、洞、小字符串、即时变体等的位模式。
  • 小字符串:

    • 用 7 字节存储字符串数据,1 字节存储标签,标签 5 位长,剩余 3 位编码长度。
    • 编码版本需结合 ASCII 表理解,存储是小端序,运行时代码用于构建非常量字符串。
  • 变体:

    • 类似 SML/OCaml 变体的动态类型版本,Scrapscript 在运行时保留标签。
    • 之前变体是堆分配的对,现在添加了即时变体,支持标记的洞,如#true ()#false (),使布尔值模式匹配更快。
  • 常量堆:

    • 对于已知常量的列表,如[1, 2, 3],编译器可在编译时检测并将所有 cons 细胞分配为常量 C 全局变量。
    • 通过const_heap列表存储常量数据,使用CONST_HEAP宏指示链接器将对象放入自定义部分,_mksmallint宏生成小整数,empty_list宏生成空列表标记指针,ptrto函数给常量数据添加标记。
    • 为防止垃圾回收器对常量数据进行写操作和更新引用,使用in_const_heap函数检查指针是否在常量堆范围内。
    • 支持几乎所有常量对象,包括整数、字符串、变体、列表、记录、闭包等。
  • 建议与尝试:

    • 欢迎发送关于使用 Scrapscript 作为编译器和运行时游乐场的想法和实现。
    • 正在研究基于OpenSmalltalk的即时doubleChakraCore的做法。
    • 可运行./scrapscript.py compile --compile examples/0_home/factorial.scrap生成output.ca.out,也有编译器 web REPL,可在discourse group获取更多信息和参与贡献。
阅读 9
0 条评论