選Python還是選Java?2020年,優秀程序員最應該掌握的7種編程語言
哪種編程語言最好?這個問題可能永遠不會有答案。蘿卜白菜,各有所愛,AI 工程師和科學家可以根據項目需要,從眾多編程語言中選擇最適合自己的。
有人曾經將編程比作做菜,那編程語言就是首先要準備的食材或廚具。
C:一把菜刀一口炒鍋,一個很好用的灶,隔壁有個菜市場。
Java:碎菜器,切菜機,絞肉機,和面機,烤箱,微波爐……
Python:大超市的速凍柜臺,要成品有成品,要半成品有半成品,什么都有。它能讓你快速獲得一桌還能吃的飯,但是深究口味火候什么的不那么容易。
C++:一套頂級廚具,光刀就十幾把,切肉的切片的雕花的;鍋有爆炒的悶燒的平底煎肉的煎蛋的燉湯的……有人試圖用二十一天掌握這套工具的用法,結果往往是玩刀傷了自己,或者是炸了廚房。
盡管在剛開始開發 AI 時,有很多編程語言都可以滿足你的需求,但沒有一種編程語言是可以一站式解決 AI 編程的問題,因為在每一個項目中,不同的目標需要特定的方法。
和做菜時的精挑細選一樣,在成為一個「高手」的過程中,我們要學會的是找到最適合自己的編程語言。
Python
Python 是可讀的最強大的語言。—Pau Dubois
Python 編程。圖源:Unsplash。
Python 開發于 1991 年,一項民意調查表明,在開發 AI 時,超過 57% 的開發者將 Python 作為首選編程語言,而不是 C++。因為易于學習,Python 讓程序員和數據科學家可以更輕松地進入開發 AI 的世界。
Python 是一個程序員需要多少自由度的「實驗」。太自由,沒人可以讀懂別人的代碼;太不自由,就會沒那么強的表現力。—Guido van Rossum
使用 Python,你不僅可以獲得優秀的社區支持和廣泛的庫集,還能享受到其靈活性。你從 Python 中得到的最大的好處可能是平臺獨立性和針對深度學習和機器學習的廣泛框架。
用 Python 編碼的樂趣在于可以看到短小精悍、可讀性高的類,這些類可以用少量清晰的代碼表達大量行為(而不是用大量代碼煩死讀者)。——Guido van Rossum
Python 代碼片段示例:
常用的庫
- TensorFlow——用于機器學習工作負載和用數據集處理;
- scikit-learn——訓練機器學習模型;
- PyTorch——計算機視覺和自然語言處理;
- Keras——高度復雜性的數學計算和操作的代碼接口;
- SparkMLib——類似 Apache Spark 的機器學習庫,通過算法和實用程序等工具,讓每一個人都能輕松地進行機器學習;
- MXNet——Apache 的另一個庫,可以簡化深度學習流程;
- Theano——定義、優化和評價數學表達式的庫;
- Pybrain——用于強大的機器學習算法。
另外,根據 GitHub 庫的貢獻度,Python 已經超越了 Java,成為世界第二受歡迎的語言。Stack Overflow 將 Python 稱為「成長最快」的主流編程語言。
Java
編寫一次,隨時運行。
Java 被公認為世界上最好的編程語言之一,它在過去 20 年間的使用情況就是最好的證明。
憑借其用戶友好度、靈活的特性以及平臺獨立性,Java 以各種方式參與到了 AI 的開發中,比如:
- TensorFlow——TensorFlow 支持的編程語言中也列出了帶有 API 的 Java。雖然不像其他完全支持的語言那樣功能豐富,但確實支持 Java,并且在迅速地改進。
- Deep Java Library(深度 Java 庫)——亞馬遜開發的、用 Java 來創建并部署深度學習能力的庫。
- Kubeflow——Kubeflow 使在 Kubernetes 上部署和管理機器學習堆棧更容易,還提供了現成的 ML 解決方案。
- OpenNLP——Apache 的 OpenNLP 是用于自然語言處理的機器學習工具。
- Java Machine Learning Library(Java 機器學習庫)——Java-ML 為開發者提供了多種機器學習算法。
- Neuroph——Neuroph 借助 Neuroph GUI,利用 Java 開源框架設計了神經網絡。
- 如果 Java 可以垃圾回收,大多數程序都會在執行時刪除自己。——Robert Sewell
Java 代碼片段示例:
R語言
Ross Ihaka 和 Robert Gentleman 在 1995 年發布了第一版 R 語言。現在由 R 開發核心隊伍維護,R 是 S 編程語言的實現,用于統計軟件的開發和數據的分析。
R 的基礎特征是善于處理大量數據,相比 Python 中不夠完善的 NumPy 包,R 是更好的選擇;你可以用 R 處理各種不同的編程范式,比如函數式編程、矢量計算和面向對象編程等。
R 適用的 AI 編程包:
- Gmodels——提供了一系列擬合模型用的工具;
- Tm——文本挖掘應用的框架;
- RODBC——R 的 ODBC 接口;
- OneR——用來實現單規則機器學習分類算法,適用于機器學習模型。
在數據挖掘者和統計學家中,廣泛使用的 R 的功能有:
- 多種用于擴展功能的庫和包;
- 活躍的支持社區;
- 能和 C、C++ 和 Fortran 協同工作;
- 多個有助于擴展功能的包;
- 支持生成高質量的圖形。
Prolog
邏輯編程(Logic Programming)的簡稱。Prolog 最早出現在 1972 年,適用于開發人工智能,尤其是自然語言處理。Prolog 最適合創建聊天機器人,ELIZA 是有史以來第一個用 Prolog 創建的聊天機器人。
第一個成功的聊天機器人。
為了理解 Prolog,你必須熟悉一些指導 Prolog 工作的基本術語:
- 事實(Fact)定義了正確的陳述;
- 規則(Rule)定義了有附加條件的陳述;
- 目標(Goal)根據知識庫定義了提交陳述的位置;
- 查詢(Query)定義了如何使你的陳述正確,以及對事實和規則的最終分析。
Prolog 提供了兩種實現 AI 的方法,這兩種方法已經實現很久了,并且在數據科學家和研究人員中廣為人知:
- 符號方法包括基于規則的專家系統、定理證明和基于約束的方法;
- 統計方法包括神經網絡、數據挖掘、機器學習以及其他方法。
Lisp
用 Lisp 編碼創建有 n 個輸入 m 個單元的一層感知機。
列表處理(List Processing)的簡稱。這是繼 Fortran 后第二古老的編程語言。也被稱作 AI 的奠基語言之一,由 John McCarthy 與 1958 年創建。
Lisp 是用來實現不可能的語言。——Kent Pitman
Lisp 是可以編程的實用數學符號,很快就成為了開發人員首選的 AI 編程語言。Lisp 因為其特有的功能,成為機器學習 AI 項目的最佳選擇之一:
- 快速創建原型;
- 創建動態對象;
- 垃圾回收;
- 靈活性。
隨著其他競爭的編程語言的重大改進,其他語言集成了 Lisp 特有的一些功能。涉及到 Lisp 的著名項目有 Reddit 和 HackerNews。
說到 Lisp,這是世界上最美的語言——至少在 Haskell 出現之前是這樣。——Larry Wall
Haskell
Haskell 創建于 1990 年,以著名數學家 Haskell Brooks Curry 的名字命名。Haskell 是純粹的函數式和靜態類型的編程語言,與惰性計算和短代碼配合使用。
Haskell 是一種非常安全的編程語言,因為和其他編程語言相比,Haskell 很少出現錯誤,所以在處理錯誤方面提供了更大的靈活性。即便發生了錯誤,也可以在編譯(而非運行)時捕獲大多數非語法錯誤。Haskell 提供的功能包括:
- 強大的抽象能力;
- 內置的內存管理;
- 代碼的可重用性;
- 易于理解。
SQL、Lisp 和 Haskell 是我所見過的唯一可以把時間花在思考而不是打字上的編程語言。——Philip Greenspun
Haskell 的功能有助于提高程序員的生產率。Haskell 與其他編程語言非常相似,但只有一小部分開發人員使用。撇開挑戰不談,隨著開發者社區使用率的增加,可以證明 Haskell 和其他用于 AI 的競爭語言一樣出色。
Julia
Julia 是一種高性能的通用動態編程語言,可以創建幾乎任何應用,但最適合進行數值分析和計算科學。和 Julia 一起使用的工具還包括:
- 像 Vim 和 Emacs 這樣流行的編輯器;
- 像 Juno 和 Visual Studio 這樣的 IDE。
Julia 源代碼組織。
Julia 中有一些功能使其成為 AI 編程、機器學習、統計和數據建模的重要選擇,這些功能有:
- 動態類型系統;
- 內置的包管理器;
- 能夠進行并行和分布式計算;
- 宏和元編程能力;
- 支持多分派;
- 直接支持 C 函數。
Julia 是為了消除其他編程語言的弱點而構建的,和其他工具(如 TensorFlow.jl、MLBase.jl 和 MXNet.jl)集成后還可以用于機器學習,利用 Julia 的可伸縮性還可以做更多事。
谷歌趨勢——Julia 的使用趨勢。
總結
AI 工程師和科學家可以根據項目的需求,從多種編程語言中進行選擇。每一種 AI 編程語言都有優缺點。隨著這些語言的不斷改進,AI 開發很快就可以有更舒適的體驗,這樣就會有更多人加入這一創新浪潮。出色的社區支持使新人們可以更好地工作,社區對包和擴展的貢獻讓每個人的工作都變得更加輕松。