1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2020 年 1 月 27 日 |
---|
在 开发工具 中排名第 1266
4KB
Floorplan 编译器
一种用于指定一维地址空间布局的语言,特别适用于用 Rust 和 C/C++ 编写的垃圾回收器和手动内存管理器。
构建和运行
Floorplan 使用 Haskell 编写,必须使用 stack 或 cabal 构建。如果您只想在系统上全局构建和安装 Floorplan,可以执行以下操作
$ cabal install flp
这将从 Hackage 拉取 Floorplan 的最新稳定版本,并全局安装 flp
可执行文件。如果您希望修改编译器或直接从另一个 Haskell 项目引用它,您可以拉取此仓库的 master 分支并按以下方式构建项目
$ git clone --branch master https://github.com/RedlineResearch/floorplan.git
$ cd floorplan && stack build
...
Completed 2 action(s).
此时,您可以使用 build-immix
脚本编译文件 examples/immix/layout.flp
$ ./build-immix
...
Compiling immix_rust v0.0.1 (/home/karl/w/flp/examples/immix)
Finished dev [unoptimized + debuginfo] target(s) in 4.56s
此脚本确保构建 Floorplan 编译器,为当前用户安装它,然后构建 Immix 项目,该项目本身调用 Floorplan 编译器来构建文件 examples/immix/src/heap/layout.flp
。
要运行编译器以针对其他 .flp
文件,可以按以下方式直接运行编译器
stack exec flp [path/to/layout.flp] [path/to/generated.rs]
Rust
请注意,为了构建以此方式生成的 Rust 文件,您必须在 Cargo 依赖中包含 flp-framework
,并将 flp-compiler
添加到 cargo build-dependencies 中。后者只是一个调用(已使用 stack 安装)flp 编译器的包装器,而框架 crate 包含生成 Rust 代码所需的所有宏和地址类型。
此仓库中的 genrs/
目录提供了 Rust cargo 项目的骨架,可以复制并修改以支持除 immix-rust 以外的其他内存管理器的需求。
C/C++
C/C++ 输出正处于积极开发中。无论选择哪种输出类型(.c
、.h
或 .hpp
),编译器都将输出相同的类似C的代码。这预计将与Clang编译器的最新版本兼容,但也可能在GCC的现代版本中正常工作。
在报告Floorplan编译器的C输出模式问题时,请首先检查或合理地相信同样的问题发生在Clang上。针对不同C编译器定制编译器的修改非常欢迎,但我们打算主要支持Clang作为后端工具链。
依赖项
此存储库的 deps/
目录中包含了一个定制版本的 language-rust 包,该包增加了将宿主语言表达式直接splice到Rust代码中的支持。这是Floorplan生成Rust代码的机制。
测试和贡献
如果您想帮助维护或为此项目贡献新的代码,请随意发起一个pull request,或者最好在问题跟踪器中发起一个问题,这样您可以在过程中获得我们的反馈。在编译器上有很多可以工作的途径,包括但不限于
- 使用Floorplan布局实现更多的Rust分配器示例。
- Rust模板,用于在对齐边界上进行分配。
- 广泛记录生成的接口。
- 更好的错误消息。
- 将核心语义(
app/semantics.hs
)直接集成到项目src/
层次结构中。 - 调用SMT库来验证对齐和大小约束。
- 针对C和Rust。
- 支持非64位架构。
- 生成调试断言。
- 动态跟踪堆中每块类型的详细信息。
- 通过直接将Rust splicing支持集成到 上游存储库(例如,作为一个单独的quasiquoter)来清理依赖项。
- 在生成的函数旁边生成基于cargo的Rust文档,指出为什么生成某个函数以及它可能如何被使用。
- 修复
proofs/*.v
文件中的Coq证明。 - 更好的Rust集成和下游crate。
lib.rs
:
官方Floorplan编译器crate
此模块与Floorplan编译器的Haskell实现接口,为将Floorplan规范编译成Rust代码提供官方支持,直接从cargo工具链进行。
为了使用此crate,您必须在开发基于Floorplan的内存管理器时,在您的 $PATH
上有 flp
可执行文件。
要直接从cargo工具链编译,请在项目根目录中包含一个类似的 build.rs
extern crate flp_compiler as flpc;
fn main() {
flpc::Build::new()
.src("src/heap/layout.flp")
.dest("src/heap/layout.rs")
.compile();
}
有关获取Floorplan编译器的信息,请查看此处GitHub项目。