当前位置: 首页 > 面试题库 >

是否有用于JavaScript的静态Call-Graph和/或Control-Flow-Graph API?

李振国
2023-03-14
问题内容

是否有JavaScript的调用图和/或控制流图生成器?

通话图-http:
//en.wikipedia.org/wiki/Call_graph

控制流图-http:
//en.wikipedia.org/wiki/Control_flow_graph

编辑: 我正在专门寻找一种静态工具,让我使用一些API /代码访问图形


问题答案:

为此,您需要:

  • 解析,
  • 名称解析(处理范围)
  • 类型分析(虽然可以说JavaScript是“动态类型的”,但这里有各种类型的常量,包括此处特别感兴趣的函数常量)
  • 控制流分析(在方法内建立控制流图的结构)
  • 数据流分析(以跟踪这些类型的生成/使用位置)
  • 什么代表全局点分析(跟踪在函数之间传递的函数常数作为应用点的值)。

如何做到这一点在编译器文献中有很好的记录。但是,由于要花很多时间才能解决这个问题,所以“您可以使用解析器结果来获得所需的结果”形式的答案就有点不对了。

如果您可以应用所有这些机制,那么实际的结果就是一个 保守的 答案,例如“ A可能称为B”。反正这就是你所知道的

 void A(int x,y) { if (x>y) foo.B(); }

因为某个工具有时根本无法推理复杂的逻辑,所以即使应用程序设计者知道不可能,您也可能会得到“ A可能调用B”的信息:

 void A(int x) // programmer asserts x<4
   { if (x>5) foo.B(); }

eval
使问题变得更糟,因为您需要跟踪到达eval命令的字符串值结果并对其进行解析,以获取有关逃避什么代码以及评估代码可能调用的函数的某种线索。如果有人将字符串中的“
eval”传递给eval,事情就会变得很讨厌:-{您可能还需要对程序执行上下文进行建模;我怀疑有很多包含回调的浏览器API。

如果有人为您提供了具有所有必要机械的完整配置工具,可以立即解决您的问题,那显然很棒。我怀疑您不会获得这样的报价,因为这样的工具不存在。原因是需要所有基础结构。它很难构建,几乎没有人可以仅使用一种工具来证明它的合理性。如果您发现即使是一个“优化的JavaScript编译器”,也可能不会具备所有这些机制,尤其是全局分析,并且它所做的也不可能以易于使用的形式打包为您的目的而包装。

自1969年开始编程以来,我就一直在努力解决这个问题(当时我的某些程序是编译器,我想要所有这些东西)。做到这一点的唯一方法是分摊 许多
工具中所有这些机器的成本。

我公司提供了DMS Software Reengineering
Toolkit,这是一种通用编译器分析和转换机制的程序包,具有多种具有工业实力的计算机语言前端(包括C,C
++,COBOL和yes,JavaScript)。DMS提供API,以使自定义工具可以在其通用基础上构建。

消息顶部列出的通用机制都存在于DMS中,包括控制流程图和数据流分析,可通过干净的文档化API获得这些信息。流分析必须与特定语言的前端联系在一起。这也需要一些工作,因此我们还没有针对所有语言完成它。我们已经为C完成了这一工作[在18,000个编译单元的系统上进行了整体测试,包括计算现有的250,000个函数的调用图,包括间接函数调用!],COBOL和Java,我们正在开发C
++。

DMS与该线程中的其他答案具有相同的“
JavaScript”解析器答案,并且从这个角度来看,DMS并不比其他回答“在解析器之上构建”更好。区别应该很清楚:DMS中已经存在 机械
,因此工作不是实现机械和与解析器绑定的工作之一。它只是将其绑定到解析器。这仍然有些工作,但是要比仅从解析器开始要少得多。



 类似资料:
  • 我在我们的代码中使用了一些条件表达式,但是现在是时候去更深地去解释它们了。我们通常都在使用过程式编程语言的时候很少地去使用代码流控制的机制去编写(有些过程式编程语言中几乎已消失),但是它们还是很有用的。这也是一个新的强大的想法让解决一些特定的情况下的问题变得更容易。

  • 很难解释control flow,如果不去讲讲ranges的话。但是它们的范围要宽得多。Range表达式使用一个..操作符,它是被定义实现了一个RangTo方法。 Ranges帮助我们使用很多富有创造性的方式去简化我们的代码。比如我们可以把它: if(i >= 0 && i <= 10) println(i) 转化成: if (i in 0..10) println(i) Rang

  • Note: Functions taking Tensor arguments can also take anything accepted by tf.convert_to_tensor. Contents Control Flow Control Flow Operations tf.identity(input, name=None) tf.tuple(tensors, name=None

  • Introduction Based on the real-time statistics collected in Sentinel, FlowSlot will use pre-set rules to decide whether the incoming requests should be controlled. One resource can have multiple flow

  • Introduction Cluster flow control is useful in plenty of scenarios. For example: There are 50 instances in the service cluster, and you're going to limit the frequency of one invocation to 10 per seco

  • Sentinel Parameter Flow Control This component provides functionality of flow control by frequent ("hot spot") parameters. Usage To use Sentinel Parameter Flow Control, you need to add the following d