1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2020 年 1 月 27 日

开发工具 中排名第 1266

MIT 许可证

4KB

Floorplan 编译器

一种用于指定一维地址空间布局的语言,特别适用于用 Rust 和 C/C++ 编写的垃圾回收器和手动内存管理器。

构建和运行

Floorplan 使用 Haskell 编写,必须使用 stackcabal 构建。如果您只想在系统上全局构建和安装 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项目

无运行时依赖