查看原文
其他

阁下可知文言编程之精妙?文言文亦能编程!此诚年度最骚语言也,数天6K星

The following article is from 量子位 Author 关注前沿科技

点击上方 "程序员小乐"关注, 星标或置顶一起成长

每天凌晨00点00分, 第一时间与你相约

每日英文

Try to hold the right hand with your left hand, and gave yourself most simple warmth. we should learn to get it by ourselves instead of craving for warmth from others.

试着用左手握住右手,给了自己最简单的温暖,不再奢求别人的给予,开始学着自己给自己。


每日掏心

人最大的幸福是有人可以依赖,但人最大的不幸则是过份依赖某个人。


来自:量子位 报道 | 公众号 QbitAI | 责编:乐乐

程序员小乐(ID:study_tech)第 720 次推文   图片来自网络


往日回顾:面试官问我:new 一个对象的过程中发生了什么?我竟然回答不上来...



   正文   


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

请君睁圆双眼注视于此:

 右边一顿输出

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

却为何输出了三遍?

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

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

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

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

譬如,妒少年之才华:


譬如,点未来之方向:

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

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

文言文编程“黑话”

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,来自卡耐基梅隆大学,如今大四,明年即将毕业。高中则毕业自上海世界外国语中学。

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

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

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

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

传送门

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

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

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

个人主页:
lingdong.works/

欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。

欢迎各位读者加入程序员小乐技术群,在公众号后台回复“加群”或者“学习”即可。

猜你还想看


阿里、腾讯、百度、华为、京东最新面试题汇集

深入分析 Session 和 Cookie,看这篇就对了!

动画演绎Java常用数据结构(建议收藏)

漫谈Serverless、微服务、分布式和单体四种主流软件架构


关注「程序员小乐」,收看更多精彩内容
嘿,你在看吗?
: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存