或許你根本沒聽說過還有這么一門語言丧慈,我也是最近才接觸到它析命,瞬間就被它的高效簡潔所吸引,這里所指的高效逃默,同時包含了編碼與執(zhí)行兩層含義鹃愤。我曾經(jīng)非常想在 Java 或 Kotlin 內(nèi)直接書寫數(shù)學(xué)公式,因此也學(xué)習(xí)了 MPS 等奇怪的東西笑旺,比如說這樣的(圖片來源為 JetBrains MPS Intro):
雖然在這種情況下寫代碼的確是累了點(diǎn),但是效果很好馍资,能夠很直觀的看出來想要做的事情筒主。
當(dāng)用上 Julia 之后,就可以直接扔掉 MPS 了鸟蟹,你可以用很簡單的方式乌妙,在 Julia 里編寫數(shù)學(xué)公式:
julia> x = 3
julia> y = 2x^2 + 3x - 1
julia> println(y)
julia> z = √2
julia> println(z)
寫個根號都那么任性!
既然要拿它來進(jìn)行開發(fā)了建钥,那自然逃不了搭建開發(fā)環(huán)境等事藤韵。好在 Julia 提供了非常簡單搭建手冊,直接照做就行了(點(diǎn)擊查閱)熊经。
搭過一遍后泽艘,我發(fā)現(xiàn)我這種 Idea 黨完全用不慣 Atom欲险,還是更加傾向于在 Idea 里直接搭建。不得不說匹涮,JetBrains 全家桶真的是萬能的天试,直接就找到了 Julia 的插件:
安裝后只需要配置 Julia 的可執(zhí)行程序路徑即可,比如說在 Mac 下是 /Applications/Julia-x.y.app/Contents/Resources/julia/bin/julia
然低。于是環(huán)境就搭好了喜每,可以愉快的玩耍了。
對于我來說雳攘,學(xué)習(xí)一門新的語言带兜,我都會從它的特性開始入手,比如說特定的數(shù)據(jù)類型:
julia> x = √Complex(-1)
0.0 + 1.0im
是不是發(fā)現(xiàn)新大陸了吨灭?在其他的編程語言里刚照,對 -1 開根號必然是報錯的,然而在 Julia 里沃于,居然支持虛數(shù)單位涩咖,這個特性已經(jīng)可以決定 Julia 必然在科學(xué)計算領(lǐng)域里能大有作為。同樣的繁莹,還有一些常規(guī)語言不具備的概念性的東西:
julia> x = 1 / Inf
0.0
julia> y = 0 * Inf
NaN
在這里的 Inf 就是無窮大(也有負(fù)無窮大)檩互,而 NaN 即是表示 并非是一個數(shù)字(Not a Number)
。這些概念的引入咨演,使得 Julia 更加適合被用在科學(xué)計算上闸昨。當(dāng)然了,Julia 所包含的并不僅僅有這些概念而已薄风,通過查閱手冊饵较,可以了解到更多的令人激動的特性(點(diǎn)此查閱手冊)。
下面也要嘗試一下遭赂,Julia 對于常規(guī)編程的支持是否友好循诉,我選擇的是網(wǎng)絡(luò)請求和 JSON 解析的能力。
Julia 已擁有很多第三方庫撇他,可以直接在包管理工具內(nèi)進(jìn)行安裝茄猫,默認(rèn)是不安裝的。在安裝的過程中困肩,也有可能會出現(xiàn)問題划纽,多是因為國內(nèi)
網(wǎng)絡(luò)的問題,導(dǎo)致一些包無自法下載锌畸,請自行尋找解決方案勇劣。在網(wǎng)絡(luò)完備的前提下,使用以下命令可以完成對網(wǎng)絡(luò)請求庫潭枣,以及 JSON 解析庫的安裝:
julia> using Pkg
julia> Pkg.add("HTTP")
julia> Pkg.add("JSON")
julia> Pkg.build("MbedTLS")
然后只需要一點(diǎn)點(diǎn)代碼比默,就能完成一個簡易的請求了:
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 一樣,都把函數(shù)視為一等公民退敦,并且 Julia 更智能粘咖,并不需要傳入函數(shù)的定義。在這一點(diǎn)是侈百,是仁者見仁的瓮下,因為這樣的特性存在,也強(qiáng)迫我們必須寫較多的注釋钝域,否則后期自己的代碼都無法維護(hù)了讽坏。
本地化編譯,這是一個非常有用的特性例证,可以讓執(zhí)行效率變得更高路呜,同時更容易分發(fā)軟件。在 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 的提交記錄笙蒙,發(fā)現(xiàn)最新的 PackageCompiler 0.6.0
已經(jīng)可以適配 Julia 1.1
了抵屿,然而我們通過 Pkg 安裝來的 PackageCompiler 卻是 0.5.1
的,必須先進(jìn)行升級:
julia> ]
pkg> st
pkg> up PackageCompiler
此時就可以把 PackageCompiler 升級到最新版本捅位,可以進(jìn)行編譯了轧葛,切記,在編譯前重啟 REPL艇搀,否則加載到的依然是老版本的包尿扯。
對于 Julia 來說,要編譯一個本地化應(yīng)用焰雕,需要一個與 C 一致的 main 函數(shù)衷笋,作為程序的執(zhí)行入口,所以我們可以把代碼修改成這樣:
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 命令行下進(jìn)行編譯就可以了:
julia> using PackageCompiler
julia> build_executable("sample.jl")
經(jīng)過漫長的等待(至少1分鐘)矩屁,就可以看到原本可執(zhí)行程序已生成辟宗。就目前來看,編譯效率實在是非常低档插,并且在編譯結(jié)果中還帶有一大堆的依賴庫慢蜓,對發(fā)布程序造成一些不便亚再。
不過不論如何郭膛,我們已經(jīng)成功上手了 Julia,可以使用它來做一些開發(fā)了氛悬,比較看重它的跨平臺特性(雖然還沒體驗到)以及對科學(xué)計算的能力则剃,同樣的耘柱,極其方便的代碼編寫方式,良好的語言膠水特性棍现,也是非常到位的繼續(xù)使用的理由调煎。