Julia,新语言开箱的两三事

作者 : 开心源码 本文共2661个字,预计阅读时间需要7分钟 发布时间: 2022-05-12 共153人阅读

或者许你根本没听说过还有这么一门语言,我也是最近才接触到它,瞬间就被它的高效简洁所吸引,这里所指的高效,同时包含了编码与执行两层含义。我曾经非常想在 Java 或者 Kotlin 内直接书写数学公式,因而也学习了 MPS 等奇怪的东西,比方说这样的(图片来源为 JetBrains MPS Intro):

尽管在这种情况下写代码确实是累了点,但是效果很好,能够很直观的看出来想要做的事情。


当用上 Julia 之后,即可以直接扔掉 MPS 了,你可以用很简单的方式,在 Julia 里编写数学公式:

julia> x = 3julia> y = 2x^2 + 3x - 1julia> println(y)julia> z = √2julia> println(z)

写个根号都那么任性!


既然要拿它来进行开发了,那自然逃不了搭建开发环境等事。好在 Julia 提供了非常简单搭建手册,直接照做就行了(点击查阅)。

搭过一遍后,我发现我这种 Idea 党完全用不惯 Atom,还是更加倾向于在 Idea 里直接搭建。不得不说,JetBrains 全家桶真的是万能的,直接就找到了 Julia 的插件:

安装后只要要配置 Julia 的可执行程序路径就可,比方说在 Mac 下是 /Applications/Julia-x.y.app/Contents/Resources/julia/bin/julia。于是环境就搭好了,可以愉快的玩耍了。


对于我来说,学习一门新的语言,我都会从它的特性开始入手,比方说特定的数据类型:

julia> x = √Complex(-1)0.0 + 1.0im

是不是发现新大陆了?在其余的编程语言里,对 -1 开根号必然是报错的,然而在 Julia 里,居然支持虚数单位,这个特性已经可以决定 Julia 必然在科学计算领域里能大有作为。同样的,还有少量常规语言不具有的概念性的东西:

julia> x = 1 / Inf0.0julia> y = 0 * InfNaN

在这里的 Inf 就是无穷大(也有负无穷大),而 NaN 即是表示 并非是一个数字(Not a Number)。这些概念的引入,使得 Julia 更加适合被用在科学计算上。当然了,Julia 所包含的并不仅仅有这些概念而已,通过查阅手册,可以理解到更多的令人激动的特性(点此查阅手册)。


下面也要尝试一下,Julia 对于常规编程的支持能否友好,我选择的是网络请求和 JSON 解析的能力。

Julia 已拥有很多第三方库,可以直接在包管理工具内进行安装,默认是不安装的。在安装的过程中,也有可能会出现问题,多是由于国内网络的问题,导致少量包无自法下载,请自行寻觅处理方案。在网络完备的前提下,使用以下命令可以完成对网络请求库,以及 JSON 解析库的安装:

julia> using Pkgjulia> Pkg.add("HTTP")julia> Pkg.add("JSON")julia> Pkg.build("MbedTLS")

而后只要要一点点代码,就能完成一个简易的请求了:

using HTTPusing JSONhttpRequest(url, cb) = (    ret = HTTP.request("GET", url);    cb(ret.status, String(ret.body)))httpRequest("http://httpbin.org/ip", (code, body) -> (    println(code);    println(body);    json = JSON.parse(body);    ip = json["origin"];    println(ip)))

可以很明确的看到,Julia 和 Kotlin 一样,都把函数视为一等公民,并且 Julia 更智能,并不需要传入函数的定义。在这一点是,是仁者见仁的,由于这样的特性存在,也强迫我们必需写较多的注释,否则后期自己的代码都无法维护了。


本地化编译,这是一个非常有用的特性,可以让执行效率变得更高,同时更容易分发软件。在 Julia 里做本地化编译目前还是有少量麻烦的,官方提供的编译工具并不那么好用,如下:

julia> using Pkgjulia> Pkg.add("PackageCompiler")julia> using PackageCompilerjulia> build_executable("sample.jl")

这两句代码在一开始绝对会让你体会到什么叫生不如死,由于编译时会报错:

ERROR: Unexpected format of "Base.julia_cmd()", you may be using an incompatible version of Julia

查了一下 github 的提交记录,发现最新的 PackageCompiler 0.6.0 已经可以适配 Julia 1.1 了,然而我们通过 Pkg 安装来的 PackageCompiler 却是 0.5.1 的,必需先进行更新:

julia> ]pkg> stpkg> up PackageCompiler

此时即可以把 PackageCompiler 更新到最新版本,可以进行编译了,切记,在编译前重启 REPL,否则加载到的仍然是老版本的包。

对于 Julia 来说,要编译一个本地化应用,需要一个与 C 一致的 main 函数,作为程序的执行入口,所以我们可以把代码修改成这样:

module GetIPimport HTTPimport JSONhttpRequest(url, cb) = (    ret = HTTP.request("GET", url);    cb(ret.status, String(ret.body)))Base.@ccallable function julia_main(ARGS::Vector{String})::Cint    httpRequest("http://httpbin.org/ip", (code, body) -> (        json = JSON.parse(body);        ip = json["origin"];        println(ip)    ))    return 0endend

而后在 Julia 命令行下进行编译即可以了:

julia> using PackageCompilerjulia> build_executable("sample.jl")

经过漫长的等待(至少1分钟),即可以看到本来可执行程序已生成。就目前来看,编译效率实在是非常低,并且在编译结果中还带有一大堆的依赖库,对发布程序造成少量不便。

不过不管如何,我们已经成功上手了 Julia,可以使用它来做少量开发了,比较看重它的跨平台特性(尽管还没体验到)以及对科学计算的能力,同样的,极其方便的代码编写方式,良好的语言胶水特性,也是非常到位的继续使用的理由。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Julia,新语言开箱的两三事

发表回复