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