本文翻译自 Han - A compiled programming language with Korean keywords,原载于 Hacker News。
编程,一定要用英语吗?
当我们谈论编程语言时,脑海中浮现的几乎都是英语关键词:function、if、for、return……这似乎已经成为了一种理所当然的共识。但 GitHub 上最近出现了一个有趣的项目 —— Han(한),它打破了这一传统。
Han 是一门静态类型的编译型编程语言,它的所有关键词都用韩语(Hangul/한글)书写。是的,你没看错:
함수 인사(이름: 문자열) {
출력("안녕하세요, " + 이름)
}
这段代码定义了一个函数,作用是打印问候语。如果你懂一点韩语,会发现 함수 就是 “函数”,문자열 是 “字符串”,출력 是 “输出”。
项目背景与设计哲学
Han 的诞生源于一个简单但深刻的问题:编程语言为什么在所有国家都必须长得一样?
韩文(Hangul)是人类历史上最具科学性的书写系统之一。它由朝鲜王朝的世宗大王于 1443 年创造,每个字符都在几何形状中编码了语音信息——辅音模仿了发音时舌头和嘴巴的位置,元音则由三个宇宙符号组成:天(·)、地(ㅡ)、人(ㅣ)。
Han 将这种优雅带入了编程世界。当你写下 함수 피보나치(n: 정수) -> 정수 时,你不仅仅是在定义一个函数——你是在用一种专门为清晰和美感而设计的文字书写代码。
核心特性一览
1. 韩语关键词与标识符
| 关键词 | 含义 | 英语对应 |
|---|---|---|
함수 |
函数定义 | fn / function |
반환 |
返回值 | return |
변수 |
可变变量 | let mut / var |
만약 |
条件判断 | if |
반복 |
for 循环 | for |
동안 |
while 循环 | while |
참/거짓 |
布尔值 | true/false |
2. 双模式执行
Han 提供了两种执行方式:
- 解释器模式:无需 clang,即时执行
- 编译器模式:生成 LLVM IR → clang → 原生二进制
这意味着你可以选择快速原型开发,也可以选择生产级的性能优化。
3. 丰富的类型系统
五种基本类型都使用韩语命名:
| 类型 | 描述 | LLVM 类型 | 示例 |
|---|---|---|---|
정수 |
64 位整数 | i64 |
42, -10 |
실수 |
64 位浮点 | f64 |
3.14 |
문자열 |
UTF-8 字符串 | i8* |
"안녕하세요" |
불 |
布尔值 | i1 |
참, 거짓 |
없음 |
空类型 | void |
(函数返回类型) |
4. 现代语言特性
Han 支持我们期望的现代语言特性:
- 结构体(Structs):
구조 사람 { 이름: 문자열 } - 闭包:支持环境捕获的匿名函数
- 模式匹配:
맞춰语句 - 错误处理:
시도 { } 실패(오류) { }try/catch - 文件 I/O:
파일읽기、파일쓰기等 - 泛型语法:
함수 최대값<T>(a: T, b: T) -> T
代码示例:感受 Han 的魅力
阶乘计算
함수 팩토리얼(n: 정수) -> 정수 {
만약 n <= 1 {
반환 1
}
반환 n * 팩토리얼(n - 1)
}
함수 main() {
출력(팩토리얼(10))
}
main()
输出:3628800
字符串计算器
함수 계산(식: 문자열) -> 정수 {
변수 부분 = 식.분리(" ")
변수 왼쪽 = 정수변환(부분[0])
변수 연산자 = 부분[1]
변수 오른쪽 = 정수변환(부분[2])
맞춰 연산자 {
"+" => { 반환 왼쪽 + 오른쪽 }
"-" => { 반환 왼쪽 - 오른쪽 }
"*" => { 반환 왼쪽 * 오른쪽 }
"/" => {
만약 오른쪽 == 0 {
출력("오류: 0으로 나눌 수 없습니다")
반환 0
}
반환 왼쪽 / 오른쪽
}
_ => {
출력(형식("알 수 없는 연산자: {0}", 연산자))
반환 0
}
}
}
출력(계산("10 + 20")) // 30
출력(계산("6 * 7")) // 42
带结构体的 Todo 列表
구조 할일 {
제목: 문자열,
완료: 불
}
변수 목록 = []
함수 추가하기(목록: [할일], 제목: 문자열) {
목록.추가(할일 { 제목: 제목, 완료: 거짓 })
}
함수 완료처리(목록: [할일], index: 정수) {
목록[index].완료 = 참
}
함수 출력목록(목록: [할일]) {
반복 변수 i = 0; i < 목록.길이(); i += 1 {
변수 상태 = "[ ]"
만약 목록[i].완료 {
상태 = "[✓]"
}
출력(형식("{0} {1}. {2}", 상태, i + 1, 목록[i].제목))
}
}
추가하기(목록, "한글 프로그래밍 언어 만들기")
추가하기(목록, "README 작성하기")
추가하기(목록, "HN에 올리기")
완료처리(목록, 0)
완료처리(목록, 1)
출력("=== 할일 목록 ===")
출력목록(목록)
输出:
=== 할일 목록 ===
[✓] 1. 한글 프로그래밍 언어 만들기
[✓] 2. README 작성하기
[ ] 3. HN에 올리기
技术架构
Han 采用了经典的编译器流水线架构,完全用 Rust 实现:
Source (.hgl)
│
▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Lexer │ ──▶ │ Parser │ ──▶ │ AST │
└─────────┘ └─────────┘ └────┬────┘
│
┌────────────┼────────────┐
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Interpreter │ │ CodeGen │
└──────┬───────┘ └──────┬───────┘
│ │
▼ ▼
Direct Output LLVM IR (.ll)
│
▼
clang → Binary
设计决策
为什么用文本形式的 LLVM IR 而不是 LLVM C API?
Han 生成 LLVM IR 作为纯文本字符串,避免了链接 LLVM 库的复杂性。这保持了构建的简单性(只需 cargo build,无需安装 LLVM),同时仍能通过 clang 生成优化的原生二进制文件。
为什么同时提供解释器和编译器?
解释器支持即时执行,除了 Rust 之外无需任何工具链依赖。编译器路径则适用于性能至关重要的生产环境。相同的解析器,相同的 AST,两种后端。
快速上手
安装
git clone https://github.com/xodn348/han.git
cd han
cargo install --path .
运行
# 解释器模式(无需 clang)
hgl interpret hello.hgl
# 编译为原生二进制(需要 clang)
hgl build hello.hgl
# 编译并立即运行
hgl run hello.hgl
# 交互式 REPL
hgl repl
目前的能力边界
✅ 已完全实现
- 基本数据类型、数组(支持负索引)、结构体
- 完整的控制流:
만약/반복/동안/맞춰(模式匹配) - 递归函数、闭包、错误处理
- 文件 I/O、格式化字符串
⚠️ 部分实现/边缘情况
- 函数作为类型参数尚不支持
- 浮点与整数混合运算需要显式转换
- 嵌套结构体字段赋值仅支持一层
❌ 尚未实现
- 多返回值/元组
- 枚举类型
- 异步/并发
- 网络和进程标准库
我的思考
Han 项目的出现,让我想到了几个有趣的问题:
-
编程语言的语言霸权:英语在编程领域的统治地位是否限制了非英语国家的编程教育和普及?类似 Han 这样的项目能否降低编程的入门门槛?
-
文化多样性:正如文中提到的韩流(Korean Wave)现象,全球有超过 1600 万人在学习韩语。如果编程语言也能”本地化”,会不会让学习编程变得更有趣、更亲切?
-
中文编程的可能性:中国开发者是否会受到启发,创造出类似的中文关键词编程语言?实际上,国内已经有一些尝试(如易语言),但像 Han 这样现代化的、用 Rust 实现的、支持 LLVM 编译的中文编程语言还有很大空间。
Han 虽然还是一个年轻的项目,但它展示了一种可能性——编程不一定要用英语,代码可以有不同的语言美学。对于语言学习者和编程教育者来说,这提供了一个有趣的切入点。
项目地址:https://github.com/xodn348/han
核心亮点总结:
- 韩语关键词编程,降低语言门槛
- Rust 实现,支持解释器和 LLVM 编译双模式
- 现代语言特性:结构体、闭包、模式匹配
- LSP 支持,开箱即用的编辑器集成