文章作者彭飞自称导师是Jens Palsberg,我还没能验证这个事实。Palsberg似乎曾在CFA领域做过一点研究,但我印象不深,我也从来没有在批评CFA的时候点过Palsberg的名。但由于我指出了CFA领域的弊病,彭飞可能就是一心研究这个的,所以觉得“祖业”受到了攻击,想要反驳我,支持CFA的“先进性”,这样以后可以在学术界更好的混下去。这可以理解,然而彭飞的文章,其实破绽很多,处处显示出他自己的一知半解和本本主义。
CFA领域的理论从来没有成功实现,展示过它的功效。CFA最强大的版本,CFA2的作者Dimitris Vardoulakis,当年在Mozilla实习的时候试图在JavaScript上实现CFA2算法。最后的产物叫做“DoctorJS”,还做了一个网站让人试用。可是在不久之后DoctorJS不了了之,消失了。Dimitris这人也挺喜欢吹嘘的,自己的主页上和简历上,都在很靠近自己姓名的地方自豪的写着“CFA2的发明者”字样,仿佛CFA2是什么众所周知的伟大发明一样。
后来跟Mozilla的research director聊天时,他告诉我DoctorJS其实根本不好用,理论过度复杂,实现起来非常困难,而且达不到号称可以达到的效果,所以以后不想再赞助相关的项目了。Mozilla现在已经不再维护DoctorJS的代码,这两封email就是我们能找到的关于Mozilla+DoctorJS最后的信息:
当然了,Dave Herman是很会说套话的。要让别人接手这样的项目,你不可能说它不好用或者很难维护,所以当然要假装它有价值。然而字里行间你却可以看出来,这理论其实非常难以实现,实现了也很容易出错,不知道到底是否正确。最后没人敢碰这样的代码,所以就不了了之了。
之前在Sourcegraph的时候,两位founder也试图采用DoctorJS来做JavaScript的分析,后来发现不好用,改用了Tern,才产生了有用一点的信息。
PySonar2(写于2010年)是跟CFA2差不多的时间出现的,而P4F的发表比PySonar2晚了好几年。可是PySonar2到今天仍然比CFA2,P4F都要强大。原因很简单,因为它根本没有CFA所用的continuation passing style(CPS变换)所带来的所谓“call/return匹配问题”。所有的call和它们的return,被抽象解释器(abstract interpreter)自然而然的匹配好了,根本不可能错位。
我很惊讶的是CFA领域研究了20年,就在解决这种根本不存在的问题,把简单的问题搞复杂,然后又让它简单一些,来来回回的。PySonar2一开头就很简单,从来没出现过CFA那些乱七八糟的问题,直接就把问题给解决了。彭飞抓住PySonar2表面上的一些小问题指指点点,貌似好大个事情,而其实很多都是由于他自己理解不够深入。详情请见我的评论。
另外,我真的对Python,Ruby,JavaScript这些动态语言做type inference不感兴趣了。PySonar2虽然比CFA2和P4F都简单和强大,但是我从来没想维护PySonar2的“先进性”,我从来没想推广PySonar2。因为我根本不在乎Python,也没把PySonar2当回事。给Python这样的语言做一个很好的类型推导工具,有什么意义吗?未来的方向是直接写上type annotation,就像Java和C#那样,让类型检查简单,迅速又准确。所以PySonar2和CFA领域做的其实都是无用功,只不过我没花20年时间研究CFA,只用了加起来几个月时间,而且还比他们做得更好。
我在2014年末的样子给CFA的“祖师爷”Olin Shivers写了封email,寻找合作机会。我跟他讲述了PySonar2的做法,而且问他为什么他的call/return match用那么复杂的方法来做,然而他没有回我的email。这是一个不祥的预兆,因为我一直在犹豫是否应该告诉这些人,有简单很多倍的办法,可以达到同样的目的。他们完全可以“借鉴”我的做法,然后写进论文里面发表。所以如果他们的2016论文加入了我的想法,也不足为怪。但是真的不在乎这些了,学术界随便胡搞就胡搞呗,反正也不可能有什么大的用处。这些东西,其实做static analysis的人早就明白,CFA远远落后,只能在自己的圈子里发表点paper。
彭飞错误地认为我很把PySonar2当回事,然而它只是我曾经做过的一个小玩具。我一直在探索和展望更加实在,对人可以产生真正效益的领域。只是随便提了一下CFA,就得到如此强烈而具体的攻击,我对PL人士的自我保护意识真的很惊讶。
技术部分以下是针对彭飞提出的pysonar的“技术缺陷”的逐一回应。说
CFA领域的理论从来没有成功实现,展示过它的功效。CFA最强大的版本,CFA2的作者Dimitris Vardoulakis,当年在Mozilla实习的时候试图在JavaScript上实现CFA2算法。最后的产物叫做“DoctorJS”,还做了一个网站让人试用。可是在不久之后DoctorJS不了了之,消失了。Dimitris这人也挺喜欢吹嘘的,自己的主页上和简历上,都在很靠近自己姓名的地方自豪的写着“CFA2的发明者”字样,仿佛CFA2是什么众所周知的伟大发明一样。
后来跟Mozilla的research director聊天时,他告诉我DoctorJS其实根本不好用,理论过度复杂,实现起来非常困难,而且达不到号称可以达到的效果,所以以后不想再赞助相关的项目了。Mozilla现在已经不再维护DoctorJS的代码,这两封email就是我们能找到的关于Mozilla+DoctorJS最后的信息:
当然了,Dave Herman是很会说套话的。要让别人接手这样的项目,你不可能说它不好用或者很难维护,所以当然要假装它有价值。然而字里行间你却可以看出来,这理论其实非常难以实现,实现了也很容易出错,不知道到底是否正确。最后没人敢碰这样的代码,所以就不了了之了。
之前在Sourcegraph的时候,两位founder也试图采用DoctorJS来做JavaScript的分析,后来发现不好用,改用了Tern,才产生了有用一点的信息。
PySonar2(写于2010年)是跟CFA2差不多的时间出现的,而P4F的发表比PySonar2晚了好几年。可是PySonar2到今天仍然比CFA2,P4F都要强大。原因很简单,因为它根本没有CFA所用的continuation passing style(CPS变换)所带来的所谓“call/return匹配问题”。所有的call和它们的return,被抽象解释器(abstract interpreter)自然而然的匹配好了,根本不可能错位。
我很惊讶的是CFA领域研究了20年,就在解决这种根本不存在的问题,把简单的问题搞复杂,然后又让它简单一些,来来回回的。PySonar2一开头就很简单,从来没出现过CFA那些乱七八糟的问题,直接就把问题给解决了。彭飞抓住PySonar2表面上的一些小问题指指点点,貌似好大个事情,而其实很多都是由于他自己理解不够深入。详情请见我的评论。
另外,我真的对Python,Ruby,JavaScript这些动态语言做type inference不感兴趣了。PySonar2虽然比CFA2和P4F都简单和强大,但是我从来没想维护PySonar2的“先进性”,我从来没想推广PySonar2。因为我根本不在乎Python,也没把PySonar2当回事。给Python这样的语言做一个很好的类型推导工具,有什么意义吗?未来的方向是直接写上type annotation,就像Java和C#那样,让类型检查简单,迅速又准确。所以PySonar2和CFA领域做的其实都是无用功,只不过我没花20年时间研究CFA,只用了加起来几个月时间,而且还比他们做得更好。
我在2014年末的样子给CFA的“祖师爷”Olin Shivers写了封email,寻找合作机会。我跟他讲述了PySonar2的做法,而且问他为什么他的call/return match用那么复杂的方法来做,然而他没有回我的email。这是一个不祥的预兆,因为我一直在犹豫是否应该告诉这些人,有简单很多倍的办法,可以达到同样的目的。他们完全可以“借鉴”我的做法,然后写进论文里面发表。所以如果他们的2016论文加入了我的想法,也不足为怪。但是真的不在乎这些了,学术界随便胡搞就胡搞呗,反正也不可能有什么大的用处。这些东西,其实做static analysis的人早就明白,CFA远远落后,只能在自己的圈子里发表点paper。
彭飞错误地认为我很把PySonar2当回事,然而它只是我曾经做过的一个小玩具。我一直在探索和展望更加实在,对人可以产生真正效益的领域。只是随便提了一下CFA,就得到如此强烈而具体的攻击,我对PL人士的自我保护意识真的很惊讶。
技术部分以下是针对彭飞提出的pysonar的“技术缺陷”的逐一回应。说