「全新」程式語言 Julia開箱體驗

2021-01-14 CodeSheep


本文共 1540字,閱讀大約需要 5分鐘,文末有計時器可自行對時

Julia 是一個 「全新」的高性能動態程式語言,前兩天迎來了其 1.0 正式版的重大更新。Julia集 Python、C、R、Ruby 之所長,感覺就像一種腳本語言,並且對交互式使用有很好的支持。而且其天生的高性能、通用性與專業性使得其非常適用於科學數值計算、機器學習項目等前沿場景。我看完這個消息以後也迫不及待想嘗試一下。

註: 本文首發於 My 公眾號 CodeSheep ,可 長按 或 掃描 下面的 小心心 來訂閱 ↓ ↓ ↓

本文內容腦圖如下:

高性能:Julia 通過 LLVM 為多個平臺編譯高效本地代碼,性能很高

動態性:編程範式靈活,代碼信噪比極高

通用性:易於表達OOP和函數式編程範式,並且其標準庫提供異步I / O,進程控制,日誌記錄,概要分析,包管理器等。

專業性:擅長數值計算,支持許多數值數據類型,並且提供開箱即用的並行性。

可組合性:Julia 的包之間可以很好地協同工作。

正是由於這些特性,才使其應用場景寬泛,而且都是當下前沿熱門應用場景:

Julia通過提供了一系列插件支持,從而可以在大多數常見的編輯器中進行編程,具體包括

Atom

VS Code

Jupyter

Vim

Emacs

SublimeText

Julia 提供了各種平臺和環境的安裝包,具體可以去其官網進行下載:

安裝非常簡單,像 Windows平臺,基本上只需要點按下一步即可安裝到位,而 MacOS平臺使用 brew包管理器也僅需 一行命令 即可完成安裝。

下面我以 Linux CentOS 7.4 平臺為例,介紹一些其安裝過程:

CentOS7 上 Julia 安裝也無需複雜的過程,只需要下載對應的可執行版本,並置於系統的命令路徑中即可愉快的使用:

wget https://julialang-s3.julialang.org/bin/linux/x64/1.0/julia-1.0.0-linux-x86_64.tar.gz

tar zxvf julia-1.0.0-linux-x86_64.tar.gz

cd /usr/bin

ln -s /root/julia-1.0.0/bin/julia

此時執行 julia 命令即可啟動 Julia控制臺,順便來向世界問一下好吧:

下面做一些上手實驗,大致來感受一下該語言精煉、靈活的風格。即使不使用任何文字說明,也能很容易地理解各個命令的含義,這也說明該語言很好上手。

julia> x=10

10

julia> x+1

11

julia> x^2

100

julia> pi

π = 3.1415926535897...

julia> sqrt(100)

10.0

julia> ~123

-124

julia> 123 & 234

106

julia> ~UInt32(123)

0xffffff84

julia> [1,2,3] .^ 3

3-element Array{Int64,1}:

 1

 8

27

julia> 1 == 1

true

julia> NaN == NaN

false

julia> NaN != NaN

true

julia>

julia> 'x'

'x': ASCII/Unicode U+0078 (category Ll: Letter, lowercase)

julia> Int('x')

120

julia> str = "Hello, world.\n"

"Hello, world.\n"

julia> str[1]

'H': ASCII/Unicode U+0048 (category Lu: Letter, uppercase)

julia> str[end]

'\n': ASCII/Unicode U+000a (category Cc: Other, control)

julia> str[4:9]

"lo, wo"

julia> greet = "Hello"

"Hello"

julia> whom = "world"

"world"

julia> "$greet, $whom.\n"

"Hello, world.\n"

julia> findfirst(isequal('x'), "xylophone")

1

julia> findnext(isequal('o'), "xylophone", 1)

4

julia> findnext(isequal('o'), "xylophone", 5)

7

julia> findnext(isequal('o'), "xylophone", 8)

julia> occursin("world", "Hello, world.")

true

julia> repeat(".:Z:.", 10)

".:Z:..:Z:..:Z:..:Z:..:Z:..:Z:..:Z:..:Z:..:Z:..:Z:."

julia> occursin(r"^\s*(?:#|$)", "not a comment")

false

julia> occursin(r"^\s*(?:#|$)", "# a comment")

true

julia> match(r"^\s*(?:#|$)", "# a comment")

RegexMatch("#")

julia> x = 12

12

julia> typeof(x)

Int64

julia> convert(UInt8, x)

0x0c

julia> convert(AbstractFloat, x)

12.0

julia> a = Any[1 2 3; 4 5 6]

2×3 Array{Any,2}:

1  2  3

