这两天看了一篇论文,作者提供了用Julia实现的算法源代码,所以顺手搭个环境复现一下结果,这里将那些踩过的坑记录下来。
Julia号称“Walks like Python, runs like C”,但是其版本兼容问题折磨了我整整两天,比如说使用1.0.0跑0.6.4的代码直接报错,不会提示是因为版本问题;又比如有一些Packages还不支持更高级的版本,安装时会编译不通过;各个版本的函数使用有一些细小的差别,在网上也没有找到这些变化的清单。我前后使用三个版本(1.0.0, 0.7.0, 0.6.4)才将论文公开的源码调通。
· 下面开始流水账。
1. 安装
Step 1:下载安装Julia
Step 2:安装Atom
Step 3: 配置Atom
(a)安装uber-juno:Atom中找到Setting安装Packages。File->Settings->Install在Packages的搜索栏搜索安装uber-juno.
(b)安装uber-juno,在工具栏会多出“Julia”,在这一栏找到Settings,将julia.exe的路径(根据自己实际安装的路径)添加进入Julia Path,如图4所示。
到这里就完成Julia开发环境的配置,然而Atom中没办法设置断点对Julia代码进行调试。所以还需要安装Julia的一个包“Gallium”,在Julia命令窗口输入Pkg.add("Gallium")即可。注意Gallium我只Julia0.6.4上安装成功,v0.7.0版本的预编译无法通过(不清楚是什么鬼)。
2. 调试
使用Gallium进行代码调试,在Julia脚本里的函数前面加入修饰符“@enter”,注意“@enter”需要函数前面,而不是语句前面。如果需要对脚本进行调试那怎么办呢?我的方法是将这个脚本封装成函数,再写一个脚本来跑调试就好了。
3.版本变化
1. 更高级的版本需要常常使用using导入Packages
Julia0.6.4的大部分Packages都是在Base里面,也就是说使用前可以不用 "using PackageName"将包导入进来,Julia0.7.0也可以这个用,但会提示这种做法后面的版本不可用,而到了Julia1.0.0,原先在Base的一部分Packages被割裂出去,如SparseArrays、LinearAlgebra、Statistics,因而使用这些Packages下面的方法之前,必须使用using将这些Packages导入。
2. 更高级的版本中,内置函数对类型的检查更严格。
Julia1.0.0内置函数似乎有类型检查,举例子声明func(Float32, Float32),如果是使用func时,第一个参数是Float64,会报错。
3. 更高级的版本中,对矩阵和向量的element-wise运算一般需要在计算符前加“.”,比如exp.(X)
建议先用0.6.4,包源充足;0.7.0可以用来过渡一下,弄清版本之间的变化;至于1.0.0,暂时就呵呵了。
最后,公布源代码的论文都是好论文,如果带上软件(语言)版本号那就更好了。