Julia,新語言開箱的兩三事

或許你根本沒聽說過還有這么一門語言丧慈,我也是最近才接觸到它析命,瞬間就被它的高效簡潔所吸引,這里所指的高效逃默,同時包含了編碼與執(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ù)使用的理由调煎。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市己肮,隨后出現(xiàn)的幾起案子士袄,更是在濱河造成了極大的恐慌恐疲,老刑警劉巖撮珠,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缩筛,死亡現(xiàn)場離奇詭異岂座,居然都是意外死亡笤受,警方通過查閱死者的電腦和手機(jī)仆抵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門架曹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莫杈,“玉大人诱鞠,你說我怎么就攤上這事挎挖。” “怎么了航夺?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵蕉朵,是天一觀的道長。 經(jīng)常有香客問我敷存,道長墓造,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任锚烦,我火速辦了婚禮觅闽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涮俄。我一直安慰自己蛉拙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布彻亲。 她就那樣靜靜地躺著孕锄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪苞尝。 梳的紋絲不亂的頭發(fā)上畸肆,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機(jī)與錄音宙址,去河邊找鬼轴脐。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的大咱。 我是一名探鬼主播恬涧,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碴巾!你這毒婦竟也來了溯捆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤厦瓢,失蹤者是張志新(化名)和其女友劉穎提揍,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煮仇,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碳锈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了欺抗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片售碳。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绞呈,靈堂內(nèi)的尸體忽然破棺而出贸人,到底是詐尸還是另有隱情,我是刑警寧澤佃声,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布艺智,位于F島的核電站,受9級特大地震影響圾亏,放射性物質(zhì)發(fā)生泄漏十拣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一志鹃、第九天 我趴在偏房一處隱蔽的房頂上張望夭问。 院中可真熱鬧,春花似錦曹铃、人聲如沸缰趋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秘血。三九已至,卻和暖如春评甜,著一層夾襖步出監(jiān)牢的瞬間灰粮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工忍坷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粘舟,地道東北人红柱。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蓖乘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子韧骗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 文/芳菲晚 早就想吐槽我家那位了嘉抒。不是正趕上這個活動嘛,誰讓身邊隨手一抓就是素材袍暴?那就名正言順些侍,敞開心懷吐一回,直...
    芳菲晚閱讀 638評論 77 46
  • 夜深了政模,白天的工作已經(jīng)結(jié)束了岗宣,在這個陌生的城市人們習(xí)慣很晚才睡去,我想也許是因為只有這樣他們才能感覺自己還為自己活...
    麥索閱讀 234評論 0 0