3 个版本 (破坏性)
0.4.0 | 2022年1月17日 |
---|---|
0.2.0 | 2021年4月6日 |
0.1.0 | 2021年3月28日 |
#400 in 编程语言
250KB
3K SLoC
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
-u64
,i8
-i64
,isize
,usize
,bool
和浮点数被翻译成等效的 C 类型。永不类型 !
可用于返回位置。
复合类型
您可以定义结构体和联合体,并使用长度为常数的数组。定义顺序无关紧要。也可以使用函数类型。
引用
可以自由使用引用 &x
和解引用操作符 *x
,无需烦人的生命周期来打扰您。
控制流
if - else
,while
和 loop
都可以工作。带标签的循环和 break
/continue
也都可以工作。可以使用文字范围 0..n
或 0..=n
与 for
循环。
可以使用 match
表达式,它们将被翻译为 switch
语句,但允许的模式只能是字面量或变量(除了一个可选的、最后的通配符 _
),块是唯一允许的主体。
表达式
函数中的隐式返回是有效的。
包含指令
您可以使用 include![my_header]
或 include![<sys/elf>]
(注意缺少扩展名)来生成包含指令。
类型推断
对于本地定义的类型,->
操作符会被自动推断。
不支持的特性
- 不支持复杂的
restrict
、const
或volatile
特性。 - 不支持类型推断、生命周期、特性、泛型、方法、
impl
、可见性修饰符、路径、元组、模式、属性等。
待办事项
- 某种形式的
use
模块 - Stdlib 访问
- 保留注释
- 字符/字符串语义
-
static
类型 - 元组?
- 枚举
- 用于“注解”的属性(例如
volatile
) - 类型推断?
- 宏?
- 将
cc
错误映射回原始源代码?
依赖关系
~3–10MB
~98K SLoC