噫吁嚱!文言文亦能编程!此诚年度最骚语言也

2019 年 12 月 18 日 量子位
栗子 晓查 发自 海边边 
量子位 报道 | 公众号 QbitAI

同学,你可知如何用文言文输出“Hello World”?

请君睁圆双眼注视于此:

 右边一顿输出

吾有一言。曰「「問天地好在。」」。書之。

却为何输出了三遍?

只因有for循环,写作“為是「甲」遍…云云”。甲等于三,便要问三次好。

这骚之过极的文言文编程语言,来自CMU本科生Huang Lingdong。

可编译成Javascript,也可编译成Python,亦有线上编辑器 (IDE) 可直接玩耍。

项目文理两开花,已于GitHub摘得3000星,且围观众人皆有话说。

譬如,妒少年之才华:


譬如,点未来之方向:

中科院计算所研究员刘群老师亦感叹:

当下,我等便前去观膜一番,探索此语言藏有何种天地精华。

文言文编程“黑话”

Huang Lingdong同学应该是读过《易经》,毕竟易经是最早论述二进制的古书。他用易经的代表布尔变量中的0和1。

“吾有”系列则被用来做定义:

吾有一数是定义int变量
吾有一爻是定义布尔变量
吾有一言是定义字符串
吾有一术是定义函数
吾有一列是定义数组
……

一般的编程里,循环判断有if、while、for,文言文编程在这件事上更是变化无穷。下面就是一段文言文书写的判断语句:

若三弗大於五者。乃得「「想當然耳」」。若非。乃得「「怪哉」」也。

翻译过来就是:

if(3<=5)
  {return "of course"}
else
  {return "no way"}

也许你会觉得if…else…语句用文言文太啰嗦,但是常用的for循环,用文言文表达却更为简洁。

為是百遍。⋯⋯ 云云。

它的意思是:

for (var i = 0; i < 100; i++)
  { ... }

如果需要判断某个变量human是否在world中,我们一般用for (var human of world),初学者看到for的这种用法可能会很困惑,而文言文的表示更接近普通人的理解。

凡「天地」中之「人」。⋯⋯ 云云。

古有《易经》,今有金庸小说,在展示定义函数的时候,Huang同学又皮了一下:

吾有一術。名之曰「六脈神劍」。欲行是術。必先得六數。曰「甲」。曰「乙」。曰「丙」。曰「丁」。曰「戊」。曰「己」乃行是術曰。⋯⋯是謂「六脈神劍」之術也。

这里Huang同学将函数名定义为“六脉神剑”,这个函数总共有6个输入。

funcion f(a,b,c,d,e,f)
  {…}

还有更多好玩的函数定义:

怎样用文言文编程

看完文言文编程的基本语法后,我们来看看怎么用它来解决一些基本的问题。

比如求100以内的素数,我们会用到一种“埃氏筛”(Sieve of Eratosthenes)算法:

看一下运行结果:

二。三。五。七。一十一。一十三。一十七。一十九。二十三。二十九。三十一。三十七。四十一。四十三。四十七。五十三。五十九。六十一。六十七。七十一。七十三。七十九。八十三。八十九。九十七

你看懂是什么意思了吗?编译器翻译成JavaScript就是:

