使用Antlr+Stringtemplate生成method chaining,一个不太简单的案例(1)
引言
听着douban电台,很多新的旧的听说过和完全不认识的歌者在网络的另一端歌唱。我也不知识他们和她们都在想些什么,为了哪些感动的事情而快乐忧伤,我知道的是,这些歌声是某种数据流,彩色的发光的,在网络中穿行,最后然后驱动线圈振荡,驱动膜片振荡,驱动我的耳蜗。
这些背后,是信息论和电子学,以及无数理论支撑的结果。因为这些,世界才可能令这样美丽。
听说,BBC声称,编程技术正成为拉丁文学一样的东西。我们正尽享生活,就越来越不屑于了解世界背后的原理。令人不禁想起古罗马一片欢乐声里那些正催吐,以便吃下更多美食的达官。他们正忘记如何战斗,也正失去古希腊探索世界本源的精神。
读罗马史,我看到了散落一地的破碎镜片,很多碎片闪着耀眼的光,也同样是在这些碎片中,我看到我们自己的影像。
----
计算机由语言操纵运行,语言表达了人类的思想。人类的,或更精准的更形式化的语言要转化为机器唯一能了解的代码,然后,机器方能听命于人。
这种翻译人类可识读语言(C/C++,java,python,perl...html)为机器语言的工具,名为编译器。
Antrl是一款编译器生成工具,Stringtemplate是同一作者开发的模板工具,供编译器在解析输入文件后,填充模板中保留的占位符为另一些东西。此作者是一位大学教授,网页上的照片把两只手张开放在脑袋旁边,不知是在戏仿兔子还是蝙蝠,孩童一样微笑着。
他的硕士研究生,做了antlr+stringtemplate的PPT报告,用了童稚的字体,还有他模仿导师动作的个人照片。
导师模仿兔子,我们模仿导师。人类的动作具有丰富的内容,据说甚至承载了超出语言的信息量。不过,动作和表情传达的信息又是模糊的,对于计算机而言,模糊的指令甚至不如没有指令。
在讨论计算机精确的指令系统以前,我想先介绍一些别的。然后到了明天的博客,非计算机专业的同学,就基本可以无视了。
刚刚,我在音乐里睡着了,醒来的时候手里捧着罗素的《自由之路》还没有掉到地上。也许,我只不过迷糊过去了不到一分钟。如果我注意了刚刚在听什么歌,也许我可以判断时间。但是,我唯一知道的是,灯光仍亮着,屏幕仍黑着,长夜仍刚刚开始,我正读的,仍然是那一页
政治与自由。
一般我们认为,罗素是数学家,逻辑学家。他同时还有另一个身份,他也是一位哲学家。他以哲学著作获得诺贝尔文学奖,因为他的文字中对于人类的关怀。
在读《自由之路》的过程中,我不断地发现许多书页中夹着的暗红色叶子,并为此而感动。这当时许多年前某位读者放进去的,某个秋天,她读了其中的很多页,把那个秋天的纪念放在这里。后来的很多位读者,都看到并保留了这份心意。
我执意认为,这位读者当是一位女士。因为男士少有此种闲情。而她之所以令我感动,并非出于性别,而是智慧。读了这些书页的,能读懂这些书页的,应该具有与性别无关的智慧。我见过许多美女抱怨"他喜欢我一定只是因为我的容貌",就像男子抱怨"她喜欢我绝然是为了我的钱"。他们和她们都没有想过一个问题,那是否因为你的智慧并非明显地超出你的容貌或者金钱。
当你的智慧超出性别,那么人们自然尊重你的智慧,与性别无涉。当你注视罗素在很多年前,把他的智慧倾吐在这些纸上的时候,你见到的是一位长者,还是一位老帅哥?
尤其是当岁月洗去他的容貌和声音以后。当你与他的生活毫无交集,因此绝无情感置于你与他之间。
你所看到的,是一个人,他在探索人类所未知的领域。
那些领域,哪怕仅是我们自己所未知的,而别人尽已了解,也仍然是非常有意思的事。
而有些人,不是这样做的。他们并不想了解这个世界,只是想消费它。
听到一个笑话,就是牛顿说我不是牛顿,我站在一平方米上,所以我是帕斯卡那个。我看到有人说:我是文科生,看不懂,猜那是公式,所以我笑了。
所以我叹气了。有些人,并不想了解这个世界,只是想消费它。牛顿每平方米不是大学物理中的公式,而是高中知识。也就是说,能说"我是文科生"的人,既然已分文理,他一定是学过这个公式的。
他只是不愿意去看去想,这个世界,只是他发表意见的垃圾筒,他根本不屑于明白。我确实十分不明白,对于一个你不了解的领域,这整个世界,你怎么敢于发表一丁点意见。
对于我们未知的领域,保持探索,这是后面这个例子的引子,也是antlr+stringtemplate这系列博客的引子。
-----
这个例子,是探索仅我未知的世界,这个领域的人,早就知道了。
前几天以蜡烛做为质料,做了几个小东西,有小兔子,有小娃娃,还有一头小驴子。后来想做松塔,失败了。
其中一种方法是这样的。
第一步,把橡皮泥在橡皮泥的模具(材质是塑料)上压紧;
第二步,小心揭下橡皮泥,不要整变形了;
第三步,把热熔的蜡烛烧在橡皮泥里;
第四步,等蜡烛冷却凝固,把橡皮泥扣下来。
似乎是这样的,这些步骤在某个学科里都是有专门名字的,这些东西也是有专门名字的。
我仅约略知道,在这里,第一步中的橡皮泥模具,塑料的那个,称为母模(还有一种说法,公模母模,按这种说法,这应该是公模);第二步里以橡皮泥为材质的那个,称为阴模,或者简称模具;第三步和第四步里蜡烛的那个东西,叫做什么呢,我们称它为产品吧。
以上的这些步骤看似简单,其实里面诸多细节,任何一个细节的卡死,可能都会令你全盘失败。
有的同学会问,都成功80%了,那也叫失败么。谁说的来着,失败只有一种,就是半途而废。后面种种理想,只要没有实现的,也不过是你大脑里的一些神经电脉冲而已,能有几毫瓦呢。
凡是没有做出产品的,就是完全失败的。这也是为什么某些表现为领导者的干部令人厌恶的原因,他们完全没有实施的能力,只有观点。
在操作以前,有些细节,由于学科训练,我能够想到,有些,则完全没有预料到。
我想到的,书里也提到,蜡烛加热是件危险的事,要始终看着火温。我们都知道那是易燃品。我想到的方法是水浴,即隔水加热,这能保证在加热中蜡烛只会融化,不会燃烧。
水浴,这个方法很令我得意。我还跟包师弟吹嘘来着,同时提到数据,石蜡的融点是47-64度。包师弟说,水什么浴什么热,我做个电子的恒温器。
这就是能力差别。因为他还将避免另一个我在实验时发现的问题,烧铸的时候,蜡的温度非常重要。如果温度过高,会把橡皮泥中的水析出来,留在橡皮泥和蜡液之间,这非常影响对模具细节的表现。如果温度过低,蜡液将开始成为半流体,容易断裂。
我猜到,有些同学正对这些细节不屑。那是因为你只有观点,既不打算了解这个世界,也不解它,因此并无亲自实施的习惯。
这些细节足以使你的作品变成垃圾。
就像你的那些错别字,那些矮油的感叹把你从一个严肃讨论问题的公民转变为一个戏谑或无知的看客。因为你既不尊重你讨论的对方,也不尊重你讨论的问题。这正如打CS的时候作弊,你当然有这样的自由,但是没有人乐意陪你玩,又或者陪你玩的人是和你一样或更不严肃的人,你们一起把这个游戏变成甚至不如一个的游戏。(这里,感谢子龙和兔子的教诲,打CS作弊是不对的。)
同理,antlr+stringtemplate中的细节,也都是非常重要的。仅知道它们干什么的工具,并不能帮助你有能力使用这些工具--仅达到指手划脚的能力吧。
为什么我要提铸模这个例子呢?
因为从明天的博客开始,我会使用母模、阴模、产品这样的比喻。
我将谈到:antlr, stringtemplage的基本原理,我将用它们从下面这样的杨氏语言中生成c++源代码,包括头文件,cpp文件,调用它们的cpp文件,能编译并执行的。
杨氏语言的一个例子:
mario:pipe_a 123 | pipe_b | pipe_c
peach:stage_1 123 | stage_2
bowser:lose_1 123 | lose_2 | lose_3 | lose_4 234
没错,这就是超级马利的一个粗糙模仿。马利同学依次穿过了pipe_a,pipe_b,pipe_c,并且在pipe_a那个场景里得到了123这么个道具。
最后生成的cpp代码大致像这样:
o_mario->pipe_a(123)->pipe_b()->pipe_c();
o_peach->stage_1(123)->stage_2();
o_bowser->lose_1(123)->lose_2()->lose_3()->lose_4(234);
生成的代码中,还包括o_mario等这些对象的类的声明和实现。
另外,下面这种调用方法,就是fluent interface的实现手段之一:methodchaining。是不是看着挺人性化的?
o_mario->pipe_a(123)->pipe_b()->pipe_c();
明天开始,我们整个模具生成它们。明天,我们先看母模啥样。