6 个版本

0.0.7 2023 年 6 月 2 日
0.0.6 2023 年 1 月 12 日
0.0.5 2022 年 3 月 9 日
0.0.4 2022 年 2 月 21 日
0.0.1 2021 年 9 月 14 日

#331开发工具

Download history 58/week @ 2024-03-11 49/week @ 2024-03-18 165/week @ 2024-03-25 209/week @ 2024-04-01 259/week @ 2024-04-08 346/week @ 2024-04-15 261/week @ 2024-04-22 212/week @ 2024-04-29 212/week @ 2024-05-06 232/week @ 2024-05-13 163/week @ 2024-05-20 316/week @ 2024-05-27 521/week @ 2024-06-03 149/week @ 2024-06-10 192/week @ 2024-06-17 48/week @ 2024-06-24

970 每月下载量

GPL-3.0 许可证

230KB
6K SLoC

Koopa

github crates.io docs.rs build status

用于生成/解析/优化 Koopa IR 的库。

Koopa IR 是为北京大学编译课程设计的面向教育的下一代中间表示。

使用方法

cargo add koopa

Koopa IR

以下是一个 Koopa IR 中的 "Hello, world!" 程序示例

// `putchar` function in libc.
decl @putchar(i32): i32

// A helper function for printing strings (integer arrays).
fun @putstr(@arr: *i32) {
%entry:
  jump %loop_entry(@arr)

%loop_entry(%ptr: *i32):
  %cur = load %ptr
  br %cur, %loop_body, %end

%loop_body:
  call @putchar(%cur)
  %next = getptr %ptr, 1
  jump %loop_entry(%next)

%end:
  ret
}

// String "Hello, world!\n\0".
global @str = alloc [i32, 15], {
  72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 10, 0
}

// `main` function, the entry point of the program.
fun @main(): i32 {
%entry:
  %str = getelemptr @str, 0
  call @putstr(%str)
  ret 0
}

Koopa IR 是一个基于强类型 SSA 形式的中间表示。它简单但功能强大,足以支持将代码编译成机器指令或对其进行一些高级优化。

更多详细信息,请参阅 Koopa IR 文档(中文)。

示例

请参阅 examples 目录,其中包含三个示例

  • opt:一个简单的 Koopa IR 优化器。
  • brainfuck:一个从 brainfuck 编译到 Koopa IR 的编译器。
  • interpreter:一个简单的 Koopa IR 解释器。

还有一些更复杂的示例

  • kira-rs:Kira 编译器(Rust 版本),将 SysY 语言编译成 Koopa IR 和 RISC-V 汇编。
  • kira-cpp:Kira 编译器(C++ 版本)。

参考文献

Koopa IR 库深受 LLVMCranelift 的影响。

变更日志

请参阅 CHANGELOG.md

许可证

版权 (C) 2010-2023 MaxXing。许可证 GPLv3。

依赖

~0.1–9.5MB
~53K SLoC