前言
2018 年我開始準備一門針對完全沒有編程經(jīng)驗的學生的編程課程。我想用Julia,不過我發(fā)現(xiàn)市面上沒有用Julia 作為第一編程語言來學習編程的書。確實有很多不錯的教程解釋了Julia 的重要概念,不過沒有哪一本書足夠重視學習程序員是如何思考的。
Allen Downey 的《Think Python》介紹了學習正確編程的所有重要概念。不過,那本書是基于Python 語言的。我的講義初稿可算是各種參考書的大雜燴,不過隨著準備的時間越長,講義內(nèi)容就越像《Think Python》中的章節(jié)。我有了一個想法,想把那本書移植到Julia,把我的講義整理成Julia 版的《Think Python》,這個想法很快付諸實施。
所有材料都可以從一個GitHub 存儲庫作為Jupyter notebook 獲取。我在Julia Discourse 網(wǎng)站上發(fā)布了有關(guān)這個課程進度的消息后,反饋像潮水般涌來。大家迫切需要用Julia 作為第一編程語言介紹基本編程概念的一本書,顯然,這是Julia 世界中缺失的一環(huán)。我聯(lián)系了Allen,詢問我能不能正式把《ThinkPython》移植到Julia 寫一本書,他的回答很干脆:“加油!”他幫我與他的O’Reilly Media 編輯取得了聯(lián)系,一年后,這本書終于完成,我對它做了最后的潤色。
這條路走來真是有些坎坷。2018 年8 月,Julia v1.0 發(fā)布,與所有Julia 程序員一樣,我不得不做代碼遷移。將源文件轉(zhuǎn)換為O’Reilly 兼容的AsciiDoc 文件時,這本書中的所有例子都經(jīng)過了測試。工具鏈和示例代碼都必須是Juliav1.0 兼容的。好在8 月份我不需要上課……
希望你喜歡這本書,它不僅能幫助你學習編程,還能教你像計算機科學家那樣思考,至少能有那么一點點。
——Ben Lauwens
為什么選擇Julia?
Julia 最初由Alan Edelman、Stefan Karpinski、Jeff Bezanson 和Viral Shah 在2012 年發(fā)布。這是一個免費且開源的編程語言。
選擇編程語言往往很有主觀性。對我來說,Julia 的以下特點是決定性的因素:
?? Julia 是一個高性能編程語言。
?? Julia 使用了多重分派,允許程序員選擇適合應用的不同編程模式。
?? Julia 是一個動態(tài)類型語言,可以很容易地交互使用。
?? Julia 有一種易于學習的簡明的高級語法。
?? Julia 是一個可選類型的編程語言,它的(用戶自定義)數(shù)據(jù)類型可以讓代碼更清晰,也更健壯。
?? Julia 有一個擴展標準庫,還有大量可用的第三方包。
Julia 是一種獨一無二的編程語言,因為它解決了所謂的“兩個語言問題”。
不需要任何其他編程語言,利用Julia 就可以寫高性能的代碼。不過,并不是說這會自動發(fā)生。要由程序員負責優(yōu)化形成瓶頸的代碼,不過只用Julia 本身就可以做到。
本書面向的讀者
這本書適合任何想要學習編程的人,無須先前掌握任何編程知識。
我們會循序漸進地介紹新概念,并在后面的章節(jié)介紹更高級的主題。
本書可以作為高中或大學一個學期課程的教材。
本書使用約定
以下是本書使用的排版約定:
斜體(Italic)
表示新術(shù)語、URL、email 地址、文件名和文件擴展名。
等寬字體(Constant width)
表示程序列表,以及段落內(nèi)部,用于引用程序元素,如變量或函數(shù)名稱,數(shù)據(jù)庫、數(shù)據(jù)類型、環(huán)境變量、函數(shù)語句和關(guān)鍵字等。
加粗等寬字體(Constant width bold)
表示由用戶所輸入的命令或其他文本。
斜體等寬字體(Constant width italic)
表示應由用戶所提供的實際值或根據(jù)上下文所確定的值來替換的文本。
使用代碼示例
本書中使用的所有代碼都可以從GitHub 上的一個Git 存儲庫(https://github.com/BenLauwens/ThinkJulia.jl)獲取。如果你不熟悉Git,應該知道這是一個版本控制系統(tǒng),允許你跟蹤一個項目里的有關(guān)文件。Git 控制下的一個文件集合就稱為一個“存儲庫”。GitHub 是一個托管服務(wù),為Git 存儲庫提供了存儲空間,并提供了一個方便的Web 界面。
現(xiàn)在已經(jīng)有一個很方便的包,可以直接增加到Julia。只需要在Pkg 模式下在REPL 中鍵入add https://github.com/BenLauwens/ThinkJulia.jl,參見第4 章“海龜繪圖”一節(jié)。
運行Julia 代碼最容易的方法是訪問https://juliabox.com 并啟動一個免費會話。
可以使用REPL,另外它還提供了一個notebook 界面。如果想在你的計算機上安裝Julia,可以從Julia Computing 免費下載JuliaPro。這包括一個最新的Julia 版本、基于Atom 的Juno 交互式開發(fā)環(huán)境,以及多個預安裝的Julia 包。如果你喜歡研究,可以從https://julialang.org 下載Julia,安裝你喜歡的編輯器(例如,Atom 或Visual Studio Code),并啟用用于Julia 集成的插件。
如果是本地安裝,還可以增加IJulia 包,在你的計算機上運行一個Jupyternotebook。
這本書的目的是幫助你完成工作。一般來講,你可以在程序和文檔中使用這些示例代碼,不需要聯(lián)系我們來得到許可,除非你直接復制了大部分的代碼。例如,如果你在編寫一個程序,使用了本書中的多段代碼,這并不需要得到許可。但是出售或發(fā)行O’Reilly 書示例代碼光盤則需要得到許可;卮饐栴}時如果引用了這本書的文字和示例代碼,這不需要得到許可。但是如果你的產(chǎn)品的文檔借用了本書中大量示例代碼,則需要得到許可。
我們希望但不嚴格要求標明引用出處。引用信息通常包括書名、作者、出版商和ISBN。例如,“Think Julia by Ben Lauwens and Allen B. Downey (O’Reilly).Copyright 2019 Allen B. Downey, Ben Lauwens, 978-1-492-04503-8”。
如果你認為你在使用代碼示例時超出了合理使用范圍或者上述許可范圍,可以隨時聯(lián)系我們:permissions@oreilly.com。
O’Reilly 在線學習平臺(O’Reilly Online Learning)
近40 年來,O’Reilly Media 致力于提供技術(shù)和商業(yè)培訓、知識和卓越見解,來幫助眾多公司取得成功。
我們擁有獨一無二的專家和革新者組成的龐大網(wǎng)絡(luò),他們通過圖書、文章、會議和我們的在線學習平臺分享他們的知識和經(jīng)驗。O’Reilly 的在線學習平臺允許你按需訪問現(xiàn)場培訓課程、深入的學習路徑、交互式編程環(huán)境,以及O’Reilly 和200 多家其他出版商提供的大量文本和視頻資源。有關(guān)的更多信息,請訪問http://oreilly.com。
聯(lián)系我們
請將關(guān)于本書的意見和問題通過以下地址提供給出版商:
美國:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國:
北京市西城區(qū)西直門南大街2號成銘大廈C座807室(100035)
奧萊利技術(shù)咨詢(北京)有限公司
針對這本書,我們還建有一個網(wǎng)頁,列出了有關(guān)勘誤、示例和其他信息。可以通過以下地址訪問這個頁面:https://oreil.ly/think-julia。
如果對這本書有什么建議,或者要詢問技術(shù)上的問題,請將電子郵件發(fā)送至:bookquestions@oreilly.com。
要了解關(guān)于我們的圖書、課程、會議和新聞的更多信息,請訪問我們的網(wǎng)站:http://www.oreilly.com。
我們的Facebook: http://facebook.com/oreilly。
我們的Twitter: http://twitter.com/oreillymedia。
我們的YouTube: http://www.youtube.com/oreillymedia。
致謝
非常感謝Allen 寫了《Think Python》一書,并允許我把這本書移植到Julia。
你的熱情深深地感染了我!
還要感謝這本書的技術(shù)審校人員:Tim Besard、Bart Janssens 和David P.Sanders,你們提出了很多非常有幫助的建議。
感謝O’Reilly Media 的Melissa Potter,你讓這本書更出色。是你督促我少走彎路做正確的事,并讓這本書盡可能讓人耳目一新。
感謝O’Reilly Media 的Matt Hacker,是你幫助我解決了那些Atlas 工具鏈和語法高亮顯示問題。
感謝所有與我共同完成這本書初版的同學們,還有提出修改意見和建議的所有貢獻者(如后所列)。
貢獻者名單
如果你有建議或修改意見,請發(fā)email 至ben.lauwens@gmail.com 或者在GitHub 上開一個問題。如果我根據(jù)你的反饋做了修改,會把你增加到貢獻者名單里(除非你要求省略)。
要讓我知道你使用的是這本書哪一個版本,哪一種格式。最好至少給出有錯誤的那個句子的一部分,這樣更方便我查找。也可以給出頁碼和節(jié)號,不過這樣查找起來可能不那么容易。
非常感謝!
?? Scott Jones 指出Void 改為Nothing,正是在此之后,我開始把這本書遷移到Julia v1.0。
?? Robin Deits 發(fā)現(xiàn)了第2 章的一些拼寫錯誤。
?? Mark Schmitz 建議啟用語法高亮顯示。
?? Zigu Zhao 找出了第8 章的一些bug。
?? Oleg Soloviev 發(fā)現(xiàn)了增加ThinkJulia 包的URL 中的一個錯誤。
?? Aaron Ang 發(fā)現(xiàn)了一些渲染和命名問題。
?? Sergey Volkov 發(fā)現(xiàn)第7 章中一個已經(jīng)失效的鏈接。
?? Sean McAllister 建議應當提到一個非常棒的BenchmarkTools 包。
?? Carlos Bolech 發(fā)來一個長長的修改意見和建議列表。
?? Krishna Kumar 修改了第18 章中的Markov 示例。