2个版本
0.1.1 | 2024年2月11日 |
---|---|
0.1.0 | 2024年2月9日 |
#1029 in 解析器实现
193 每月下载量
在 4 个crate(直接使用2个) 中使用
250KB
6.5K SLoC
libyaml-safer
此库是unsafe-libyaml
的分支,已翻译成安全和惯用的Rust。
unsafe-libyaml
是将C语言编写的libyaml
翻译成不安全的Rust,并借助c2rust进行转换。
[dependencies]
libyaml-safer = "0.1"
编译器支持:需要rustc 1.70
注意
此库使用与unsafe-libyaml相同的测试套件,这也是libyaml的“官方”测试套件。该库逐行、逐函数从unsafe-libyaml移植,目的是精确匹配其行为,包括性能和分配模式。除因Rust惯例导致的API差异之外,任何可观察到的行为差异都视为错误。
上述内容的一个显著例外是,在此库中,尽可能使用Rust标准库替换自定义例程。例如,大多数UTF-8和UTF-16编码和解码由标准库处理,而输入/输出回调被替换为相应的std::io::*
traits。由于使用了std::io
,此库目前无法使用no_std
。
内存分配模式通常保持不变,但标准库容器可能会使用不同的启发式方法过度分配缓冲区。
在libyaml例程被标准库替换的地方,某些错误可能比libyaml(例如,错误消息可能略有不同)报告的精确度低,但相同的输入应生成相同的一般错误。
兼容性和互操作性
尽管此库与libyaml的行为一致,但它并不是作为直接替换而设计的。API的形状是惯用的Rust,尽管可以使用此库模拟C API,但支持此用例不是优先事项。如果需要,请使用unsafe-libyaml
。
性能
性能与 unsafe-libyaml
大体相当。除了选择最直接的方法将 C 类代码的概念合理地移植过来之外,没有在这方面投入显著的努力。
请参阅 benches/bench.rs
以获取一个非常简单的基准测试,它处理一个非常大的 (~700 KiB) YAML 文档。在我的机器(Ryzen 9 3950X)上,这个库的解析器稍微慢一点,而发射器稍微快一点,但两者都与不安全的对应物大约 ~1ms 的差距。在您的机器上运行 cargo bench
以进行测试。
如果有需求,优化解析器的路径是明确的。例如,由于它是直接从执行指针算术的不安全 C 类代码移植过来的,因此它为每个输入字节执行了完全不合理数量的边界检查。
许可证
MIT 许可证,与 unsafe-libyaml 和 libyaml 相同。