code2vec(项目GitHub:https://github.com/tech-srl/code2vec)是发表在POPL 2019上的论文:
Alon, Uri, Meital Zilberstein, Omer Levy, and Eran Yahav. "code2vec: Learning distributed representations of code." Proceedings of the ACM on Programming Languages 3, no. POPL (2019): 1-29.
发表以来也确实受到了很多关注,例如ASE 2019上就至少有两篇论文做的是follow up的工作(虽然都是在一定程度上批评,但也说明了其影响力):
Jiang, Lin, Hui Liu, and He Jiang. "Machine Learning Based Recommendation of Method Names: How Far are We." In 2019 34th IEEE/ACM International Conference on Automated Software Engineering (ASE), pp. 602-614. IEEE, 2019.
Kang, Hong Jin, Tegawendé F. Bissyandé, and David Lo. "Assessing the Generalizability of Code2vec Token Embeddings." In 2019 34th IEEE/ACM International Conference on Automated Software Engineering (ASE), pp. 1-12. IEEE, 2019.
今天简单总结一下怎么用现有工具来生成code2vec的输入数据,用的是astminer这个工具:
https://github.com/JetBrains-Research/astminer
这个工具实际上也有对应的论文,之前的名字还是叫PathMiner:
Kovalenko, Vladimir, Egor Bogomolov, Timofey Bryksin, and Alberto Bacchelli. "PathMiner: a library for mining of path-based representations of code." In 2019 IEEE/ACM 16th International Conference on Mining Software Repositories (MSR), pp. 13-17. IEEE, 2019.
个人感觉改了的名字还是好一些。我这里总结一下在Windows上的运行方法:
下载其Zip或者git clone后,在其目录下运行:
gradle shadowJar
注意这里Gradle的版本需要在5.5以上。然后我们在build\shadow目录下可以看到生成了一个lib-0.5.jar的jar包(有可能由于版本号不同,名字稍有差别),实际上我们直接运行这个jar包就可以得到输出了。
不过由于astminer的ReadMe.md里写的是运行sh脚本,我这里再简单说说在Windows下运行sh脚本的方法,其实有很多朋友也总结过了:
https://blog.csdn.net/weixin_42376686/article/details/82391410
我们在git的bin目录下找到sh.exe,例如我的是在这里:D:\Program Files\Git\bin
双击运行,然后定位到astminer的目录,这里有个小问题需要注意一下,例如我的astminer目录在这里:D:\Projects\astminer,如果我直接输入:
cd D:\Projects\astminer
就会报:bash: cd: D:Projectsastminer: No such file or directory
可以看到原因很简单,没有识别Windows下的分隔符,所以应该输入的是:
cd D:\\Projects\\astminer
然后就可以按照github上的说明运行:
./gradlew shadowJar
然后再运行:
./cli.sh code2vec
以及必要参数就可以生成code2vec需要的数据了。看到这里似乎一定要在Linux下运行,但实际上我们看看cli.sh的内容,发现它只是运行了上面那个jar包:
#!/bin/bash
java -jar build/shadow/lib-0.5.jar "$@"
所以我们其实直接运行上面的jar包也能得到一样的结果,所以我们直接在windows cmd中运行:
java -jar lib-0.5.jar code2vec --lang cpp --project %源代码的目录% --output %需要生成的code2vec的输入数据的目录%
即可以得到相应的输出。是不是很方便?感觉这个工具确实也是造福人类啊。