var AI1SHI4SHAI1 = () => 0;
AI1SHI4SHAI1 = function(JIA3{
    var YAN3 = [];
    for (var _rand4 = 0; _rand4 < JIA3; _rand4++) {
        YAN3.push(true);
    };
    var _ans154 = JIA3 / 2;
    var JIA3BAN4 = _ans154;
    var WU4 = 2;
    while (true) {
        if (WU4 == JIA3BAN4) {
            break;
        };
        var XU1_ = 2;
        while (true) {
            if (XU1_ == JIA3BAN4) {
                break;
            };
            var _ans155 = WU4 * XU1_;
            var HE2 = _ans155;
            if (HE2 <= JIA3) {
                YAN3[HE2 - 1] = false;
            } else {
                break;
            };
            var _ans156 = 1 + XU1_;
            XU1_ = _ans156;
        };
        var _ans157 = 1 + WU4;
        WU4 = _ans157;
    };
    var ZHU1SU4 = [];
    var WU4 = 2;
    while (true) {
        if (WU4 == YAN3.length) {
            break;
        };
        var _ans158 = YAN3[WU4 - 1];
        var SU4YE2 = _ans158;
        if (SU4YE2) {
            ZHU1SU4.push(WU4);
        };
        var _ans159 = 1 + WU4;
        WU4 = _ans159;
    };
    return ZHU1SU4
};
var _ans160 = AI1SHI4SHAI1(100);
console.log(_ans160);

文言文编程不仅能输出简单的结果,连文字图(ASCII Art)都可以用文言文画出来,分形问题中著名的“曼德博集合”,用中文画出来是这样:

用中文画出的曼德博集合

你以为这就是编译结果的最终形态了?错错错!

项目文件还有个脚本src/render.js,它可以把程序渲染成古代书籍的样子。把O’Reilly系列图书印刷成古代线装书,真是想想就很激动啊。

安装与使用

文言文编程只需将repo下载到本地,而且本地已经安装Node,就能立即使用。现在它支持将wenyan lang转换成JavaScript和Python:

./build/wenyan.js examples/helloworld.wy -o helloworld.js

在这段命令中,如果不指定语言,程序将自动转化为JavaScript,若想转化成Python,请加入参数“—lang py”或是“-l py”。

用户也可以自行编译二进制文件。如果你只想尝尝鲜,在线IDE也是个不错的选择。

何出此“言”

至于,为何要炮制一门文言编程语言,少年为项目写有一序,由此可窥一二 (后有解读) :

夫唐、虞之世,結繩而足治,屈指而足算。是時豈料百代之後,計算機械之巧,精於公輸之木鳶,善於武侯之流馬;程式語言之多,繁若《天官》之星宿,奇勝《山經》之走獸。鼠、蟹、鑽、魚,或以速稱。蛇、象、駱、犀,各爭文采。方知鬼之所以夜哭,天之所以雨粟。然以文言編程者 ,似所未有。此誠非文脈之所以傳,文心之所以保。嗟予小子,遂有斯志。

然則數寸之烏絲猶覆於頭,萬卷之素書未破於手;一身長羁于远邦,兩耳久旷于雅言。然夫文章者吾之所宿好,程式者偶承時人之謬譽。故希孟不慚年少,莊生不望無涯。乃作斯言。誠未能嘔瀝長吉之心血,亦庶幾免於義山之流沫。既成之後,復學干將鑄劍而自飼,越王嚐糞而當先。自謂偶追《十書》之筆意,但恨少八家之淋漓。此子山所謂士衡抚掌而甘心,平子見陋而固宜。然則雖實覆甕之質,尚存斧正之望;雖乏呂相之金,易字之渴蓋同。此亦開源之大義,吾輩之所以勉勵也。一笑。

文中典故之多,恐无法在此一一注释,便以划重点之法,粗粗领会其意味,并简要传达为白话:

上古人类结绳记事,不会想到后代竟然发明了计算机。今天编程语言众星闪耀,只是没有人用文言编程。我人在国外,想念这些古典的言语,同时又擅长编程又有头发,决定为开源事业贡献一份力量。

注:如想查看所有典故,请前往项目页,出处皆有维基百科链接。

量子位循蛛丝马迹,得知少年名叫Huang Lingdong,来自卡耐基梅隆大学,如今大四,明年即将毕业。高中则毕业自上海世界外国语中学。

黄姓少年一路脑洞盛开,时常开发画风清奇之项目,量子位也曾为其另一项目撰文:

任君信笔涂鸦,皆可化作梦境中之角色,生龙活虎,与其他人物一同玩耍游荡。如百鬼夜行之雄风。

而文言文编程语言,大抵是少年迄今最为骄傲且最为瞩目之成就。

各位可速速前往吸之,定然无法自拔。

传送门

项目代码:
https://github.com/LingDong-/wenyan-lang

项目主页:
http://wenyan-lang.lingdong.works/

线上IDE试玩:
http://wenyan-lang.lingdong.works/ide.html

个人主页:
https://lingdong.works/

2019年度奖项发布!锁定AI Top玩家

50家领航企业、10大商业突破人物、10大最具创新力产品3大奖项出炉。

跟大咖交流 | 进入AI社群

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态

喜欢就点「在看」吧 !

登录查看更多
0

相关内容

人们为了让计算机解决各种棘手的问题,使用编程语言 编写程序代码并通过计算机运算得到最终结果的过程。
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
56+阅读 · 2020年6月26日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【干货书】R语言书: 编程和统计的第一课程,
专知会员服务
107+阅读 · 2020年5月9日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
【经典书】Python计算机视觉编程,中文版,363页pdf
专知会员服务
136+阅读 · 2020年2月16日
【新书】Python数据科学食谱(Python Data Science Cookbook)
专知会员服务
113+阅读 · 2020年1月1日
机器学习入门 | 刷新你三观的高数和线代教程
大数据技术
21+阅读 · 2019年3月22日
CVE-2018-7600 - Drupal 7.x 远程代码执行exp
黑客工具箱
14+阅读 · 2018年4月17日
基于Numpy实现神经网络:反向传播
论智
5+阅读 · 2018年3月21日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
GAN的数学原理
算法与数学之美
14+阅读 · 2017年9月2日
python pandas 数据处理
Python技术博文
3+阅读 · 2017年8月30日
【原理】GAN的数学原理
GAN生成式对抗网络
8+阅读 · 2017年8月30日
Seeing What a GAN Cannot Generate
Arxiv
7+阅读 · 2019年10月24日
Feature Selection Library (MATLAB Toolbox)
Arxiv
7+阅读 · 2018年8月6日
Doubly Attentive Transformer Machine Translation
Arxiv
4+阅读 · 2018年7月30日
Relational recurrent neural networks
Arxiv
8+阅读 · 2018年6月28日
Arxiv
5+阅读 · 2018年6月5日
VIP会员
相关资讯
机器学习入门 | 刷新你三观的高数和线代教程
大数据技术
21+阅读 · 2019年3月22日
CVE-2018-7600 - Drupal 7.x 远程代码执行exp
黑客工具箱
14+阅读 · 2018年4月17日
基于Numpy实现神经网络:反向传播
论智
5+阅读 · 2018年3月21日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
GAN的数学原理
算法与数学之美
14+阅读 · 2017年9月2日
python pandas 数据处理
Python技术博文
3+阅读 · 2017年8月30日
【原理】GAN的数学原理
GAN生成式对抗网络
8+阅读 · 2017年8月30日
Top
微信扫码咨询专知VIP会员