由麻省理工學院電腦科學與人工智慧實驗室開發的新語言!
下載量超過兩百萬次,Google、Facebook和美國聯邦航空總署的開發者都在用!
全台第一本Julia操作學習教科書,只有這本,帶0基礎的你從頭開始學Julia!
第二版的增修與Julia官方同步更新,本書帶你永遠走在最前面。
全球熱度上升最快的程式語言,趕快一起來追程式語言新女神!!
大數據時代,科技的進展速度早已遠遠超越我們的學習速度,因此,只有不斷的學習最新的知識和技能,才不會在大數據的浪潮之中狠狠摔在沙灘上。如果你今年只打算學習一個新語言,我會毫不猶豫的推薦──Julia!
用於優化數據分析和深度學習的最佳語言已經誕生!
◣Matlab般強大的線性代數運算能力,而且免費!
◣Python般簡潔的語法系統,而且更快速!
◣與C語言一樣快速,而且更加容易上手!
本書為全台第一本Julia操作學習教科書,作者為資料科學專家,同時擁有豐富的教學推廣經驗,最了解初學者需要的講解方式,在寫作上使用螺旋教學法,幫助讀者在最短時間建立對Julia的掌握與運用能力。先從介紹Julia這個語言的特性和安裝步驟開始,接著針對資料型別、變數、註解與函式等進行基礎性的介紹,後續再分別以各個主題加以深入探討以及實作演練。作者將程式步驟一一拆開,一步一步的解析,讓你也能輕鬆跟著踏入新世代程式語言的精采世界。
第二版加入遞迴、例外處理、資料結構與泛型程式設計等全新章節,並重新編排章節及內容,讓學習更為流暢。
Julia,為資料科學而生。
作者簡介:
杜岳華
Julia Taiwan 發起人,陽明大學生物醫學資訊所碩士,成功大學醫學檢驗生物技術學系及資訊工程學系雙主修,工研院人才培訓中心機器學習課程講師。熱愛數學、電腦科學及自然科學,希望成為計算生物學家,為開源軟體貢獻者。
胡筱薇
基督徒,Data Lab創辦人,為中央大學資訊管理所博士,美國普渡大學克蘭納特管理學院訪問學者;現為東吳大學巨量資料管理學院副教授,且擔任台灣人工智慧學校講座師資;機器學習、資料探勘、社群網路、智慧商業為主要研究項目;近年來,致力於協助企業建立數據團隊並培育資料科學人才。
章節試閱
Chapter 1 Julia 是什麼樣的程式語言?
1. 程式語言
世界上的程式語言有上千種,但是最常用的、耳熟能詳的不過是其中的少數。程式語言可以說是現代工程師的最佳武器,舉凡從網頁設計到後端系統設計,甚至是資料庫或是作業系統,都是藉由程式語言來完成的。在網頁設計中可能會用到 Javascript,以及後端的PHP。如果是要寫 Microsoft 系列或是在 Windows 上跑的程式,會需要 C# 或是 ASP.NET 架構的幫忙。要撰寫可以在 Mac 上執行的程式會需要 Swift。如果是寫 Android 系列的 app 就需要熟悉Java。
如今資料分析跟機器學習的人會使用Python、MATLAB 或是R。操作資料庫會需要 SQL 語言。不要忘了效能極佳的 C 和C++,這兩個語言對於作業系統發展有極大的貢獻。在作業系統上,需要有可以跟系統互動的語言,像是 Linux 系統上就有Bash。
程式語言就是一個非常強大的計算機,一般計算機只能計算單一的數學式,工程用計算機可以計算更複雜的微積分,而程式語言可以處理的範圍超乎你的想像,我們可以利用程式語言設計出任何的軟體。
2. Julia 語言介紹
Julia是個新興的程式語言,由Jeff Bezanson, Stefan Karpinski,Viral B. Shah, and Alan Edelman 四人共同設計,在2009年開始這個專案,並在 2012年發表。他們希望打造一個這樣的程式語言:我們想要一個開源的語言,擁有自由的版權。我們想要C的速度和Ruby 的動態。我們想要有一個語法與內在表示有一致性(homoiconic)的語言,並且像 Lisp 一樣擁有真的巨集,但是擁有像Matlab 一樣熟悉好懂的數學符號。我們也想要像Python一樣好用的泛用型程式語言,處理統計要和 R 一樣,處理字串要和Perl一樣地自然,要有和Matlab一樣強大的線性代數功能,串接程式要如同shell一樣好用。要學習的東西極致簡單,同時能讓大多數認真的程式設計師寫起來開心。我們希望它是互動式的而且也是可編譯的。
在 2017 JuliaCon年會中,發表了Celeste專案,專案主要是協助在太空照片中尋找星系,分析了 178 TB 的太空影像資料,在僅僅14.6 分鐘當中,分辨 1.88 億個太空物件,這個專案完全以 Julia 語言寫成,並使用了一千三百萬個執行行序,最高效能達到了 1.54 千兆浮點運算(petaFLOPS)的極致表現。Julia 的巔峰效能讓他與C、C++ 和Fortran同為千兆浮點數運算的一員。達成這樣的成果主要是結合了了複雜的平行運算排程演算法還有最佳化單核心的計算效能,單核心的計算效能與前一個版本相比增進了約1,000倍。
3. Julia是個怎麼樣的語言?
Julia語言最大的特色就是他同時兼具高效能與高階的語法。"Write like Python, run like C." 更是他的代名詞。高效能是 Julia 語言的品質保證,在科學運算上,有極大的需求,無論是要計算複雜的科學方程式,還是處理統計模型,或是處理數據量極大的運算。人類都在追求更高效能的運算方式,有的人從演算法的改進下手,有的人從硬體的效能下手,少數人從編譯器的技術下手。Julia 就是一個藉由語言設計及編譯器技術上取得成功的最佳典範。
Julia 語言的初衷是為了科學運算,但是他的適用範圍不僅僅是科學運算,從資料處理到經濟學模型,從網站開發到嵌入式系統,甚至是自己設計一個程式語言,都有他的蹤跡。Julia語言已經是一個泛用型語言(general purpose language),就如同其他高階語言一樣,其他語言做得到的他也做得到。
Julia語言非常專注在數值運算上,使用者大多是來自不同領域的專家,所以對於不同領域專家的友善程度是非常重要的,增進程式的可讀性可以大大提高對非電腦科學專業者的友善程度。提高可讀性成為程式設計的重要一環,希望讓各領域專業人員都可以讀懂程式的內涵。
程式語言上,有不同的程式寫作風格,這稱為程式設計典範(paradigm),像是物件導向程式設計(object-oriented programming)、函數式程式設計(functional programming)、邏輯式程式設計(logic programming)、泛型程式設計(generic programming)等等典範。 Julia語言支援多典範 (multiparadigm)的程式設計風格,他支援基於多重分派(multiple d i s p a t c h )的(類)物件導向程式設計、程序式程式設計(p r o c e d u r a l p r o g r a m m i n g)、函數式程式設計與metaprogramming,本書後續會一一介紹。
內建有套件管理器是Julia語言的一大特色,以往的程式語言需要額外安裝套件管理器,並且透過套件管理器來安裝及移除所需要的套件,甚至有些語言不具備套件管理器,需要自行管理安裝的套件,這會給使用者帶來非常大的不便。內建套件管理器可以提供使用者在安裝及移除套件上的便利性,查詢套件也變得非常方便。內建套件管理器的設置是整個語言生態系非常重要的基石,在整個語言及套件的發展上,可以相當快速的讓使用者找到他們需要的套件,並促進整體發展。
Julia語言在一開始的設計上就考慮了了平行運算,他讓使用者可以非常簡單的將程式平行化。平行運算與分散式運算是Julia語言的核心功能之一,優雅的語法設計讓使用者可以善用執行行序及行程進行平行運算,並且內建叢集管理器讓使用者可以簡單地達成分散式運算。
Julia適合我嗎?
Julia適合以下這幾種人:
• 高度需要密集運算的人
• 需要設計複雜的演算法的人
• 需要高度平行運算或是分散式運算的人
• 希望從零開始設計系統的人
Julia與Python的不同之處?
Julia 與 Python,兩種程式語言在資料科學領域各有千秋,以下我們為大家做個綜合比較。
Julia與Python的區別[1]
1. Julia索引的下標是從1開始,而不是從0開始。
2. 索引列列表和數組的最後一個元素,Julia使用結束end,Python使用-1
3. for,if,while...等塊的結尾需要end,但不強制要求縮進排版。
4. Julia沒有分行語法支援:如果在一行的結尾,輸入已經是個完整的表達式,就會直接執行,或是繼續等待輸入。
Julia相比Python的優勢[2]
Julia 從一開始就是為科學和數值計算而設計的。因此,Julia 在此領域具有眾多優點也就不足為奇。它的優點如下:
1. 速度更快:Julia 的 JIT 編譯和型別宣告意味著它可以比未優化的Python快速,雖然Python可以通過PyPy或者Cython等方式進行加速,但Julia從設計之初就具有天然的速度優勢。
2. 友善的數學語法:Julia 的主要目標群眾是科學計算語言的使用者,因此,Julia 的數學運算語法看起來更像普通數學公式,使用者容易掌握。
3. 自動記憶體管理:記憶體管理,是指軟體執行時對電腦記憶體資源的分配和使用的技術。其最主要的目是如何高效、快速的分配,並且在適當的時機釋放和回收記憶體資源。Julia不需要使用者關心分配和釋放記憶體的細節,它提供了一系列針對垃圾回收的方法。這樣的好處在於,假設你從Python的轉移到Julia,你依然可以享有Python一樣的便利。
4. 平行性:充分利用機器上全部的可用資源,特別是多核心,數學和科學計算領域能夠迅速發展,Python和Julia都支持平行運算。但是,在平行計算方面,Julia 的語法比Python簡單,這樣降低了使用門檻,能夠得到更廣泛的應用。
Chapter 1 Julia 是什麼樣的程式語言?
1. 程式語言
世界上的程式語言有上千種,但是最常用的、耳熟能詳的不過是其中的少數。程式語言可以說是現代工程師的最佳武器,舉凡從網頁設計到後端系統設計,甚至是資料庫或是作業系統,都是藉由程式語言來完成的。在網頁設計中可能會用到 Javascript,以及後端的PHP。如果是要寫 Microsoft 系列或是在 Windows 上跑的程式,會需要 C# 或是 ASP.NET 架構的幫忙。要撰寫可以在 Mac 上執行的程式會需要 Swift。如果是寫 Android 系列的 app 就需要熟悉Java。
如今資料分析跟機器學習的人會使用P...
推薦序
在這個日常生活幾乎離不開各種軟體的時代,一波學習程式的熱潮正在展開;而學習程式最好的方式之一,就是參與技術社群:除了在各個社群中常常會舉辦各種程式相關的教學及分享以外,跟技術開發者們交流的機會是能夠讓人學習到最多的。
在這些年主持以及參與了這麼多社群活動之後,相較於台灣大多數的技術社群,由岳華發起的 Julia Taiwan 特別有股親切感。可能是因為跟我們 Taiwan R User Group 一樣,在被應用的領域和早期使用者的組成都有著比起其他程式語言更多元、更不「資工本科」的味道;同樣的,在東吳大學積極推動巨量資料以及資料科學人才培育的筱薇老師,也帶領更多非資訊本科系的學子們認識資料科學的價值。
在這樣龐大的熱情以及專業下所誕生的這本教材,相信能成為由淺入深地學習 Julia 這個新興語言的最佳利器:不管是基礎的資料結構、運算,到使用各式各樣的套件完成工作,或是利用漸漸成為程式開發主流的函數式程式設計(Functional Programming)以及Metaprogramming來撰寫高效能的 Julia 程式,本書可說是無所不包。一起來體驗「Python 般的程式撰寫,如 C 般的運算效能」的Julia吧!
Taiwan R User Group 社群主持人
Microsoft Most Valuable Professional 微軟最有價值專家
現任 MoMagic 資深資料科學家
孫玉峰
在這個日常生活幾乎離不開各種軟體的時代,一波學習程式的熱潮正在展開;而學習程式最好的方式之一,就是參與技術社群:除了在各個社群中常常會舉辦各種程式相關的教學及分享以外,跟技術開發者們交流的機會是能夠讓人學習到最多的。
在這些年主持以及參與了這麼多社群活動之後,相較於台灣大多數的技術社群,由岳華發起的 Julia Taiwan 特別有股親切感。可能是因為跟我們 Taiwan R User Group 一樣,在被應用的領域和早期使用者的組成都有著比起其他程式語言更多元、更不「資工本科」的味道;同樣的,在東吳大學積極推動巨量資料以及資料科...
作者序
作者序一
近年來資料科學與⼈工智慧技術大行其道,不少研究領域與創新應用紛紛出爐,相對傳統的科學計算與數值計算領域已經有不少成熟
的演算法與軟體。資料科學,除了需要統計及資料處理的技術外,還非常仰賴基礎的數值運算功能,在大數據的情境下,數值運算的加速更是重要。人工智慧技術也非常仰賴資料科學的分析結果,以及模型運算上的效率。然而傳統科學計算與數值計算領域的研究成果對資料科學與人工智慧的助益非常大。舉凡矩陣運算、數值分析、應用線性代數或是最佳化方法上的成果都化為一行行的演算法及程式提供給資料科學家或是機器學習專家,用來建造更為貼近人心的人⼯智慧產品。資料科學與人工智慧技術很需要數值計算的演算法為基礎。很自然地,Python 就被選為這些技術的發展平台,近十年來,不少科學運算的功能都挹注在這個語言當中。最重要的兩塊基石可以說是numpy及scipy 套件,提供了很棒的數值運算及科學運算基礎,使用介面上也不算煩雜。然而,這還不夠,當開發者開發出新的功能或是套件時,卻會受限於語言本身的執行效能,而需要以更低階的語言實作來取得效能。程式語言的效率及開發彈性一直是魚與熊掌不可兼得的,選擇了程式效率就勢必放棄開發的彈性,選擇了開發的彈性與速度就勢必放棄執行效率。Julia語言,作為⼀一個新興語⾔言,同時兼有效能以及開發彈性,吸取了各家語言的優點,並且在語⾔及編譯器技術上的設計,讓Julia成為了兼有效能及彈性的優美語言。Julia語言設計者一開始著重科學運算以及數值運算上,而將這個語言設計為一個泛用型的語言。對多數的科學家來說,效能是非常需要的,往往一個理論模型的實驗需要數天以上的時間。對一個非資訊領域的領域專家來說,方便易用的語言會是得心應手的工具,不需要去了解太多的底層細節可以節省非常多的時間,專注在他們自己有興趣的事物上。Julia語言在設計之初就考慮了非常多的語言特質,讓他在很多面向可以被顧及,成為受到各個領域專家所喜愛的語言,更是資料科學與人工智慧技術的最佳搖籃。
作為⼀個年輕的語言,套件的豐富程度遠遠不及其他發展長久的語言,但是他有一群活潑積極的開發者。在語言發展初期借了了不少其他語言來的套件以補足缺少的部份,然後逐漸發展出純Julia寫成的套件,一個兼具效能及彈性的套件。以最富名氣的 Flux.jl 深度學習框架為例,他本身是⼀個純 Julia 實作而成的套件,底層有GPU 的 CUDA ⽀支援,上層有可拆解組合的模型元件,由於語言本身的特性,套件可以與語言本身無縫接軌,語言本身的特性可以直接被套用在模型上。為了效能及可讀性,一群熱情的開發者正積極地開發著這樣純 Julia 的套件,也為了真正地解決問題。在語⾔進入穩定之後,套件開發者們更可以放心的實作,期待未來可以看到在這個語言上套件百花齊放的燦爛姿態。
在國外的開發者社群開心的討論著這個新興的語言,台灣卻難掩寂寞。於是我決定自己來發起社群,將好語言介紹給大家。不少在台灣的開發者都不具備相關科系的背景,而且在台灣的環境中比較難培養好的英文能力,這使得廣大而豐富的英文技術資源難以被台灣的開發者所使用。語言的確是個隔閡,技術底蘊更是身為開發者需要修煉的。我也決定在中文的使用者社群中投入自己的心力,撰寫本書,讓更多中文使用者可以接觸到這個語言、理解這個語言。
本書的定位是從完全沒有程式基礎的人到有基礎的程式設計師。在書的章節編排上,由淺入深,前六個章節是基礎的程式設計篇章,
7~9章節是這個語言的核心觀念,也是比較進階的程式設計方式,會對應到物件導向風格的設計方式,10~12 章節是關於串流及檔案的存取方面,最後的三個章節會晉升到更高層次的討論,介紹物件導向設計、函數式程式設計及metaprogramming。對於語言的初
學者可以不用把書全部看完,可以邊實作專案,有一些實務經驗的同時慢慢閱讀後續的章節。
Julia Taiwan
杜岳華
作者序二
在校園裡同學們最常問我的一個問題就是:「老師,我該學哪個程式語言比較好?是R、是Julia 是Python?」我的答案是,都好!因為重點不在於選擇,而是當你做出選擇之後的每一個嘗試、學習、堅持、突破與精進,這過程所積累出來的實力,才是你該追求的。為了提供學生更多元的學習場域,引動學習動機,我成立了資料實驗室(Data Lab),並長期與企業合作,透過實際的專案項目培養資料科學人才,同時也定期開設相關課程,鍛鍊同學們的基礎能力,一個因緣巧合,我認識了本書的另一位作者--杜岳華老師,岳
華讓我印象非常深刻,是個有想法、有才華、有熱情、有能力,堅持理想並付諸行動的年輕人,有一次他跟我說,希望有更多人認識Julia的這個語言,更希望台灣在國際Julia社群中的能見度可以提高!我聽了非常感動,也跟著熱血了起來!於是,我們在資料實驗室中開設了Julia程式語言的課程,接著就是撰寫本書,讓更多中文使用者可以認識這個資料科學語言中的新星--Julia 。
這個時代的學習和過去很不一樣,有太多的新知識與新技術鋪山倒海的湧入,就像這幾年年大家常常在談的IoT、Big Data、ML、AI、
Blockchain,似乎沒有人能明確又清楚的告訴你那些是什麼?它沒有教課書,也沒有結論,因為這一切都還在發展與演化當中,不過可以肯定的是,倘若我們仍舊以過去的學習態度和方法,要能夠跟上這個時代,掌握這些風口,肯定很困難,那我們該如何因應呢?
既然確定性的知識越來來越少,那就保持開放的頭腦與心胸吧!當思考世界的角度越多,你的未來就充滿了無限可能。
最後,我想引用Ratatouille的經典台詞並稍做修改來鼓勵各個領域的朋友:
"Not everyone can become a great Data scientist, but a great Data scientist can come from anywhere."
衷心祝福各位讀者!
東吳大學巨量資料管理學院 副教授
胡筱薇
作者序一
近年來資料科學與⼈工智慧技術大行其道,不少研究領域與創新應用紛紛出爐,相對傳統的科學計算與數值計算領域已經有不少成熟
的演算法與軟體。資料科學,除了需要統計及資料處理的技術外,還非常仰賴基礎的數值運算功能,在大數據的情境下,數值運算的加速更是重要。人工智慧技術也非常仰賴資料科學的分析結果,以及模型運算上的效率。然而傳統科學計算與數值計算領域的研究成果對資料科學與人工智慧的助益非常大。舉凡矩陣運算、數值分析、應用線性代數或是最佳化方法上的成果都化為一行行的演算法及程式提供給資料科學家或是機器學習...
目錄
推薦序
作者序一
作者序二
Part 1 從幾個重要的問題開始
Chapter 1 Julia 是什麼樣的程式語言?
Chapter 2 走入Julia 的世界
Chapter 3 上手Julia
Part 2 程式設計基礎篇
Chapter 4 控制流程 - 條件判斷與迴圈
Chapter 5 集合容器
Chapter 6 字元、字串與正規表達式
Chapter 7 函式
Chapter 8 遞迴
Chapter 9 例外處理
Part 3 程式設計物件篇
Chapter 10 型別
Chapter 11 方法
Chapter 12 資料結構與泛型程式設計
Part 4 串流與檔案
Chapter 13 檔案讀寫
Chapter 14 網路程式設計
Chapter 15 檔案與目錄管理
Part 5 程式設計進階篇
Chapter 16 再論型別系統
Chapter 17 函數式程式設計
Chapter 18 Macro及Metaprogramming
附錄:參考資料與學習資源、運算子優先權表、ASCII 字碼介紹與字碼表、跳脫字元表
推薦序
作者序一
作者序二
Part 1 從幾個重要的問題開始
Chapter 1 Julia 是什麼樣的程式語言?
Chapter 2 走入Julia 的世界
Chapter 3 上手Julia
Part 2 程式設計基礎篇
Chapter 4 控制流程 - 條件判斷與迴圈
Chapter 5 集合容器
Chapter 6 字元、字串與正規表達式
Chapter 7 函式
Chapter 8 遞迴
Chapter 9 例外處理
Part 3 程式設計物件篇
Chapter 10 型別
Chapter 11 方法
Chapter 12 資料結構與泛型程式設計
Part 4 串流與檔案
Chapter 13 檔案讀寫
Chapter 14 網...