首頁 > 軟體

編輯器背後的程式觀

2020-06-16 17:27:44

最近看到新聞,Eclipse 的市場份額持續下滑,而 Intellij IDEA 異軍突起終於堅持不懈的超越了 Eclipse 成為了 Java 程式設計師的首選開發工具。

有感於此,回想起這麼些年來寫過不同的語言,用過不少的編輯器。以前的程式設計師和現在的程式設計師他們都各用什麼編輯器程式設計,不同語言的程式設計師偏愛什麼樣的編輯器來寫程式呢?

編輯器與語言

先來看看下面這張圖,來自 TIBOE 2016 十月最新的程式語言流行度排行。

Java 以後端和安卓開發為主,牢牢佔據第一。Java 的歷史不過短短二十年出頭,開發工具編輯器的變化從前五年的群雄混戰到後來 JBuilder 一統江湖。再之後 Eclipse 開源橫空出世取 JBuilder 而代之,當年 Eclipse 能戰勝 JBuilder 正是因為其開源免費而且社群極其活躍。考慮開發工具市場屬於小眾,高技術門檻而低利潤空間,本以為被開源免費這麼一衝擊,會再無商業公司單獨以此為核心業務了。沒想到的是打敗 Eclipse 的竟然是來自商業軟體開發工具公司 JetBrains 的 Intellij IDEA,真是二十年來又一輪迴,不禁唏噓。

後端的 C 和 C++ 開發想必還是用數十年不變的來自遠古時期的 Vi 或 Emacs,關於這兩個神奇的編輯器我們下面再詳述,暫時按下不表。而 C# 自然是用微軟系無所不能的編輯器 Visual Studio,對於我一個使用 Mac 的程式設計師確實沒怎麼用過微軟的工具,也就不多說了。而 JavaScript 作為現在前端的統治語言才是最讓我困惑的,在我還在寫一些 Web 頁面的時期(可能三、四年前)就一直沒找到過覺得適合 JavaScript 的編輯器。如今前端百花競放,好不熱鬧,看到的每一個前端程式設計師似乎都在用著不同的編輯器。

編輯器與神

兩個神奇的編輯器:vi 或 Emacs。它們都是誕生於 1976 年,MIT 的 Richard Stallman 和 Guy Steele 完成了 Emacs 的第一版,同時期在 Berkeley 的 Bill Joy 寫出了 Vi。

它們各自圍繞著完全不同的設計理念,其間差別巨大,各自都有自己的粉絲團並相互鄙視。有點像《火影》漫畫裡千手和宇智波一族爭戰多年,但目前這兩大編輯器尚未達成過一致——也就是從未有過一個同時集兩大編輯器特點於一身的編輯器出現過。

Emacs 圍繞的核心理念是快捷鍵和自定義的設定擴充套件,編輯器提供了一組命令並繫結在一系列的快捷鍵上。如果你發現有什麼想要的功能預設快捷鍵沒有提供,你可以自己去程式設計擴充套件它。所以,這個編輯器內建了 Lisp 語言直譯器,所有的設定都是通過這種語言來完成的。因此,要用好 Emacs,你得先學會一門語言,而 Lisp 則是計算機歷史上第二個高階語言。為了用個編輯器還得先學門語言,如此折騰,怪不得有「神」之編輯器一說。

因為 Emacs 對於高階功能的滿足就是提供一門可程式化語言自己去程式設計完成,所以有句誇張的說法是:“Emacs 是偽裝成編輯器的作業系統。”

而 Vi 則完全是另一種風格,它是基於命令的組合理念。在說組合之前,先需要了解 Vi 的幾種基本模式。Vi 有三種模式:

  • 命令模式(Command mode)
  • 插入模式(Insert mode)
  • 底線命令模式(Last line mode)

其中插入模式就是普通的編輯打字用,而命令模式才是用來組合的。怎麼理解命令組合?這裡舉個簡單的例子,以 Vi 中的刪除命令是 d,那麼它刪除什麼?這看你怎麼去組合它,比如另外一個命令 w 表示前移一個字,$ 表示移動到一行末尾,所以一組合 dw 這個命令表示刪除一個字,d$ 則表示刪除整行。之後你再學會一個新命令 y 表示複製文字,所以你應該知道怎麼組合命令來復制當前所在行的文字了吧。

Vi 相比 Emacs 顯然沒那麼折騰。當你熟練了 Vi 後就會在編輯文字時有一種運指如飛的感覺,所以 Vi 在江湖上又稱編輯器之「神」。

只是唯一的問題是 Vi 的命令實在太多,你想要達到運指如飛的感覺,可能先要把電腦桌面換成下面這個。

然後日復一日,天天使用,想必終有大成之日(反正我是沒能大成,一直磕磕碰碰,一陣不用就忘了)。而對於一個初學 Vi (之前只用過類似 Notepad 這類編輯器的使用者)剛上手的使用者來說,他的內心會有兩個疑問:怎麼輸入?怎麼關掉?而相比而言一個剛上手的 Emacs 使用者心中的疑問會少一個:好了,我試著敲了一些字母了,現在,怎麼關掉?

上面是網上一張經典編輯器學習曲線圖,有些年頭了,圖中有些編輯器已經消失在歷史長河中。我們只需要看看 Vi 和 Emacs 的曲線就好了。如果你真得嘗試過這兩個神奇的編輯器,就會對這個學習曲線有心有戚戚焉的感覺。

