#内存布局 #规范语言 #flp #确保 #v0 #floorplan #necessities

flp-framework

Floorplan,一种内存布局规范语言,代码生成需求

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2020年1月27日

#888开发工具

MIT 许可证

27KB
250

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,并在 cargo build-dependencies 中包含 flp-compiler。后者是一个调用(已使用 stack 安装)flp 编译器的包装器,而框架 crate 包含生成 Rust 代码使用的必要宏和地址类型。

本仓库的 genrs/ 目录中给出了Rust cargo项目的骨架,可以复制并修改以支持除immix-rust之外的内存管理器的需求。

C/C++

C/C++ 输出正处于积极开发中。无论选择哪种输出类型(.c.h.hpp),编译器都将输出相同的C-like代码。预计这可以在Clang编译器的最新版本上工作,但也可能在现代版本的GCC下正常工作。

在报告Floorplan编译器的C输出模式问题时,请首先检查或在合理程度上相信该问题在Clang中也存在。对编译器进行修改以适应不同的C编译器的输出是受欢迎的,但我们打算主要支持Clang作为后端工具链。

依赖项

在当前仓库的 deps/ 目录中包含了一个针对 language-rust 的自定义版本,它添加了对将宿主语言表达式直接拼接到quasiquoted Rust代码中的支持。这是Floorplan生成Rust代码的机制。

测试和贡献

如果您想帮助维护或为此项目贡献新代码,请随时提交pull request,或者最好是开始在问题跟踪器中发起一个问题,这样您可以在过程中得到我们的反馈。编译器的工作途径有很多,包括但不限于

  • 使用Floorplan布局实现的更多示例Rust分配器。
  • Rust模板,用于在对齐边界上分配。
  • 广泛记录生成的接口。
  • 更好的错误信息。
  • 将核心语义(app/semantics.hs)直接集成到项目 src/ 层次结构中。
  • 调用SMT库来验证对齐和大小约束。
  • 针对C和Rust。
  • 支持非64位架构。
  • 生成调试断言。
  • 动态跟踪堆中每个部分的类型信息。
  • 通过直接将Rust拼接支持集成到 上游存储库(例如,作为单独的quasiquoter)来清理依赖项。
  • 在生成的函数旁边生成基于cargo的Rust文档,说明为什么生成某个特定函数以及如何使用它。
  • 修复 proofs/*.v 文件中的Coq证明。
  • 更好的Rust集成和下游crate。

lib.rs:

flp_framework Crate

此模块包含Floorplan编译器的Rust绑定,用于生成以地址类型为单位的代码。这些接口支持基本的算术运算、地址比较、美化打印和直接内存访问。

有关获取Floorplan编译器的信息,请参阅此处GitHub项目

无运行时依赖