Ruby中的静态类型推断,我该怎么办?

时间:2018-06-03 14:44:17

标签: ruby types static type-inference

我有一个学校项目,旨在静态输入一些Ruby代码。所以,我的输入只是一个 .rb 文件,我应该能够输入程序中分配的每个变量。

现在,我打算做的是:

  • 使用Parser库获取文件的AST
  • 将各种节点放在容器对象中
  • 实现访问者模式以递归方式完成程序
  • 尝试从那里推断一些东西(我想以某种方式从核心方法创建一个可能的输入和输出类型表)

我只接受一些非常基本的Ruby作为输入(=不调用外部库,只是ruby的核心+文件中定义的方法)

我的问题是:您如何看待我的方法?有没有宝石/现有的程序可以帮助我?

1 个答案:

答案 0 :(得分:3)

你的方法在技术上是正确的,但是你说它的方式听起来很奇怪。这个:

  

现在,我打算做的是:

     
      
  • 使用Parser库获取文件的AST
  •   
  • 将各种节点放在容器对象中
  •   
  • 实现访问者模式以递归方式完成程序
  •   
  • 尝试从那里推断一些东西(我想以某种方式从核心方法创建一个可能的输入和输出类型表)
  •   

听起来有点像你想要像这样去火星:

  

现在,我打算做的是:

     
      
  • 拿一支铅笔
  •   
  • 拿一张纸
  •   
  • 得到一张桌子
  •   
  • 坐在桌边,用笔和纸设计太空发射系统和火星着陆器
  •   

换句话说,你列出了三个完全琐碎的要点,对于一个有经验的程序员来说可能是一个小时的工作,然后是第四个,即多年的工作并且值得一个博士学位。

我所知道的关于Ruby的静态类型推断的最高级工作是Diamondback Ruby (DRuby)(不要与分布式Ruby标准库(dRb / dRuby)混淆)。然而,Diamondback Ruby现在已被抛弃,因为作者放弃了Ruby的静态类型推断。

Diamondback Ruby背后的主要研究人员之一正在研究一个名为RDL的新项目。 Diamondback Ruby和RDL之间的主要区别是:

  • RDL执行动态检查,而非静态检查
  • RDL依赖于显式注释,而不是隐式推理

Steep是另一个类似的项目。它也依赖于动态检查和注释,而且实际上并不是为了确保类型正确性。

Ruby Type Inference for IDEA完全重新考虑JetBrains计划如何在他们的IDEA / RubyMine IDE中处理Ruby的类型推断。这个 使用类型推断,但它使用动态类型推断,而不是静态。

所以,正如你所看到的,Ruby的静态类型推断是如此困难,以至于没有人甚至尝试过它,的人试图放弃它并且现在正在进行动态类型检查显式类型注释。

Ruby Type Checking Roundup on Robert Mosolgo's blog是关于Ruby输入当前最新技术的一个很好的概述。