本文發表於《大眾科學》的前部落格網路,反映了作者的觀點,不一定代表《大眾科學》的觀點
程式設計已經改變了。在第一代語言(如 FORTRAN 和 C)中,程式設計師的負擔是將高層次的概念轉化為程式碼。使用現代程式語言(我將以 Python 為例),我們使用函式、物件、模組和庫來擴充套件語言,這不僅使程式更好,而且改變了程式設計的本質。
程式設計過去是關於翻譯的:用自然語言表達想法,用數學符號處理它們,然後編寫流程圖和虛擬碼,最後編寫程式。翻譯是必要的,因為每種語言都提供不同的功能。自然語言具有表達性和可讀性,虛擬碼更精確,數學符號簡潔,而程式碼是可執行的。
但是翻譯的代價是,我們只能侷限於我們在每種語言中能有效表達的那些想法子集。一些在計算上很容易表達的想法,在數學符號中卻很難編寫,而我們在數學中進行的符號操作在大多數程式語言中是不可能實現的。
關於支援科學新聞報道
如果您喜歡這篇文章,請考慮透過以下方式支援我們屢獲殊榮的新聞報道 訂閱。透過購買訂閱,您將幫助確保有關塑造我們當今世界的發現和想法的有影響力的故事的未來。
現代程式語言的強大之處在於它們具有表達力強、可讀性高、簡潔、精確且可執行的特點。這意味著我們可以消除中間語言,並使用一種語言進行探索、學習、教學和思考。
圖 1
例如,圖 1 顯示了在流行教科書中使用的偽程式碼表達的廣度優先搜尋 (BFS) 演算法。作者設計這種語言的目的是使其比當時(1989 年)的大多數程式語言更簡潔、更易讀。
圖 2 顯示了用 Python 編寫的相同演算法。它比虛擬碼短幾行,並且因為它使用的單詞多於符號,我認為它更易讀。此外,與虛擬碼不同,我們可以執行它、顯示結果並除錯它。
圖 2
當然,執行程式是程式設計的全部目的,但它還有更多意義。執行程式碼的能力使程式設計成為思考和探索的工具。當我們把想法表達為程式時,我們就使它們可測試;當我們除錯程式時,我們也在除錯我們的大腦。
像 Python 這樣的語言也非常適合學習和教學。例如,我最近寫了一本關於數字訊號處理 (DSP) 的書。我使用 Python 編寫了一個簡單的庫,並使用 Jupyter(一種軟體開發環境)來編寫線上筆記本,這些筆記本結合了文字、程式碼和結果,包括影像和聲音片段。
在編寫這本書時,我編寫了程式碼來測試我的理解,同時向學生解釋。學生可以執行程式碼來建立一個心理模型,進行更改來測試他們的預測,併為他們的專案擴充套件我的程式碼。
大多數教科書和課程都使用數學來教授訊號處理,學生主要使用紙和筆進行練習。使用這種方法,唯一的選擇是從“自下而上”開始,從複數的算術開始,這不是最令人興奮的主題,並且需要數週和許多頁才能達到相關的應用。
使用計算方法,我們可以“自上而下”開始,從實現最重要演算法(如快速傅立葉變換)的庫開始。學生可以先使用演算法,然後再學習它們的工作原理。他們可以看到最重要的思想,例如頻譜分解,而不會被細節矇蔽。他們可以在第一天就從事實際應用,從而激發他們深入研究的動力。而且他們可以獲得更多的樂趣。為了演示,我寫了一個名為“全家的不和諧音樂”的 Jupyter 筆記本。如果您單擊該連結,您可以看到程式碼並收聽示例。它使用我編寫的庫來模擬一所小學樂隊的聲音,樂器音調不準,並且有些孩子隨機演奏錯誤的音符。這本意是傻傻的(而且有點刻薄),但它也展示了我們如何感知聲音並解釋複雜訊號的音調的各個方面。
我所稱的現代語言並不是特別新穎;實際上,Python 已經有 25 年以上的歷史了。但是它們尚未在高中和大學中得到廣泛教授。即使在採用它們的場合,它們也經常以一種沒有利用其功能的方式使用。
現代程式語言在性質上與它們的前身不同,但我們才剛剛開始意識到這種差異的含義。
在另一篇文章中,我將介紹更多使用 Python 進行思考、探索、學習和教學的方法。
