Logo-Exakat-small
升级的exakat:引擎盖下的新电源。

有一个升级的exakat版本可用。自5月以来,我们’在exakat代码基础的重大升级上一直在努力。经过两年的增长和增加功能,初始架构显示了衰老的迹象,需要升级。例如,诸如类,函数,常量等的结构定义被保存在索引中,允许容易查找定义,但是更难计算使用。它们现在被制成了正常的链接,这可以使用这两种方式。

从格雷梅林2到3

第二重要升级是从格里林2.0到Gremlin 3.0的更改。版本的变化带来了很多不兼容,并且导航图形的方式变化。特别是,Gremlin 3.0 API涵盖了更多地,减少了LAMDBA功能的使用。这也是我们的趋势’在写exakat时一直在关注’S代码:在Gremlin API中保持越来越多,避免泄漏到Java / Groovy或程序代码。这是一个改进,希望这也将为Gremlin引擎和最终数据库提供更多的自由,以优化查询。主要后果是触发总重写‘tokenizer’exakat的阶段,并升级分析仪。

重写exakat的AST阶段

高达0.6.7,exakat加载了图表中的原始令牌,并使用Gremlin构建AST(抽象语法树)。进口速度很快,建造缓慢。它还基于827个查询,或多或少动态构建,被证明不人道以升级。在升级其中80后,决定找到另一种方法。

新方法是更改​​负载过程,并依靠PHP来构建AST,然后导入在数据库中。此阶段可以使用PHP完成,并作为一个通过分析:从PHP标记器本身获得的令牌列表,现在读取并在一个循环中被处理到树中。这使得代码比以前更快的数量级。稍后,有组织的代币在数据库中加载,标签正确,并立即索引。加载了较少的令牌,只有有用的标记:新图表现在是更清晰的,并准备运行分析。

exakat.’s DSL

exakat的分析阶段也依赖于Gremlin查询来分析代码,但与销有阶段相反,它具有解耦层。要使分析仪查询靠近PHP语义,还有各种方法转换PHP - 意思是‘所有非匿名课程’ to ‘g.v()。Haslabel(«类»)。地方(__。out(‘NAME’).hasLabel(‘Void’).is(eq(0)) ) ‘.

其中有174人,所以它’SA长期以来将它们转换为Gremlin 3.但是,原始Gremlin查询的数量从764删除到392.就像Gremlin 3一样,在Exakat API中正在完成更多的处理,并且使用Raw Gremlin脚本较少,这样可以’T以通用方式升级。这是朝着正确方向的良好一步。下一个目标不会是删除所有这些‘raw’呼叫,而是继续减少它们:毕竟,创新经常从那里开始,直到它被重用,然后在API中概括。

在此过程中审查了一些教训

  • 单元测试至关重要 在重写过程中。它们符合上一个和允许的比较,将新代码保持一致。他们确认当前版本仍然需要一些工作,但超过一半的功能是正确的:这对道德有益。
  • 一旦重写开始,就丢失了在代码中获得的任何信任都会丢失。只有在单位测试再次传递(或至少足够的情况)后,此信任只能重建。 我们需要工具来帮助构建信任,因为目前没有,除非尽可能经常运行代码。
  • 在不确定的时间,在项目中有一个社区,甚至是一个小的人。它’始终鼓励突破编码,并讨论新代码的功能或未来使用情况。 非常感谢所有帮助的人,并继续帮助。
  • API泄漏,所以在编写新的API时,应该有一个‘raw’允许达到底层平台的所有内部部分的方法。也应该是一个‘raw’使用监控,以便尽可能地删除它们(但不再)。实际上,一旦有几种用例,就可以看到趋势,然后移动到API中。

现在下载

exakat目前在0.7.4版中:我们上周制作了快速修复的释放。我们’LL在0.7版本中使用0.6.7的稳定性和总符合性,然后在0.8中开始添加更多功能。 现在下载exakat !