4  5  6

julia> convert(Array{Float64}, a)

2×3 Array{Float64,2}:

1.0  2.0  3.0

4.0  5.0  6.0

julia> promote(1, 2.5)

(1.0, 2.5)

julia> promote(2, 3//4)

(2//1, 3//4)

julia> promote(1.5, im)

(1.5 + 0.0im, 0.0 + 1.0im)

julia> promote(1 + 2im, 3//4)

(1//1 + 2//1*im, 3//4 + 0//1*im)

julia> f(x,y) = x + y

f (generic function with 1 method)

julia> f(2,3)

5

julia> g = f

f (generic function with 1 method)

julia> g(2,3)

5

julia> ∑(x,y) = x + y

∑ (generic function with 1 method)

julia> ∑(2, 3)

5

julia> +(1,2,3)

6

julia> x -> x^2 + 2x - 1

#3 (generic function with 1 method)

julia> map(x -> x^2 + 2x - 1, [1,3,-1])

3-element Array{Int64,1}:

 2

14

-2

julia> function foo(a,b)

               a+b, a*b

         end;

julia> foo(2,3)

(5, 6)

julia> x, y = foo(2,3);

julia> x

5

julia> y

6

julia> z = begin

        x = 1

        y = 2

        x + y

      end

3

julia> function test(x, y)

        if x < y

          println("x is less than y")

        elseif x > y

          println("x is greater than y")

        else

          println("x is equal to y")

        end

      end

test (generic function with 1 method)

julia> test(1, 2)

x is less than y

julia> test(2, 1)

x is greater than y

julia> test(1, 1)

x is equal to y

julia> println(x < y ? "less than" : "not less than")

less than

julia> while i <= 5

        println(i)

        i += 1

      end

1

2

3

4

5

julia> for i = 1:5

        println(i)

      end

1

2

3

4

5

外部構造方式:

julia> struct Foo

          bar

          baz

      end

julia>

julia> fun=Foo(1,2)

Foo(1, 2)

julia> fun.bar

1

julia> fun.baz

2

julia> Foo(x) = Foo(x,x)

Foo

julia> Foo(1)

Foo(1, 1)

julia> Foo() = Foo(0)

Foo

julia> Foo()

Foo(0, 0)

內部構造方式:

julia> struct OrderedPair

          x::Real

          y::Real

          OrderedPair(x,y) = x > y ? error("out of order") : new(x,y)

      end

julia>

julia> OrderedPair(1, 2)

OrderedPair(1, 2)

julia> OrderedPair(2,1)

ERROR: out of order

Stacktrace:

[1] error(::String) at ./error.jl:33

[2] OrderedPair(::Int64, ::Int64) at ./REPL[45]:4

[3] top-level scope at none:0

迭代操作:

julia>  struct Squares

              count::Int

      end

julia> Base.iterate(S::Squares, state=1) = state > S.count ? nothing : (state*state, state+1)

julia> for i in Squares(7)

                 println(i)

      end

1

4

9

16

25

36

49

julia> 25 in Squares(10)

true

julia> using Statistics

julia> mean(Squares(100))

3383.5

julia> std(Squares(100))

3024.355854282583

julia> Base.eltype(::Type{Squares}) = Int

julia> Base.length(S::Squares) = S.count

julia> collect(Squares(4))

4-element Array{Int64,1}:

 1

 4

 9

16

索引操作:

julia> function Base.getindex(S::Squares, i::Int)

              1 <= i <= S.count || throw(BoundsError(S, i))

              return i*i

      end

julia> Squares(100)[23]

529

julia> Base.firstindex(S::Squares) = 1

julia> Base.lastindex(S::Squares) = length(S)

julia> Squares(23)[end]

529

julia> Base.getindex(S::Squares, i::Number) = S[convert(Int, i)]

julia> Base.getindex(S::Squares, I) = [S[i] for i in I]

julia> Squares(10)[[3,4.,5]]

3-element Array{Int64,1}:

 9

16

25

基本的語言特性就體驗到這,剩餘的還有一些高級特性,包括:

不在此文一一贅述,詳細了解就去參考官方文檔吧。

由於能力有限,若有錯誤或者不當之處,還請大家批評指正,一起學習交流!

如果有興趣,也可以抽時間看看作者關於容器化、微服務化方面的文章:

作者更多 務實、能看懂、可復現的 原創文章盡在公眾號 CodeSheep,歡迎訂閱 ⬇️⬇️⬇️


你花了   ·  來閱讀

點個  再走吧~ 


去簡書讀原文↓             ↓點個讚唄


相關焦點

  • Julia程式語言助力天氣/氣候模式
    在2018年8月8日,MIT正式發布程式語言Julia 1.0,號稱:Python、R、C++三合一。Julia 語言的官網:https://julialang.org/Julia中文社區:https://cn.julialang.org/Julia 語言項目地址:https://github.com/JuliaLangMIT 開發的 Julia 語言是全球熱度上升最快的程式語言之一,下載量超過
  • Julia程式語言:地球物理研究的新選擇
    Julia是一種新的程式語言,一種函數式程式語言,一種面向科學技術計算的高性能動態高級程序設計語言。Julia程式語言具有通用、動態、快速、開源、易於使用等特點。Julia程式語言設計項目大約開始於2009年中,由麻省理工學院(MIT)計算機科學與人工智慧實驗室(CSAIL)研發和發布,Julia語言的主要創造者包括Viral Shah博士、Alan Edelman教授、Jeff Bezanson博士和Stefan Karpinski。
  • MIT正式發布程式語言Julia 1.0:Python、R、C++三合一
    它是像 Python 一樣有用的通用程式語言,像 R 語言一樣便於統計的語言,像 Perl 一樣自然的字符串處理語言,像 Matlab 一樣強大的線性代數語言,也是像 shell 一樣的「膠水語言」。它簡單易學,卻能讓嚴苛的黑客們為之傾心。我們希望它兼具交互性和可編譯性。
  • 史上最強科學計算程式語言?| 麻省理工的Julia
    首先科普一下什麼是「Julia」的高性能動態程式語言」  ,Julia是一個新的高性能動態高級程式語言。語法和其他程式語言類似,易於其他語言用戶學習。Julia擁有豐富的函數庫,提供了數字精度、精緻的增幅 器(sophisticated amplifier)和分布式並行運行方式。
  • 程式設計師為什麼愛用Julia語言?這裡有五點理由
    Julia是一種免費的現代高級程式語言,於2012年正式發布。作為程式語言大家族中的年輕一員,Julia提供了許多令人眼前一亮的功能和特性。 作為程式設計師,為什麼選擇使用Julia?任何一種程式語言永遠不會是完美的,而且永遠不可能成為一個最終確定的產品,而是會隨著時間的推移不斷變化和發展。本文在此分享程式設計師學習Julia程式語言的五個理由。
  • Julia到底是怎樣的一個程式語言?它的可否媲美matlab?
    Julia到底是怎樣的一個程式語言?它的可否媲美matlab?Julia 是一個面向科學計算的高性能動態高級程序設計語言。其語法與其他科學計算語言相似。在許多情況下擁有能與編譯型語言相媲美的性能。Julia 是個靈活的動態語言,適合科學和數值計算,性能可與傳統靜態類型語言媲美。一群擁有各種語言豐富編程經驗的Matlab高級用戶,對現有的科學計算編程工具感到不滿——這些軟體對自己專長的領域表現得非常棒,但在其它領域卻非常糟糕。
  • 關於程式語言 Julia,開發團隊有這些想告訴你
    (點擊上方公眾號,可快速關注)轉自:開源中國社區程式語言排行榜每月都有,排名前 10
  • Julia:世界上知名的大公司都在使用這款新的程式語言!
    程式語言可謂種類繁多;數學家、研究人員和數據科學家面臨的一大問題常常是,找到實際上適合手頭處理的任何任務的某一種語言。為了避免困難,總部位於孟加拉國和美國的初創公司Julia Computing的幾位聯合創始人開發出了一種通用程式語言:Julia,不是程式設計師的人經過培訓就能使用這種語言。
  • Julia 1.6.0 發布!超高性能動態高級程式語言
    Julia 是一個高性能動態高級程式語言。其擁有豐富的函數庫,提供了數字精度、精緻的增幅器和分布式並行運行方式。核心函數庫等大多數庫由 Julia 編寫,但也用成熟的 C 和 FORTRAN 庫來處理線性代數、隨機數產生和字符串處理等問題。
  • Julia(建設者)
    例如:julia> struct Foobarbazendjulia> foo = Foo(1, 2)Foo(1, 2)julia> foo.bar1julia> foo.baz2對於許多類型,創建實例只需通過將其欄位值綁定在一起來形成新對象。
  • 程式語言中的快樂天使——Ruby
    在編程世界,竟然存在一種程式語言肆無忌憚地公然挑戰程式設計師這個終極問題:「編碼的時候,你快樂嗎?」而這門語言有一個很好聽的名字叫 Ruby。當你聽到Ruby這個名字你第一個想到誰?是她?還是她?(開個玩笑啦)其實說到程式語言,程序世界裡有著種類繁多的語言。這些語言誕生的緣由多種多樣,有的是為了編寫運行速度快的程序,有的是為了可以在短時間內編寫程序,有的是為了讓程序只需編寫一次就可以在任何環境中運行,有的是為了使小孩也能進行簡單編程,等等。但是,似乎並沒有哪個語言積極地宣稱其目的是快樂編程。這可能是由於各個語言的設計者並沒有認真考慮過讓任何人都可以編程吧。
  • 單片機程式語言的比較
    例如,懂得彙編語言指令就可以使用在片內ram作變量的優勢,因為片外變量需要幾條指令才能設置累加器和數據指針進行存取。同樣的,當要求使用浮點數和啟用函數時也只有具備彙編編程經驗才能避免生成龐大的、效率低的程序,對於這方面的編程,沒有彙編語言是做不到的。
  • 多面程式語言Scala
    在我掌握的眾多程式語言之中,Scala無疑是其中最讓我感到舒適的,如Scala官網宣稱的:「Object-OrientedMeetsFunctional」,這一句當屬對Scala最抽象的精準描述,它把近二十年間大行其道的面向對象編程與舊而有之的函數式編程有機結合起來,形成其獨特的魔力。不知你是否看過梁羽生的著作《絕塞傳烽錄》?
  • 體驗一堂編程課 編程貓聯合新華網、光華基金會發起「編程未來...
    近日,教育部稱已制定相關專門文件推動和規範編程教育發展,培養培訓編程教育方面的師資,將編程等信息技術內容納入中小學相關課程。此消息又一次讓編程教育成為大眾關注的焦點。為順應人工智慧時代趨勢,響應國家號召,推進我國編程教育的普及,2020年12月,由編程貓、新華網聯合主辦,中國光華科技基金會支持的「編程未來」全球公益活動,即將開始,旨在鼓勵全民體驗或創作編程作品。  據了解,「編程未來」是一項致力於介紹程式語言、普及編程思維,並對所有人開放的全球性公益活動。此公益活動對於參與者沒有任何要求,任何職業、年齡的人都可以免費參與。
  • 單片機的程式語言:彙編語言、C語言、PL/M和BASIC語言
    單片機的程式語言很多,目前常見的程式語言有4種,即彙編語言、C語言、PL/M和BASIC語言。下面我們來介紹一下吧:一、BASIC程式語言BASIC是一種高級語言,它的英文含義是「初學者通用符號指令代碼」,是在1965年5月,由美國科學家託馬斯•庫爾茲研製出來的。10多年後,微軟公司把它移植到微型機上。
  • 程式語言之父談語言設計,龜叔大讚TypeScript
    之所以說是娛樂活動,因為這些爭論到最後往往只是各自在發洩情緒,再則就是,脫離使用場景去討論所謂哪門語言更好並沒意義。但如果讓程式語言作者坐在一起討論程式語言會產生怎樣的反應,水平是否會比我們高到不知哪裡去?
  • 邏輯式程式語言極簡實現(使用C#) - 1. 邏輯式程式語言介紹
    本系列將儘可能簡潔地說明邏輯式編程語音的原理,並實現一門簡單的邏輯式程式語言。考慮到C#的用戶較多,因此選擇用C#來實現。實現的這門語言就叫NMiniKanren。文章總體內容如下:NMiniKanren語言介紹NMiniKanren運行原理實現NMiniKanren故事從兩個正在吃午餐的程式設計師說起。
  • 程式語言學哪個比較好?2019年最實用的程式語言
    學習編程關鍵是要找到一種合適的語言,那麼程式語言那麼多,該如何選擇?下面萬古網校小編為大家分享一篇關於程式語言選擇的文章,希望能給你帶來幫助!第一大類語言包括Java、C、Python和C++。這類語言都是非常通用的語言,它們並不局限於特定的編程平臺或用途。
  • TIOBE:2019年1月全球程式語言榜單 C 獲得「2019 年度程式語言」稱號
    TIOBE 公布了 2020 年最新一期的程式語言排行榜。上個月我們預測 Java, C, Python 和 C# 將有機會獲得「年度程式語言」稱號,現在結果已公布,相信出乎很多人意料 —— 古老的 C 語言了榮獲 2019 年度程式語言稱號。
  • 程式語言「木蘭」被指套殼造假
    近日,國產程式語言「木蘭」被質疑套殼Python引發熱議。19日,中科院計算所發布「關於『木蘭』語言問題處理情況的說明」(以下簡稱「說明」)。  「說明」中稱,近日,網上出現質疑「木蘭」語言的信息。我所獲知這一情況後高度重視。