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的即时
double
和ChakraCore的做法。 - 可运行
./scrapscript.py compile --compile examples/0_home/factorial.scrap
生成output.c
和a.out
,也有编译器 web REPL,可在discourse group获取更多信息和参与贡献。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。