Mach 系统语言概览

Mach 是一种为重视透明度和可维护性的开发者设计的静态类型、编译系统编程语言。其核心目标是消除“隐藏行为”,确保编写的代码正是计算机执行的内容,没有隐式魔法或自动抽象。

核心设计哲学

Mach 建立在这样的原则上:计算机不是魔法,编程语言不应助长这种幻觉。该语言更注重长期的可维护性和简洁性,而非短期的开发者便利。

优先原则

  • 显式性:Mach 故意冗长。设计遵循‘你看到的就是你得到的’(WYSIWYG)方法,确保程序员不会看到任何隐藏的行为。
  • 简洁性:该语言设计为易于学习、阅读、编写和维护。
  • 可维护性:语义被选择以确保代码在较长时期内保持可管理。

非优先原则

  • 内置功能:Mach 不包含“自带电池”功能;特性被有意地从核心语言中省略。
  • 灵活性:语言避免提供多种实现相同结果的方式,以保持一致性。
  • 代码精简:冗长被视为换取清晰度的有意义的权衡;更多代码不被视为更差的代码。
  • 自动安全:安全被视为程序员的决定,而不是语言施加的限制。Mach 不会阻止程序员执行危险操作。

技术实现与工具链

Mach 是一个自托管编译器,意味着它是用 Mach 编写并能够自行构建。它在不依赖 LLVM 或其他外部依赖的情况下开发,社区认为这对于其规模的项目来说是尤为令人印象深刻的成就。

命令行界面 (CLI)

Mach 通过 mach 命令提供统一的工具链:

Command Description
build 将当前项目编译为可执行文件或目标文件
run 构建然后执行当前项目
test 构建并运行项目测试
dep 管理 vendored 依赖(列表, 添加, 删除, 同步, 供应)
init 脚手架一个新项目
doc 从源文档注释生成 Markdown 参考文档

语法示例

Mach 的语法在保持显式性的同时设计为直观。以下是基本语言构造的示例。

Hello World

use          std.runtime;
use print:   std.print;

$main.symbol = "main\);fun main(argc: i64, argv: **u8) i64 {
    print.println("Hello, World!");
    ret 0;
}

递归斐波那契

use          std.runtime;
use print:   std.print;

fun fibr(n: u64) u64 {
    if (n < 2) {
        ret n;
    }
    ret fibr(n - 1) + fibr(n - 2);
}

$main.symbol = "main\);fun main(argc: i64, argv: **u8) i64 {
    print.printf("fib(%d) = %d\n", 10::i64, fibr(10));
    ret 0;
}

社区讨论与分析

Mach 语言在 Hacker News 上发布后,引发了关于其设计权衡和性能的讨论。

性能与优化

社区成员观察到 Mach 目前比 C 慢,有些人指出在某些基准测试中大约慢四倍。这导致了关于未来计划通过高级优化通道提高执行速度的问题。

安全 vs. 控制

该语言关于安全的立场——将其留给开发者——引起了关注。虽然一些用户赞赏其“反魔法”哲学,但其他人质疑现代安全特性,如安全/不安全代码分离或代数类型,是否能在不引入隐藏行为的情况下提供透明性。

实现成就

贡献者和观察者赞赏该项目完全自托管且避免了像 LLVM 这样的外部依赖,考虑到两年的开发时间,将这项工作描述为“不可思议的令人印象深刻”。

"不使用 LLVM 就能开发出如此多的功能确实令人印象深刻。但我不清楚从文档中看出为什么开发者会想使用 Mach 而不是 Go 或 C。"

当前状态

Mach 是一个在 MIT 许可证下的开源项目,目前正在开发 macOS 后端。

Sources