首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Coffeescript静态分析/静态类型检查-路障

Coffeescript静态分析/静态类型检查-路障
EN

Stack Overflow用户
提问于 2012-06-04 07:59:50
回答 2查看 3.3K关注 0票数 20

我认为Coffeescript是一门很棒的语言!我正在寻找一些项目/问题/功能,可以将静态分析添加到Coffeescript中。然而,经过一些搜索后,我发现faqthis page建议静态分析可能不可行。

我想知道,在Coffeescript中实现静态分析/静态类型检查是否存在根本问题,因为这类问题在编译器中还不存在?

另外,它是不是不可能用于非平凡的检查,而可能只适用于简单的分析?当我说简单的时候,我指的是检查琐碎的东西,比如,用户是否用相同的名称定义了一个函数两次(在一个类中),或者在顶层(或者可能在相关.coffee文件的集合中的顶层)。

如果有人能指出一些例子,说明为什么实现静态分析/类型检查不直接/不可能/不值得花费时间,我将不胜感激。

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-05 06:07:16

这个答案有点愚蠢,因为我对此也很感兴趣。希望能有所帮助。

我使用谷歌闭包编译器静态分析CoffeeScript生成的代码。它有一个非常好的静态分析器,我不确定是否有充分的理由在这里重新发明轮子。最简单的方法就是手动编写注释:

代码语言:javascript
复制
###*
   * @param {number} x
   * @param {number} y
   * @return {number}
###
adder = (x, y) -> x + y

它有点冗长,但另一方面,你借用了闭包编译器的静态分析能力,它非常强大,能够检查很多东西。实际上,我以一种稍微更简洁的方式编写了类型注释,然后有一个脚本来重写咖啡文件。我的代码最终如下所示:

代码语言:javascript
复制
#! {number} x {number} y @return {number}
adder = (x, y) -> x + y

我相信你可以看到重写器是相当简单的。

在我继续之前,我有一个简短的说明。如果您通过闭包编译器运行-b ,请确保使用 closure (bare)编译代码。闭包编译器相当不错,但它还不够智能,无法进行数据流分析。默认情况下,CoffeeScript将您的代码包装在一个匿名函数中,这会使编译器出错。

沿着相同的路径(这会破坏与CoffeeScript的兼容性,但会更酷)的另一个选择是让Coffee编译器编译如下所示:

代码语言:javascript
复制
adder = (number x, number y): number -> x + y

进入JS,如下所示:

代码语言:javascript
复制
/***
  * @param {number} x
  * @param {number} y
  * @return {number
  */
var adder = function(x, y) {
  return x + y;
};

然后可以在编译时将其提供给闭包编译器-如果没有错误,编译器可以剥离所有注释。

事实上,this guy似乎就是这样做的。可悲的是,他的工作似乎处于不完整的状态。

在所有这些情况下,我们将繁重的工作-静态类型检查-交给闭包编译器。如果你不想这样做,我可以理解,但是很难说服我从头开始构建一个全新的静态分析工具是值得的。:)

一年后编辑:这些天我只使用typescript。:)

票数 13
EN

Stack Overflow用户

发布于 2012-06-04 08:48:41

我不是CoffeeScript方面的专家,所以这可能是一个完全错误的答案,但它基本上可以归结为: CoffeeScript是一种表现力很强的语言,大多数语义都是动态确定的(可能还有一些奇怪的边缘情况)。这与标准ML这样的语言形成了很大的对比,后者的语义定义要严格得多。一般来说,对高阶语言进行静态分析被认为是非常困难的。也就是说,对真正的高阶程序(Haskell,ML,特别是javascript,因为eval之类的东西)的静态分析是困难的,因为控制流程要灵活得多。事实上,高阶语言的静态分析解决方案实际上只是在过去20年左右的时间里才被探索出来的。(值得注意的是,请参阅马特·梅在a tutorial style description of CFA上的文章。)

基本上,原因是:

  • 要做分析,你必须处理来自流控制的富有表现力的语义问题,你可以通过修改高阶函数来获得。
  • 要做类型,通常这些语言有一组更丰富的类型可用。例如,在非常典型的情况下,如果您尝试将静态类型赋给Ruby中的变量(如在C、Java、ML等中)。你会得到一个错误,但是因为你的程序的某些路径永远不会被执行,所以一切都是正常的。除此之外,Ruby等语言还添加了大量的隐式类型转换,这些转换实际上是用来进行很酷的编程的。我熟悉的(dynamic analysis of static types for Ruby)在这一领域的显著工作来自于我的一些同事,但肯定还有其他examples.
  • Basically,该语言以更动态的方式使用,具有更具表现力的语义,并且静态推理要困难得多,而且容易不精确。(如今)实现这一点的基本前沿开始看起来像是混合的:你可以静态地分析程序的一部分,然后还需要程序员给出一些测试用例来进行某种精细的分析。

我希望这在某种程度上回答了你的问题,再次抱歉,我不能直接解决你的问题的直接问题,因为它适用于CoffeeScript,但是现在在分析像JavaScript这样的东西方面有很多工作正在进行。我要指出的是,Javascript的一些真正问题来自于它奇怪的语义,原型继承很难解释,特别是eval()!通常,对这些语言的程序分析会施加某些限制(例如,完全丢弃eval!)让分析更具可行性!

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10874952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档