所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

Julia语言如何编写用户界面?

发布时间:2020-04-12 09:08:57

资讯分类:julia  编写  界面  语言  安装  程序  编译
Julia语言如何编写用户界面?

Julia是一个刚刚走入大众视野的科学计算利器!

你可能会说了,科学计算?不是有matlab了吗?而且如果做统计,还有R、Python、Stata之类的可以使用,为什么要用Julia呢?

很简单,方便+快!

首先,Julia的语法基本上就是Matlab+Python+R的混合,像Matlab一样简单,像Python一样严谨,像R...算了,还是不要像R了。

此外,作为「脚本语言」以及「科学计算语言」,Julia有个变态的特征:不怕循环!熟悉Matlab、R的人都知道,写这些程序的时候,通常会被建议「少写循环」。而实际上,如果你没有遵从这些规则,你会发现写出来的程序奇慢无比!当然,Matlab中也有一些设计企图规避循环,比如bsxfun等函数,但是很多情况下,循环在所难免。

那么Julia如何做到「不怕循环」这一点呢?Julia做了这么一些工作。首先,在Julia里面,是有「类型」的,比如学过C的都知道计算机中数字分为整型(int)、浮点型(float)、双精度(double)等类型,而Julia也对类型做了严格区分。不过不要怕,其实没什么大不了的,不会比Matlab复杂多少。而有了类型的区分,Julia使用LLVM这个工具引入了JIT,也就是在程序(比如循环体、函数)第一遍被执行的时候,这个循环体、函数就已经被编译好了。当这个循环体、函数再次被执行的时候,就不需要重新解释代码,只需要执行编译好的程序就好了。

有了这个黑科技,Julia的执行速度理论上是可以接近C的(理论上能达到的最快速度)。实际上我的工作过程中就有大量的程序因为嫌慢使用C写,速度的确比Matlab不知道要快到哪里去(这里提一下,根据我的经验,不可盲目崇拜C,没有经验的人写出的程序,或者没有复杂到一定程度的程序,速度可能比Matlab还慢)。

关于Julia的速度与其他语言的比较,可以参考Julia的网站:The Julia Language,其中有各编程语言的对比。不过这里要提一下,里面的参数不能完全相信,比如Matlab等语言的写法不是最有效的写法,所以在里面Matlab可能比Julia慢很多。而实际上,对于最简单的程序,Julia的速度比不过Matlab的。至于原因吗,我想有这么两点:首先Matlab不用编译;其次,Matlab使用了Intel的MKL库,而MKL库是经过汇编级别的优化的。当然,Julia也可以使用MKL,下面我会介绍。

所以总体说来,当涉及到大量的循环的时候,C(Fortran)和Julia是非常不错的选择,而出于写程序的方便程度和学习曲线的考虑,Julia显然优于C(Fortran)。

奥,Julia还有个优点没有说,这个可以秒杀Matlab,那就是:开源,免费!

此外,Julia还有一个更大的优点:非常方便的调用C、Python等写成的程序。Python本来就被成为「胶水语言」,可以调用几乎所有其他语言,而Julia 可以调用Python,这就变相给了Julia这个能力。此外,Julia还可以直接调用C写成的程序。所以平时工作的时候,非常常用的一些模块我都已经写成C放在一个库里面,这样就可以用Python 调用C,Julia调用C,R调用C,Matlab调用C...顺便提一下,Matlab也可以调用C,但是调用方式别提多蛋疼。

好,下面回到我们学校的问题上来。之前的一个项目我使用Julia+C一起写的,但是前段时间我们学校的超算中心非得给我们换个账号,这下好了,之前已经有的Julia突然没了。前面也说了,我是没有管理员权限的,所以使用yum的方式安装就走不通了。还好Julia是开源的,意味着我可以拿到Julia的源码,自己编译一个。

可是,真的问题出来了!Redhat出于对「稳定」的变态追求,里面的程序不会用最新的版本。比如,最坑爹的,gcc(一个c的编译器)的版本停留在『Red Hat 4.4.7-3』这个版本上。而开源社区日新月异,这个版本太老了,以至于不能编译Julia了!从此,我开始了漫漫的安装之旅。

在介绍我在没有管理员权限+没有新版本gcc的情况下如何安装Julia之前,可以先介绍一下普通青年安装Julia的正确姿势。

  1. windows用户,去Julia Downloads上直接下载安装。建议安装Julia+Juno的套装,后者是一个Julia的IDE,如果不装Juno,Julia的界面会非常不友好!

  2. Mac用户,同样去Julia Downloads上直接下载安装,安装方法与Mac软件的一般安装方法一样,安装好之后在Applications里。或者可以参考下面Linux用户使用源码安装,但其实没这个必要。

  3. Linux用户,就有多种选择了。或者选择源码安装,我下面会详细介绍。或者可以安装已经编译好的版本。不过更建议使用apt-get(Debian/Ubuntu)、yum(Fedora/Redhat/Cent)安装。

安装好之后,在命令行输入julia,应该能看到如下界面(win用户可能需要设置环境变量):

嗯,下面我就要开始介绍作死的源码安装方式了!

