今天在 Hacker News 上看到一个有趣的项目——Han,这是一个用 Rust 编写的编程语言,所有关键字都是韩语。这让我想起一个老生常谈的问题:编程语言为什么必须是英语?

用母语写代码

Han 的核心想法很简单:如果代码能用母语阅读和书写,对非英语母语的开发者会更友好。项目作者选择了韩语作为实验对象,毕竟 Hangul(韩文字母)本身就是世界上最科学的文字系统之一。

看看 Han 的 “Hello World”:

출력("안녕하세요, 세계!")

출력 就是 “输出” 的意思。这种直观的语义表达,比记忆 printprintfconsole.log 这些词汇对韩语使用者来说更自然。

语言特性

Han 不是玩具语言。作为一个静态类型、编译型语言,它的功能相当完整:

类型系统

  • 정수(整数)
  • 실수(实数/浮点数)
  • 문자열(字符串)
  • (布尔值)
  • 없음(空/void)

控制流

  • 만약(如果)用于条件判断
  • 반복(重复)用于循环
  • 맞춰(匹配)用于模式匹配
  • 시도/실패(尝试/失败)用于错误处理

函数与结构

  • 함수 定义函数
  • 구조 定义结构体
  • 가져오기 用于模块导入
  • 支持闭包、泛型、LSP 服务器

编译流程是 Han → LLVM IR → clang → 本地二进制,这意味着性能不会比 C/C++ 差多少。

代码示例

Han 有一个词频统计的示例程序,可以看看语法风格:

변수 텍스트 = "hello world hello han world hello"
변수 단어들 = 텍스트.분리(" ")
변수 단어목록 = []
변수 개수목록 = []

반복 변수 i = 0; i < 단어들.길이(); i += 1 {
    변수 찾음 = 거짓
    반복 변수 j = 0; j < 단어목록.길이(); j += 1 {
        만약 단어목록[j] == 단어들[i] {
            개수목록[j] = 개수목록[j] + 1
            찾음 = 참
        }
    }
    만약 찾음 == 거짓 {
        단어목록.추가(단어들[i])
        개수목록.추가(1)
    }
}

반복 변수 i = 0; i < 단어목록.길이(); i += 1 {
    출력(형식("{0}: {1}", 단어목록[i], 개수목록[i]))
}

虽然是韩语,但结构清晰,对有编程经验的人来说完全可以猜出含义。

意义与局限

Han 的出现提出了一个有趣的问题:编程语言的普及是否过度依赖英语霸权?

支持者认为,使用母语关键字可以降低编程门槛,让更多非英语背景的人进入技术领域。反对者则指出,这会造成代码的可移植性和协作成本问题——毕竟英语仍是技术界的通用语。

现实可能介于两者之间。Han 或许不会成为主流语言,但它证明了编程语言的语法完全可以本地化。对于教育场景、特定领域的内部工具,或者纯粹的文化实验,这类语言都有其价值。

技术实现

值得一提的是 Han 的技术栈:

  • Rust:编译器 toolchain 完全用 Rust 编写
  • LLVM:通过 LLVM IR 生成高效机器码
  • LSP:内置 Language Server Protocol 支持
  • REPL:提供交互式解释器模式

用 Rust 写编译器是个明智的选择——Rust 的类型系统和内存安全特性让编译器开发更少出错。项目还提供了 REPL 和 LSP 服务器,说明作者确实在认真构建一个可用的工具,而非只是概念验证。

结语

Han 让我想起了易语言——那个曾经在中国市场流行过的中文编程语言。虽然易语言因为各种原因逐渐式微,但”母语编程”的想法从未消失。

在全球化时代,我们习惯了用英语写代码、读文档、参加技术会议。但 Han 提醒我们:技术可以有不同的面孔。也许未来的编程教育会从本地语言开始,再逐步过渡到英语;也许特定领域会出现更多本地化 DSL;又或者,IDE 的实时翻译会让关键字语言变得无关紧要。

无论如何,Han 是一个有趣的技术实验。它用 Rust 和 LLVM 证明了构建非英语编程语言并不困难,困难的是改变人们的习惯和观念。

如果你感兴趣,可以在 GitHub 上查看源码,或者试试 hgl repl 体验一下用韩语写代码的感觉。