如何選擇教學語言

jopen 10年前發布 | 11K 次閱讀 編程語言

英文原文:How to choose a teaching language

  譯/臘八粥

  如果你正在教授編程課,你該用哪種語言呢?

  我喜歡這個問題,因為它有很多不錯的答案,彼此存在很大差異,不同的方法對于編程的理解有著不同的思考。

  我在普林斯頓大學上的第一堂正式的編程課是 COS 217,由優秀老師 Anne Rogers 講解(當時我覺得是可怕的)。這個課程采用C語言,這門課的聰明之處在于從機器開始。我們不只是學習C,還學到了用來編程的機器是如何運行的。我就是在這里首次接觸到了指令計數器、堆棧幀、寄存器和分級存儲,太讓人振奮了。

  C 鼓勵你從機器開始,而 Scheme【注1】想讓你從計算的數學基礎開始。你不需要理解λ演算【注2】,這得益于 Scheme 的簡潔核心,你可以在此之上構建豐富多彩的計算世界。其核心具有表現力,足以引入多種不同的語言,包括函數式語言與命令式語言、面向對象語言和邏輯程序設 計。

  經典課程是 MIT 的 6.001,也就是熟知的 SICP,計算機程序的構造和解釋。悲劇的是,這節課在 MIT 網站已經下線了,但是這本書還有,即使你多年前已經完成了最后的計算機科學課程,它還是值得一讀的。

  MIT 用基于 Python 的課程取代了 SICP,這體現了一種較廣的趨勢。根據 Philip Guo 的一項非正式研究所強調的,很多學校現在教授 Python,尤其是針對早期的入門課程。我對這個選擇有著復雜的感受。Python 是一門非常友好的語言,但是這種友好性也附帶了一些問題。

  在一定程度上我覺得是比較明顯的,根據我的面試經歷,應聘學生選擇編碼的語言就是 Python。在很多場合,Python 是理想的面試語言,因其簡潔、可讀性強的語法,在空間有限的白板上寫代碼,是完全可以接受的。不過我看到了,學習 Python 的學生經常搞不清楚這門語言的、相當粗略的語義模型。大量用 Python 編程的部分學生不能猜到 Python 的列表(list)是如何被實現的,更不要說他們有能力解釋生成器或裝飾器之類的、語言特性的語義了。

  這里真的不是說 Python 不好。畢竟,存在一些偉大的工具,你可以完全不用理解其工作原理就可以把工作搞定。但是用不同的方式,Scheme 和C鼓勵你從底層理解發生了什么,某種教學的力量就存在于此。總之,對于早期的入門課程,特別是對于那些不打算最終成為計算機科學家或全職程序員的人來 說,我認為 Python 是一個不錯的選擇。但是,對于這種情況之外使用 Python,我是持保留態度的。

  就個人而言, 我感到想當被鼓勵的一個進展就是靜態類型語言的出現,特別是 ML 語言【注3】做為教學語言。在過去的幾年,我非常榮幸地訪問了布朗大學、康奈爾大學、賓夕法尼亞大學、卡內基梅隆大學和哈佛等學校,并發表演講,這些學校使用 Ocaml 和 Standard ML 兩種方言。

  ML 語言已經具備了優秀理由的基礎。首先,它分享了很多 Scheme 優雅的編程思想,即使它的核心不像 Scheme 那樣有著迷人的簡約。但是 ML 比 Scheme 有更廣的延伸,因為你可以向學生展示編程里的類型化角色。盡管有著更廣的延伸,OCaml 和 SML 屬于相對簡單的語言,用于教學而不是日常應用,才是最重要的。

  我看到很多語言上的選擇,唯一不能讓我自己接受的是 Java。當然,Java 是廣泛使用的業內語言,但不代表它就是一門優秀的教學語言。在我看來,教學語言的關鍵要素是簡潔,我剛才提到的所有其它選擇都有著某種方式的簡潔:C是機 器之上的最少的層;Scheme 和 ML 是基于計算的簡單數學模型;Python 是易于使用的語言。

  從各種角度說,Java 都不簡潔。尤其不容易入門,你需要告訴學生,所有細節可以忽略而不是理解。(是的,public static void main,我看到了!)它沒有C的簡單、透明的執行模式。像 Scheme 和 ML 核心的、優雅計算機核心演算,是根本看不到的。我能看到 Java 的唯一真正優勢在于好找工作,好像對我來說還不能算足夠的論據。

  當你考慮挑選一門教學語言時,你不只是為學生挑選一些在課堂上編程的指令。你正在挑選一種智力上的思想,學生將從中看到你教給他們的所有經驗。你應該認真地找到這個思想。

  • 注1:Scheme 是一種函數式編程語言,是 Lisp 的兩種主要方言之一(另一種為 Common Lisp)。不同于 Common Lisp,Scheme 遵循極簡主義哲學,以一個小型語言核心作為標準,加上各種強力語言工具(語法糖)來擴展語言本身。http://zh.wikipedia.org/wiki/Scheme
  • 注2:λ演算(英語:lambda calculus,λ-calculus)是一套用于研究函數定義、函數應用和遞歸的形式系統。http://zh.wikipedia.org/wiki/Λ演算
  • 注3:ML 是一個通用的函數式編程語言,它是由愛丁堡大學的 Robin Milner 及他人在二十世紀七十年代晚期開發的。今天在 ML 家族中有好幾種語言:兩種主要的方言是 Standard ML 和 Caml,其他的包括F# - 針對 Microsoft .NET 平臺的開放研究項目。 ML 中的思想影響了眾多的語言,例如 Haskell,Cyclone 和 Nemerle。http://zh.wikipedia.org/wiki/ML 語言
  • </ul>

                        <span id="shareA4" class="fl">                  
                            </span>
     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!