事實上現在直接用這兩個神奇編輯器的人不多了,從 Vi 發展下來只有一個 Vim 對其進行了增強,聽說最近還發布了新版本。而從 Emacs 的核心理念發展繼承下來編輯器想必很多人都用過這兩個:Sublime Text 和 Atom。

Sublime Text 使用 Python 代替了 Emacs 中的 Lisp。Lisp 實在太古老了,Python 好歹還是前面程式語言排行榜第五嘛,大家的學習興趣和群眾基礎都會好很多。而 Atom 是 Github 近年新出的編輯器,它使用 CoffeeScript 取代 Lisp。這是什麼語言?好像排行榜裡沒有。它不過是 JavaScript 的馬甲,簡單說就是 CoffeeScript 會被編譯成 JavaScript。

編輯器與程式設計師

世界上有三種程式設計師,一種用 Emacs,一種用 Vi,剩下的是用其它編輯器的。對,剩下的那部分多半都是在用各類 IDE 的程式設計師,而事實上現在用 IDE 的程式設計師可能佔據了多數。

而程式語言排行榜第一的 Java,我想很多 Java 的初學者都是從 IDE 開始的。因為相比通用的編輯器,Java 的 IDE 確實提供了更高的效率。十多前我開始的 IDE 是 JBuilder,而在 Java 剛誕生的年代,它的第一個 IDE 是 Symantec 開發的 Visual Café,它幾乎是以席捲市場的姿勢迅速佔據了 Java 開發工具第一名的地位。後來同時期的競爭者還有 IBM 的 Visual Age For Java,至於 Borland 的 JBuilder 幾乎是最後起跑的參賽者。但 Java 的開發工具之戰似乎是一場漫長的馬拉松比賽,除了一開始的表現之外,更重要的是比誰能夠撐得比較久。JBuilder 以決絕的姿態後來居上,以每年一個大版本的速度持續疊代,在第四年也就是 JBuilder 4.0 時完成了反超,佔據了超過 50% 的市場份額。

而 2001 年 12 月左右,IBM 終於宣布把 Visual Age For Java 開放給 Eclipse 計劃,正式結束了 Visual Age For Java 五年來在 Java 開發工具市場的競爭,而這正是對 Eclipse 誕生影響最重大的事件。之後 Eclipse 以開源免費開放的架構推出後,雖然 Borland 也算是一家傳奇公司(曾有另一成功產品 Delphi)其態度充滿了商業的嚴謹,而 JBuilder 也堪稱經典,但 Eclipse 的那種瀟灑和自由,使用者的那種強烈歸屬感,溢於言表,而我使用的最後一版停留在了 JBuilder X。

作為一名十來年的 Java 程式設計師,我在近兩年又逐步從 Eclipse 切換到了 Intellij IDEA。曾經瀟灑自由的 Eclipse 似乎變得越來越笨拙與卡頓了,所以程式設計師又找到了新歡拋棄了舊愛。

不過無論是編輯器也好,IDE 也罷,都是工具。而工具是用來放大你的才幹,提升你的效率的。所以我並不支援那種一輩子只需要用好一種編輯器的程式觀。事實上在我眼中,我把工具分成兩派:

  • Default
  • Preference

Default 指工具背後的程式觀是提供足夠好的預設功能,絕大部分時候(99%)你只需要使用工具提供的預設功能,而預設的功能包括一些品味性的選取(比如:顏色、背景、字型)都是開發工具的人眼中最合適的選擇。

Preference 則是隨意的提供一些預設功能,然後提供極強的可客製化化和可延伸性,讓使用者按照自己的偏好去客製化使用。

我感覺,Apple 大部分的軟硬體產品反映的都是 Default 背後的程式觀。而 Linux/Unix 世界大部分的軟體都反映了 Preference 的程式觀。而應用到編輯器,我自己則一直選擇符合 Default 程式觀的產品,因為我對用好工具去解決面臨的問題的興趣超過去折騰工具本身啊。

有完全不用 IDE 的 Java 程式設計師麼?據我所知沒有,但我知道一個不太用 IDE 的 Java 程式設計師——Joshua Bloch。他是一個著名的 Java 程式設計師了,JDK 集合框架和多個其他庫的編寫者,以及 Effective Java 一書的作者(PDF下載見 http://www.linuxidc.com/Linux/2016-11/137370.htm)。他對編輯器或工具的看法是:“因為我是個老傢伙了,Emacs 的快捷鍵已經長在我的腦袋裡了。”,所以他習慣用 Emacs 來自己寫一些小程式或庫,但對一些需要多人合作的大東西,還得求助於現代 IDE 的幫助,比如:Intellij IDEA。

從某種意義上,我是支援這種極簡主義的程式設計觀點的。現代 IDE 嘗試整合太多功能,把編譯、偵錯、打包、執行集於一身,在方便的同時,也無怪乎 IDE 變得越來越笨重。用好工具的訣竅就是搞清楚工具背後的核心理念以及搞清楚我到底為什麼必須用這個工具,而不是工具提供了什麼我就需要去用。

這篇文章是在 Atom 編輯器上完成的,它的 Default 模式幾乎滿足了我的全部需求。在滿足 Preference 的前提下兼具靈活和強大,除了讓使用者學一門程式語言還有別的辦法麼?是的,我還不會 CoffeeScript。

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-11/137365.htm


IT145.com E-mail:sddin#qq.com