306个稳定版本

1.15.27 2024年8月14日
1.15.25 2024年7月24日
1.11.70 2024年3月29日
0.3.7 2024年1月29日
0.0.17 2023年7月18日

#61编程语言

Download history 1981/week @ 2024-04-29 2206/week @ 2024-05-06 2591/week @ 2024-05-13 2802/week @ 2024-05-20 2053/week @ 2024-05-27 3025/week @ 2024-06-03 2116/week @ 2024-06-10 1235/week @ 2024-06-17 1352/week @ 2024-06-24 1524/week @ 2024-07-01 1898/week @ 2024-07-08 296/week @ 2024-07-15 1551/week @ 2024-07-22 16/week @ 2024-07-29 282/week @ 2024-08-12

1,941 每月下载量
2 crates 中使用

MIT 许可证

6.5MB
209K SLoC

GNU Style Assembly 209K SLoC Coq 34 SLoC // 0.2% comments C 11 SLoC Rust 8 SLoC // 0.3% comments OCaml 6 SLoC

Lambda Mountain

λ☶ (发音为Lambda Mountain) 是一个编译器后端,提供了一个相对干净的 System F<: with Specialization 实现。整个编译器只有5000行代码,因此这可以是一个需要JIT或AOT编译代码生成的项目的良好起点。

"便携"汇编器

LM提供了您想要的抽象级别,从您想要的级别向下。每个LM程序指定要创建的确切二进制对象,因此编译器没有解释的空间。平台特定的定义和功能由库提供。因此,编译器没有关于如何处理平台架构的硬编码逻辑。

为什么代码库如此之小?

LM通过语言前端与语言后端之间的N x M问题进行了解决。LM项目可能需要与定义前端或后端的大代码库进行接口,但核心LM演算可以保持小巧。

什么是片段汇编器?

汇编器将数据块组合在一起。汇编器不一定理解它们所做的事情的意义,它们只是做。

片段是字符串到S-表达式的键值映射。这种数据结构比典型的汇编器允许更详细的代码操作。

什么是临时专门化?

如果我们有多个重载的函数,那么专门化允许我们为任何特定应用程序选择最佳匹配。

f := λ(: x X). x;
f := λ(: y Y). y;

f (: x X)

在这个例子中,函数应用与期望Y类型参数的应用不匹配,因此只有一个可能的候选函数。


type X implies Y;

f := λ(: x X). x;
f := λ(: y Y). y;

f (: x X)

现在两个候选函数都“匹配”,然而X比Y类型窄。所有X都是Y,但不是所有Y都是X。在这种情况下,我们说X比Y是一个“更好的匹配”。


f := λ(: x X). form 1;
f := λ(: x X). form 2;

f (: x X)

在这个例子中,两个候选函数都“匹配”且等效。在这种情况下,我们应用度量来确定最佳匹配。度量是应用于项/类型对的顺序,以确定在非语义情况下哪个是“更好的匹配”。度量在存在不同性能特征的代码表示的等效形式存在多个等效类时非常有用。等效类是另一个高级概念,不需要名义上等效。

为什么临时专门化对于汇编器如此重要?

专业化使我们能够在通用功能语言级别表达高级思想,并且能够透明地将代码编译成机器码。编译器中没有隐藏的层级。程序员可以检查和验证每个单个转换直到单独的指令

关于类型系统的更多信息

只要所有重载的函数都提供了显式类型,类型系统就是强归一化和可判定的。

突出特性包括

  • 高阶函数(函数式编程)
  • 参数多态(泛型编程)
  • 子类型(对象层次结构)
  • 专门的多态(函数层次结构)
  • 复数类型(类型更像逻辑谓词)

依赖关系