阁下可知文言编程之精妙?CMU本科生开源文言文编程语言,数天2K星
如果中文是编程语言中使用的主要语言,我们中国人学习编程是否会更简单?
这是知乎上讨论非常火热的话题。很多接触过编程的人都知道「易语言」,这是一种使用中文代替编程语言中的英文的编程语言,同样可以实现程序功能。近日,一位卡内基梅隆大学(CMU)的大四学生开发了基于文言文的编程语言,高中语文三大怕的文言文终于找上程序员了。
项目地址:https://github.com/LingDong-/wenyan-lang
这一项目并不是简单的将程序中的英文字符换成了中文,而是利用 NLP 的一些技术,将文言文程序语法转换到 JavaScript 或 Python 运行,有一定的技术难度。项目问世几日即获赞 2.2K,还得到了很多人的微博转发。
作为横跨媒体和 AI 的机器之心也测试了这一项目,项目作者的脑洞、文采和创意着实令人惊讶。
如果读者想快速试一试,你也可以玩一玩在线 IDE,上面有很多预定义的函数。即使在手机上,我们也能编辑并运行「文言文代码」。
在线地址:http://wenyan-lang.lingdong.works/ide.html
序言
作者在项目开篇使用了一段文言文,介绍了建立这个项目的初衷。
翻译如下:
在尧舜时代,人们使用结绳和数手指来计算。当时怎么能够预料到,几百代人之后计算机的巧妙呢!计算机比鲁班(公输盘)的木鸢更加精巧,比诸葛亮(武侯)的木牛流马更好。此外,编程语言数量众多,如同《天官书》记录的星宿一般多,又比《山海经》中记录的飞禽走兽还要奇特。 Go (鼠)、 Rust (蟹)、 Ruby (鑽)、 Fishshell (鱼)因速度而出名。 Python (蛇)、 Php (象)、 Perl (骆)和 JavaScript (犀)则各有独特之处。我这才理解到,为什么鬼会夜哭,天上会下粟雨。
(注: 传仓颉造字后,鬼神啼哭,天降粟雨)
但以往从未有人使用过文言文进行编程。这并不是传承文脉、保护文心的好方法,所以我才产生了用文言文编程的想法。我目前还太年轻,读过的书也没有破万卷。如今身处遥远的国家(美国),也很久没有接触中文了。但是我一直对文学很有兴趣,编写的程序有时候也得到人们的一些肯定。正如王希孟和庄子一般,并不因为年轻或者知识的浩瀚无涯而退缩,于是写下了这些话。
(注: 王希孟,北宋画家,18岁画成传世名作《千里江山图》)
我既没有像李贺那样呕心沥血,也没有像李商隐那样口角流沫(形容读书勤奋)。项目完成后,我将继续以 干将铸剑 的精神勉励自己,带着越王 卧薪尝胆 的精神继续向前。我自己虽想效仿《算经十书》的笔法,只是遗憾没有唐宋八大家那样淋漓的文笔。正如庾信在《哀江南赋》所写:「陆机听了心甘情愿地拍掌;张衡见了将轻视它也是理所当然」(意指如果被人嘲笑,也是理所当然,我不会太过介意)。
尽管这项目只有覆瓮的价值(一点微小的工作),但是还有完善的空间。虽然没有像吕不韦那样有一字千金的本钱,但是我对交流的渴望是一样的。
这也正是开源的精神内核,我们以此互相勉励吧。
作者是谁?
Lingdong Huang 目前是 CMU 计算机专业大四学生,明年就本科毕业了。我们可以看到他曾在迪士尼研究实验室、纽约时报等大厂实习过。而且从个人网站中,很明显可以发现他高中就开始做各种小项目,包括视觉和自然语言的都有。
写得了代码、读得了文言文,文化底蕴还这么强,现在的本科生已经这么厉害了。
个人网站:https://lingdong.works
文言文编程是什么情况
用文言文编程是什么样一种体验?是不是既能学习文言文,又能搞定编程逻辑?介绍不如演示,我们先看看编程世界里的第一段代码,广大程序员学习的第一句「HelloWord」是什么样的。如果读者们文言文比较溜,或者了解一点程序思维,那么可以了解,下面一段文言文代码就是输出三遍「问天地好在」,也就是「HelloWord」的文言文版。
吾有一數。曰三。名之曰「甲」。
為是「甲」遍。
吾有一言。曰「「問天地好在。」」。書之。
云云。
具体而言,先定义一个数「3」,并命名为「甲」,现在循环「甲」次,每次在屏幕上打印出「問天地好在。」。作者会将其翻译成对应的 Javascript 代码,从而帮助我们理解。
var n = 3;
for (var i = 0; i < n; i++) {
console.log("問天地好在");
}
当然,按照我们的习惯,改写成 Python 代码也是没问题的:
a = 3
for i in range(a):
print("問天地好在")
为了更贴近文言文的表达习惯,Lingdong Huang 在项目表示各种标点和换行都是可以去掉的,上面的文言文代码可以等价写为:
吾有一數曰三名之曰「甲」為是「甲」遍吾有一言曰「「問天地好在」」書之云云
突然感觉,好像没了符号的文言文代码更容易懂了?
这样看起来似乎很简单?那你就小瞧了文言文编程的魅力。比如说程序员入门必修课「斐波那契数列」,每一项都是前两项的和,第一项是 0、第二项是 0+1、第三项是 1+1 等等。
如果用文言文来写斐波那契数列,我们需要建立一个函数,函数的输入是斐波那契项数,输出是该项具体的值。如果用文言文来写,画风是这样的:
最后一句「施「斐氏列」於七。書之。」是调用函数,并输出第 7 个结果。虽然看上去比较麻烦,但我们还是可以细细阅读,例如「吾有一術。名之曰「斐氏列」。」很明显定义了一个函数,函数名是「斐氏列」;「若「因」等於零者。昔之「果」者。今「因」是矣云云。」表示如果「因」这个变量等于 0,那么就将「因」这个变量的值赋值到「果」变量。
如果阅读上还有困难,那么也可以看看项目作者提供的对应 Javascript 代码。不过我们可以尝试把它翻译成 Python 语言,翻译结果如下所示:
def fei_seq(yin):
tou = 0
wei = 1
ji = 1
guo = 0
if yin == 0:
guo = yin
if yin == 1:
guo = yin
while True:
if ji >= yin:
break
ans_ = tou +wei
guo = ans_
tou = wei
wei = guo
ans_ = ji + 1
ji = ans_
return guo
print(fei_seq(7))
当然,Python 作为一种极其精简的语言,真正用它来写斐波那契数列肯定代码量要少很多。不过,借助这段翻译,理解文言文编程还是要简单很多的。如果读者想要试一试,可以复制这个 GitHub 项目,并在本地编译,也可以直接使用在线 IDE 编译你的代码。
下面,作为一种「新语言」,我们当然要了解它的神奇语法,不论是定义变量、函数,还是生成数列,文言文都有对应的语法。
语法规则
考虑到文言文和其他编程语言的转换有一定的理解难度,作者提供了一些语法转换规则表,供参考。
变量命名
条件/循环
数学计算
数组(列表)
这里从「1」开始计数。
函数
让你的代码更有逼格
看厌了黑底的代码?项目还提供了一个炫酷的「古文代码生成器」,我们可以把自己的文言文代码转换成古书中从右到左,从上到下,没有标点的古文。是不是更有 B 格了?这个生成器还有 SVG 文件,可以将代码再提取出来,重新运行。
以下为项目作者尝试的「图灵机」代码:
作者暂无likerid, 赞赏暂由本网站代持,当作者有likerid后会全部转账给作者(我们会尽力而为)。Tips: Until now, everytime you want to store your article, we will help you store it in Filecoin network. In the future, you can store it in Filecoin network using your own filecoin.
Support author:
Author's Filecoin address:
Or you can use Likecoin to support author: