Julia,新语言开箱的两三事

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

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


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

julia> x = 3
julia> y = 2x^2 + 3x - 1
julia> println(y)
julia> z = √2
julia> 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 / Inf
0.0
julia> y = 0 * Inf
NaN

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


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

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

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

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

using HTTP
using JSON

httpRequest(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 Pkg
julia> Pkg.add("PackageCompiler")
julia> using PackageCompiler
julia> 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> st
pkg> up PackageCompiler

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

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

module GetIP

import HTTP
import JSON

httpRequest(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 0
end

end

然后在 Julia 命令行下进行编译就可以了:

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容

  • 文/芳菲晚 早就想吐槽我家那位了。不是正赶上这个活动嘛,谁让身边随手一抓就是素材?那就名正言顺,敞开心怀吐一回,直...
    芳菲晚阅读 642评论 77 46
  • 夜深了,白天的工作已经结束了,在这个陌生的城市人们习惯很晚才睡去,我想也许是因为只有这样他们才能感觉自己还为自己活...
    麦索阅读 235评论 0 0