上面提到了,之所以选择源码安装,最大的原因是我没有管理员权限。其次,源码安装还有个好处就是,可以将Intel的MKL和Julia结合起来,强上加强,至强!

总的来说,我手动安装Julia的过程是:

  1. gmp/mpc/mpfr=>gcc

  2. Git

  3. cmake

  4. Python2=>LLVM

  5. Julia

是的,你没看错,为了安装Julia,我安装了这么多东西!!!截图给你们看:

安装gcc的原因不用说了,因为编译Julia需要高版本的gcc,所以必须自己装一个gcc。为了安装gcc。在安装的过程中,提示我缺少gmp/mpc/mpfr这三个包,这个问题不大,按照提示,去相应的网站,找到这几个包的最新版本,wget 一下,安装就好了。至于怎么安装,一般来说安装的顺序是:

  1. ./configure --prefix=/home/aragorn/softs/ 其中--prefix可以理解为安装路径

  2. make

  3. make install

经过这三个命令,一般就可以安装好。gmp/mpc/mpfr这三个包都是按照这个顺序,wget下载,tar -xvf ***.xz解压缩,进去,然后按照上面三个步骤安装。

至于gcc,可以去Installing GCC - GNU Project上看看,上面有安装gcc的详细步骤。注意如果需要安装gmp/mpc/mpfr这三个包,在configure的时候,后面需要加『--with-gmp=/home/aragorn/softs』,也就是制定者三个包的安装位置。

经过大概几个小时的等待,gcc装好了。总以为可以编译Julia了,可是又出错了!仔细一看,居然是git checkout出错了!查了一下,卧槽,git命令也是老掉牙啊!没办法,去git官网,找git的源码下载,git clone git/git · GitHub 下载下来,安装!安装过程可以参考文件夹下面的INSTALL文件,有详细描述。

后来又提示我cmake没有。同样,按照上述过程,安装cmake。

中间我也不记得是哪一步了,提示LLVM必须安装。装!可是安装LLVM的时候,又提示我Python的版本太低!Redhat的Python版本居然是2.6的!!!怎么能忍,装!去Python官网,干脆把Python2 and 3的源码都下载了下来,装装装!!!

这里需要注意的是,由于安装的这些程序都是安装在自己的目录下面的,所以需要修改环境变量。修改方法如下:

  1. cd ~

  2. vim .bashrc

  3. 找到export PATH=(如果没有则新建),把安装的程序的bin目录添加上去,比如我安装的gcc的目录是/home/aragorn/bin/gcc/,那么就要写成『export PATH="/home/aragorn/bin/gcc/bin:$PATH"』,建议每装一个程序,都把bin目录添加进来

  4. 同样,找到export LD_LIBRARY_PATH=(如果没有则新建),把安装的程序的lib/lib64目录添加上去,比如我的写成『export PATH="/home/aragorn/bin/gcc/lib64:$LD_LIBRARY_PATH"』,建议每装一个程序,都把lib目录添加进来

  5. :wq

如此设置,系统找程序或者库就按照上面的顺序开始找。比如虽然系统自带的gcc版本比较老,但是由于我设置了PATH,所以会先从/home/aragorn/bin/gcc/bin这个目录找gcc这个命令。修改结束之后,使用 source .bashrc 使得以上更改生效。

此外,我在浏览系统目录的时候,惊喜的发现原来这台电脑里自带了MKL库。开心死了。要知道这个库是付费的,当然对科研工作者是免费的。既然有了,就避免麻烦了,用!怎么用呢?在编译Julia之前,要做这么几个工作:

source /opt/intel/bin/compilervars.sh intel64

source /opt/intel/mkl/bin/mklvars.sh intel64 ilp64

export MKL_INTERFACE_LAYER=ILP64

至于这几步究竟在干什么,我也不知道,也懒得去搞清楚,大体是在设置MKL库的环境变量。

好了,万事具备,终于可以编译julia了!分这么几步:

  1. git clone git://http://github.com/JuliaLang/julia.git 复制源码到本地

  2. cd julia

  3. git checkout release-0.4 这一步请参考Julia的github主页,0.4为目前最新的版本号。这一步一定要做,否则自动编译的是正在开发的版本。

  4. vim Make.inc 这一步要做很多修改。首先,在开始加入一样『prefix=/home/aragorn/bin/julia』后面是你要安装julia的路径。其次,由于上面已经安装了最新的LLVM,可以使用最新的LLVM,设置『USE_SYSTEM_LLVM=1』。最后,由于要使用MKL,将『USE_INTEL_MKL ?= 0』『USE_INTEL_MKL_FFT ?= 0』『USE_INTEL_LIBM ?= 0』都改为1。github的网页上同时建议将『USEICC ?= 0』『 USEIFC ?= 0』也设为1,但是根据我的经验,intel的icc编译器并没有gcc好用,所以建议仍然保留为0,使用gcc。

  5. make 等待一大段时间

  6. make install

好啦,现在设置好环境变量,就可以优雅的开始使用带MKL的Julia啦!

最后,我只想吐槽一句,如果搞科学计算,普通青年用Ubuntu/Debian,文艺青年用Gentoo,二逼青年才他妈的用Redhat!!!

留言与评论(共有 0 条评论)
   
验证码:
Top