用户在我的网站上提交代码(主要是Java)来解决简单的编程挑战,但将代码发送到服务器进行编译和执行有时需要超过10秒。
为了加快这个过程,我计划首先检查提交数据库,看看是否已经提交了等效的代码。我意识到这将导致随机方法始终返回相同的结果,但这并不重要。如果不运行代码,还可能引起其他潜在问题吗?
为了找到匹配项,在比较代码时,我会删除注释和空格。但是,同样的代码仍然可以用不同的方式编写,例如使用不同的变量名。有没有一种比较代码的方法可以找到更多等效的代码?
用户在我的网站上提交代码(主要是Java)来解决简单的编程挑战,但将代码发送到服务器进行编译和执行有时需要超过10秒。
为了加快这个过程,我计划首先检查提交数据库,看看是否已经提交了等效的代码。我意识到这将导致随机方法始终返回相同的结果,但这并不重要。如果不运行代码,还可能引起其他潜在问题吗?
为了找到匹配项,在比较代码时,我会删除注释和空格。但是,同样的代码仍然可以用不同的方式编写,例如使用不同的变量名。有没有一种比较代码的方法可以找到更多等效的代码?
cat和dog
都会像a1
一样,然后您可以查看它们是否唯一。另外一种方法是将其编译成字节码,但那就太晚了。
与其分析源代码,何不加速编译呢?尝试使用自定义ClassLoader始终运行的servlet容器,并使用JDK tools.jar动态编译。您甚至可以通过AJAX REST提交代码并以同样的方式获取结果。
考虑Eclipse在后台如何编译您的文件。
此外,请考虑http://ideone.com如何实现他们的在线编译器。
请注意,允许随机代码执行是巨大的安全风险。您必须非常小心地对待黑客攻击。
运算符优先级:
"3 + (2 * 4)"通常等同于"2 * 4 + 3"
解决这个问题的方法是确定每个操作的优先级,然后将其与另一组代码中具有相同优先级的操作匹配。一旦一组操作已经匹配,就可以用一个变量来代表它们。
例如:
(2+4) * 3 + (2+6) * 5 == someotherequation
//substitute most precedent: (2+4) and (2+6) for a and b
... a * 3 + b * 5
//substitute most precedent: (a*3) and (b*5) for c and d
... c + d
//substitute most precedent....
这只是我能想到的一些方式。如果您按照这种方式操作,它将成为一个相当大的项目......特别是如果您正在使用多种语言。