#linker #configuration #set #declarative #programming #array #run-time

linker-set

通过链接器构建的数组进行声明式编程

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数据结构

Download history 10/week @ 2024-05-20 198/week @ 2024-07-01 224/week @ 2024-07-08 102/week @ 2024-07-15 207/week @ 2024-07-29 18/week @ 2024-08-05

每月383 次下载

BSD-3-Clause

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