我有一个学校项目,旨在静态输入一些Ruby代码。所以,我的输入只是一个 .rb 文件,我应该能够输入程序中分配的每个变量。
现在,我打算做的是:
我只接受一些非常基本的Ruby作为输入(=不调用外部库,只是ruby的核心+文件中定义的方法)
我的问题是:您如何看待我的方法?有没有宝石/现有的程序可以帮助我?
答案 0 :(得分:3)
你的方法在技术上是正确的,但是你说它的方式听起来很奇怪。这个:
现在,我打算做的是:
- 使用Parser库获取文件的AST
- 将各种节点放在容器对象中
- 实现访问者模式以递归方式完成程序
- 尝试从那里推断一些东西(我想以某种方式从核心方法创建一个可能的输入和输出类型表)
听起来有点像你想要像这样去火星:
现在,我打算做的是:
- 拿一支铅笔
- 拿一张纸
- 得到一张桌子
- 坐在桌边,用笔和纸设计太空发射系统和火星着陆器
换句话说,你列出了三个完全琐碎的要点,对于一个有经验的程序员来说可能是一个小时的工作,然后是第四个,即多年的工作并且值得一个博士学位。
我所知道的关于Ruby的静态类型推断的最高级工作是Diamondback Ruby (DRuby)(不要与分布式Ruby标准库(dRb / dRuby)混淆)。然而,Diamondback Ruby现在已被抛弃,因为作者放弃了Ruby的静态类型推断。
Diamondback Ruby背后的主要研究人员之一正在研究一个名为RDL的新项目。 Diamondback Ruby和RDL之间的主要区别是:
Steep是另一个类似的项目。它也依赖于动态检查和注释,而且实际上并不是为了确保类型正确性。
Ruby Type Inference for IDEA完全重新考虑JetBrains计划如何在他们的IDEA / RubyMine IDE中处理Ruby的类型推断。这个 使用类型推断,但它使用动态类型推断,而不是静态。
所以,正如你所看到的,Ruby的静态类型推断是如此困难,以至于没有人甚至尝试过它,做的人试图放弃它并且现在正在进行动态类型检查显式类型注释。
Ruby Type Checking Roundup on Robert Mosolgo's blog是关于Ruby输入当前最新技术的一个很好的概述。