8个版本
0.3.5 | 2024年8月3日 |
---|---|
0.3.4 | 2024年8月2日 |
0.3.3 | 2024年7月14日 |
0.2.0 | 2024年4月18日 |
0.1.0 | 2024年4月17日 |
1200 在 数据结构 中
每月383 次下载
16KB
213 行
简介
链接器集允许您通过将配置或行为嵌入为数据来声明式地编程,而不是命令式编程。
使用链接器集,您可以在整个程序中分散某种类型的实例,并且,通过适当的注释,链接器将它们收集到ELF二进制文件的特殊部分,形成一个数组,该数组可以在运行时迭代。
请参阅src/lib.rs中的测试用例以了解使用方法,但总体思路是
use linker_set::*;
set_declare!(name, type);
#[set_entry(name)]
static VAR: type = ...;
for i in set!(name) ...
set_declare!() 宏输出模块定义。该模块必须导入到调用set_entry属性和set!()宏的作用域中。
如果您将整数类型制作成链接器集,应使用类型字面量,而不是泛型整数字面量。例如
static FOO: u64 = 1000u64; // not 1000
泛型整数字面量将破坏由set_entry宏输出的类型检查机制。
集合中的所有项应具有相同的大小,即声明类型的尺寸。否则,一些功能将无法正常工作。宏试图对集合条目进行类型检查,但它们并不是万无一失的。作者警告。
索引操作符有点像是为了好玩。显然,您不应该依赖链接器提供任何特定的顺序。
历史
这个想法来自Clustrix,这是世界上最好的分布式关系数据库,但没有人知道。Clustrix是用一种非常不寻常但非常有趣的C风格编写的。其中大部分是用延续传递风格编写的,而延续和轻量级线程(纤丝)运行在一个类似于后来流行的异步运行时(如Tokio)的调度器之上。(但Clustrix始于2006年,在那之前并不流行。)
在Clustrix代码中广泛使用链接器集来做诸如通过图(initgraphs)指定初始化或其他系统进程、自动创建堆以进行内存分配、自动分配整数或标志以替代通常需要集中控制的常量,以及自动将结构或处理程序注册到子系统中等事情。
这个概念最初出现在Git中Clustrix代码的最古老版本中。一个先前的Subversion存储库似乎已经丢失。灵感似乎来自FreeBSD,FreeBSD有几个宏的名称与Clustrix源代码中使用的宏名称完全匹配。
https://en.wikipedia.org/wiki/Clustrix https://github.com/freebsd/freebsd-src/blob/main/sys/sys/linker_set.h
另请参阅
“linkme”这个crate执行类似的功能,将这个概念称为“分布式切片”。
Sidney Cammeresi [email protected]
依赖项
~260–710KB
~17K SLoC