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

2019 年 12 月 19 日 极市平台

加入极市专业CV交流群,与6000+来自腾讯,华为,百度,北大,清华,中科院等名企名校视觉开发者互动交流!更有机会与李开复老师等大牛群内互动!

同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流。关注 极市平台 公众号 ,回复 加群,立刻申请入群~


同学,你可知如何用 文言文 输出“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://lingdo ng.works/




-End-



*延伸阅读




CV细分方向交流群


添加极市小助手微信(ID : cv-mart),备注:研究方向-姓名-学校/公司-城市(如:目标检测-小极-北大-深圳),即可申请加入目标检测、目标跟踪、人脸、工业检测、医学影像、三维&SLAM、图像分割、OCR、姿态估计等极市技术交流群(已经添加小助手的好友直接私信),更有每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流一起来让思想之光照的更远吧~



△长按添加极市小助手


△长按关注极市平台


觉得有用麻烦给个在看啦~  


登录查看更多
0

相关内容

人们为了让计算机解决各种棘手的问题,使用编程语言 编写程序代码并通过计算机运算得到最终结果的过程。
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
56+阅读 · 2020年6月26日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【干货书】用于概率、统计和机器学习的Python,288页pdf
专知会员服务
281+阅读 · 2020年6月3日
【干货书】R语言书: 编程和统计的第一课程,
专知会员服务
107+阅读 · 2020年5月9日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
【经典书】Python计算机视觉编程,中文版,363页pdf
专知会员服务
136+阅读 · 2020年2月16日
机器学习入门 | 刷新你三观的高数和线代教程
大数据技术
21+阅读 · 2019年3月22日
实战 | 用Python做图像处理(二)
七月在线实验室
17+阅读 · 2018年5月25日
基于Numpy实现神经网络:反向传播
论智
5+阅读 · 2018年3月21日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
【原理】GAN的数学原理
GAN生成式对抗网络
8+阅读 · 2017年8月30日
Seeing What a GAN Cannot Generate
Arxiv
7+阅读 · 2019年10月24日
Multi-Grained Named Entity Recognition
Arxiv
6+阅读 · 2019年6月20日
Feature Selection Library (MATLAB Toolbox)
Arxiv
7+阅读 · 2018年8月6日
Doubly Attentive Transformer Machine Translation
Arxiv
4+阅读 · 2018年7月30日
Arxiv
5+阅读 · 2018年5月28日
VIP会员
相关资讯
机器学习入门 | 刷新你三观的高数和线代教程
大数据技术
21+阅读 · 2019年3月22日
实战 | 用Python做图像处理(二)
七月在线实验室
17+阅读 · 2018年5月25日
基于Numpy实现神经网络:反向传播
论智
5+阅读 · 2018年3月21日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
【原理】GAN的数学原理
GAN生成式对抗网络
8+阅读 · 2017年8月30日
Top
微信扫码咨询专知VIP会员