|
| 1 | +# 凹语言关于中文编程的探索 |
| 2 | + |
| 3 | +- 时间:2025-09-22 |
| 4 | +- 撰稿:凹语言开发组 |
| 5 | +- 转载请注明原文链接:[https://wa-lang.org/smalltalk/st0085.html](https://wa-lang.org/smalltalk/st0085.html) |
| 6 | + |
| 7 | +--- |
| 8 | + |
| 9 | +作为中国本土的编程语言开发团队,凹语言开发组一直在尝试改善编程中中文的体验。本文简单回顾期间的一些探索经历。 |
| 10 | + |
| 11 | +## 1. 2022年:defer中文翻译 |
| 12 | + |
| 13 | +[https://wa-lang.org/smalltalk/st0002.html](https://wa-lang.org/smalltalk/st0002.html) |
| 14 | + |
| 15 | +在2022年刚开源的早期微信群就有小伙伴热烈讨论: |
| 16 | + |
| 17 | +由“凸凹凸凹”表示的低高低高电平引起了更多的讨论,比如“defer中文名是断后还是延迟”好? |
| 18 | + |
| 19 | +然后就开始激烈的投票和争执,有评论为证(有评有真相):“延迟高大上点,断后接地气点”。然后大家就开了脑洞: |
| 20 | + |
| 21 | +- 叫 等等 呗 |
| 22 | +- 后置 也可以啊 |
| 23 | +- 延后 |
| 24 | +- 善后 |
| 25 | +- 暂下子(这是什么鬼?) |
| 26 | +- 善终(拒绝评论) |
| 27 | +- 随后,马上有人支持:随暗示了次序 |
| 28 | +- 稍后 |
| 29 | +- 善后吧,信达雅一点,还给了截图解释含义 |
| 30 | +- 等等。。。有歧义。。。(etc.) |
| 31 | +- 善后(断后)确实挺有趣。defer确实通常用于「善后」。。。不过 defer 本身是个一般化的流程控制,采用一个更high-level的词汇一定程度上对定义做了改变。 |
| 32 | + |
| 33 | + |
| 34 | + |
| 35 | +现在并不是就要马上出结论,据群主说目前是想沉淀更多的讨论,即使不能用上,以后再有支持中文的编程语言也能参考上,不用从头开始。 |
| 36 | + |
| 37 | +## 2. 2022年:IDE中输入中文效率不高 |
| 38 | + |
| 39 | +但是讨论/扯淡引出了更多的话题,比如IDE中输入中文效率不高…… |
| 40 | + |
| 41 | + |
| 42 | +但是有人不同意:其实中文编程的输入效率不会低,只是ide把中文当作4等公民了。比如 defer,输入 zhihou 不经过输入法需要能过补全。ide的补全应该是拼音输入法更智能才对。并且还大放厥词:IDE将会是码农的唯一入口,输入法是需要淘汰的东西!?理由是:IDE能够拿到的信息比输入法哪些胡乱猜的上下文准确多了,IDE需要能过绕过输入法就能补全。 |
| 43 | + |
| 44 | +然后有网友站队敲扁鼓:貌似有人写过 [vscode中文补全插件](https://zhuanlan.zhihu.com/p/138708196),据说不错,但我还没用过。 |
| 45 | + |
| 46 | + |
| 47 | + |
| 48 | +对IDE的攻击变本加厉:再比如,全角的标点,责任完全在ide拉胯;IDE类似操作系统,输入法是上个时代的补丁,需要被废弃…… |
| 49 | + |
| 50 | +## 3. 2023:凹语言中文前端 |
| 51 | + |
| 52 | +早期凹语言为关键字提供了对应的中文版本,后面慢慢演化为更加激进的设计: |
| 53 | + |
| 54 | +``` |
| 55 | +引于 "书" |
| 56 | +
|
| 57 | +【启】: |
| 58 | + 书·说:"你好,凹语言中文版!" |
| 59 | +。 |
| 60 | +``` |
| 61 | + |
| 62 | +后续因为开发组方向的调整,中文语法的设计暂时被搁置。但是中文编程的念想一直都在。 |
| 63 | + |
| 64 | +## 4. 2025:中英双语的汇编语言 |
| 65 | + |
| 66 | +在开发过程中自然而然就遇到到了RISC-V芯片等更加底层的本地化需求。在解决这个问题时我们引入了中英双语的汇编语言,不仅仅是标识符可以支持中文,关键字同样提供中文。以下是裸机的一个例子: |
| 67 | + |
| 68 | +```s |
| 69 | +# 裸机输出字符串例子 |
| 70 | +
|
| 71 | +# QEMU virt 机器 UART0 和 exit device 的基地址 |
| 72 | +常量 $UART0 = 0x10000000 |
| 73 | +常量 $EXIT_DEVICE = 0x100000 |
| 74 | +
|
| 75 | +# 用于输出的字符串 |
| 76 | +全局 $message = "Hello RISC-V Baremetal!\n\x00" |
| 77 | +
|
| 78 | +# 主函数 |
| 79 | +函数 _start { |
| 80 | +%begin: |
| 81 | + # a0 = 字符串地址 |
| 82 | + auipc a0, %pcrel_hi($message) # 高20位 = 当前PC + 偏移 |
| 83 | + addi a0, a0, %pcrel_lo(%begin) # 低12位 |
| 84 | +
|
| 85 | +%print_loop: |
| 86 | + lbu a1, 0(a0) # 取一个字节 |
| 87 | + beq a1, x0, %finished # 如果是0则结束 |
| 88 | +
|
| 89 | + # t0 = UART0 地址 |
| 90 | + lui t0, %hi($UART0) # UART0 高20位 |
| 91 | + addi t0, t0, %lo($UART0) # UART0 低12位 |
| 92 | +
|
| 93 | + sb a1, 0(t0) # 写到UART寄存器 |
| 94 | + addi a0, a0, 1 # 下一个字符 |
| 95 | + jal x0, %print_loop |
| 96 | +
|
| 97 | +%finished: |
| 98 | + # 写退出码 0 到 EXIT_DEVICE让, QEMU 退出 |
| 99 | + lui t0, %hi($EXIT_DEVICE) # exit device 地址 |
| 100 | + addi t0, t0, %lo($EXIT_DEVICE) |
| 101 | +
|
| 102 | + # t1 = 0x5555 |
| 103 | + # addi rd, rs1, imm 的 imm 范围是 [-2048, +2047](12 位有符号立即数) |
| 104 | + lui t1, 0x5 # 高 20 位 (0x5 << 12 = 0x5000) |
| 105 | + addi t1, t1, 0x555 # 结果 = 0x5000 + 0x555 = 0x5555 |
| 106 | +
|
| 107 | + sw t1, 0(t0) |
| 108 | +
|
| 109 | + # 如果 QEMU 不支持 exit 设备,就进入并死循环 |
| 110 | +%forever: |
| 111 | + jal x0, %forever |
| 112 | +} |
| 113 | +``` |
| 114 | + |
| 115 | +需要说明的是,这并不是GNU As汇编语法,而是凹语言开发组从头设计实现的汇编语言。其中关键字有:`常量`、`全局`、`函数`、`变量`等,同时配套了对应的英文关键字的翻译以方便国际友人学习。当然,RISC-V的寄存器和指令依然是首选官方提供的英文名字。 |
| 116 | + |
| 117 | + |
| 118 | +## 5. 本地化和本土化并不矛盾 |
| 119 | + |
| 120 | +在知乎上经常看到这个问题:英文是否是计算机底层技术的必然路径?其实目前的计算机底层二进制,早期只是因为物理技术的限制先选择的了字符串数量较少的ASCII码进行标准化。但是计算机发展的一个重要思想是通过增加一层层的抽象封装底层的不足,因此不管是英文还是中文都可以通过抽象和翻译的方式对接到最底层的机器码的二进制。从更贴近芯片的指令机器码的汇编语言层面建立中文编程语言的根基会更加容易也更加的坚实。 |
| 121 | + |
| 122 | +本土化的编程语言发展之路虽然充满荆棘和曲折,但是同样也充满乐趣,我们会继续探索下去。共勉! |
| 123 | + |
0 commit comments