3 个版本 (破坏性)

0.4.0 2022年1月17日
0.2.0 2021年4月6日
0.1.0 2021年3月28日

#400 in 编程语言

GPL-3.0-or-later

250KB
3K SLoC

Rust 2.5K SLoC // 0.0% comments TypeScript 374 SLoC // 0.0% comments

lipstick 💄🐷

你可以在猪上涂口红

是什么

lipstick 将 Rust 语法的一个子集编译成 C。它不是一个 "Rust 子集",因为没有借用检查或生命周期。它只是 C 的 Rust 风格语法前端。

沙箱 中查看其效果。

为什么

因为很有趣,对吧。

此外,它可能是一个很好的教学工具,因此您可以暂时 "关闭" 借用检查。您可以看到在不实际拥有任何 C 或 C++ 知识的情况下编写系统语言的样子。

使用方法

lipstick 0.3.0
Lipstick for C

Compile Rust-like syntax into C code

USAGE:
    lipstick [FLAGS] [OPTIONS] <INPUT> [-- <COMPILER FLAGS>...]

FLAGS:
    -C, --cc         Compile the output of lipstick by calling your C compiler
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -Z <FEATURE>                 Debugging flags [possible values: syn]
        --compiler <COMPILER>    Specifies which C compiler to invoke [default: cc]
    -o, --out <OUT>              The file to write the output to ("-" for stdout) [default: <INPUT>.c]

ARGS:
    <INPUT>                The file to be compiled to C
    <COMPILER FLAGS>...    Flags for the `cc` compiler

示例

输入

fn foo() -> &u32 {
  let x: u32 = 7;
  let y: &u32 = &x;
  y
}

输出

lipstick foo.rs
#include <stdint.h>
#ifndef u32
#define u32 uint32_t
#endif
u32 * foo() ;
u32 * foo() {
  u32 x = 7;
  u32 *y = &x;
  return y;
}

参考

原始类型

u8-u64i8-i64isizeusizebool 和浮点数被翻译成等效的 C 类型。永不类型 ! 可用于返回位置。

复合类型

您可以定义结构体和联合体,并使用长度为常数的数组。定义顺序无关紧要。也可以使用函数类型。

引用

可以自由使用引用 &x 和解引用操作符 *x,无需烦人的生命周期来打扰您。

控制流

if - elsewhileloop 都可以工作。带标签的循环和 break/continue 也都可以工作。可以使用文字范围 0..n0..=nfor 循环。

可以使用 match 表达式,它们将被翻译为 switch 语句,但允许的模式只能是字面量或变量(除了一个可选的、最后的通配符 _),块是唯一允许的主体。

表达式

函数中的隐式返回是有效的。

包含指令

您可以使用 include![my_header]include![<sys/elf>](注意缺少扩展名)来生成包含指令。

类型推断

对于本地定义的类型,-> 操作符会被自动推断。

不支持的特性

  • 不支持复杂的 restrictconstvolatile 特性。
  • 不支持类型推断、生命周期、特性、泛型、方法、impl、可见性修饰符、路径、元组、模式、属性等。

待办事项

  • 某种形式的 use 模块
  • Stdlib 访问
  • 保留注释
  • 字符/字符串语义
  • static 类型
  • 元组?
  • 枚举
  • 用于“注解”的属性(例如 volatile
  • 类型推断?
  • 宏?
  • cc 错误映射回原始源代码?

依赖关系

~3–10MB
~98K SLoC