第27章 新項目茉莉工具一號
又過了幾天,DeepFlow 的反向傳播終於跑穩了。
但陳一然發現一個問題,他忍不了了。
那就是他打字的時候,TextMate 會卡。
不是每次都卡,但越來越頻繁。本來照著茉莉的知識,雙手打得飛快,突然光標就莫名其妙的停住了,等個一兩秒才把字蹦出來。他手已經敲下去了,有的時候直接吞子打亂了。
陳一然有種,玩勁舞團,空格敲的正爽,突然音樂停了的感覺。
一開始他以為是文件太大。DeepFlow 的代碼已經寫了快一千多行了,但是感覺也不至於吧,正常寫個 word 什麼的,比這個字數多多了啊。
又以為是內存不夠,可 MacBook Pro 17 寸頂配,8G 內存,在 2010 年應該不算差了。
「茉莉,是不是,我們硬體不太行了啊。」
【打開 Activity Monitor 看看各種沿用情況。】
陳一然聽話的打開了 Activity Monitor 看了一眼, TextMate 占了不到兩百兆,CPU 偶爾飆到百分之十幾,大部分時候都很安靜。
【看來是軟體問題吧,我們換個軟體試試?】
蘋果自帶的 Vim 和 Nano 更難用,否則陳一然也不會買了 TextMate 來用,正正 50 刀呢。
陳一然打開谷歌,搜了一下 Mac 上的代碼編輯器。2010 年的選擇並不算多,之前搜過 TextMate 是最主流的,但不是唯一的。
他先試了試 Sublime Text,這個編輯器 2008 年出的,速度確實快,打開文件幾乎秒開,不會像 TextMate 那樣卡。但功能太少了,連代碼片段都沒有,更別說自動補全。
寫 Python 的時候連縮進都要自己管,和 TextMate 比起來就像從轎車換成了摩托車。快是快了,但是對人肉打字機陳一然非常的不友好。
又試了 BBEdit,這是 Mac 上的老牌編輯器,1992 年就有了,功能比 TextMate 還多。但界面丑得離譜,看起來像上世紀的軟體,而且它強項是 HTML 和文本處理,寫 Python 的體驗很差,語法高亮支持的語言倒不少,但代碼補全基本沒有。
試了一圈,沒一個讓他滿意的。要麼快但功能少,要麼功能多但慢又丑。最後還是回到了 TextMate。倒是很多論壇都在說 TextMate2.0 的事情,但是據說作者好久沒都沒出現了。大家都猜,2.0 應該難產甚至流產了。
只能先用回 TextMate,可剛打開沒多久又卡了。
「茉莉,想點辦法啊茉莉,有沒有什麼簡單的方法優化一下呢。」
【TextMate 1.x 的文本渲染引擎在處理大文件時效率不高,隨著碎片增多也會造成混亂,這個沒辦法解決。】
想到了之前茉莉編寫的翻頁小腳本,陳一然覺得,可以試試搞個新項目。
TextMate 卡,Sublime 功能少,BBEdit 丑,Vim 不會用。
它們功能也很一般,陳一然打錯字的時候,沒有一個編輯器會提醒他。別的程式設計師可不像他有茉莉在後台提醒,可能打錯之後,就錯到最後了又要回頭費勁的找那裡拼錯了。
在陳一然淺薄的知識里,覺得這功能應該不難啊,後世隨便說很麼打字軟體糾錯能力總是有的吧。
還有括號配對這種低級錯誤,他每天至少犯兩三次。茉莉一天不知道多少次提示他少打一個右括號,普通程式設計師天天這麼操心,掉頭髮簡直理所當然。
「茉莉,你說寫文章都能自動糾錯,Word 里打錯一個字底下就畫紅線。編程怎麼就沒有這種東西?」
【編程的糾錯比自然語言複雜得多,需要理解代碼的語義。事實上之前 BBEdit 的介紹里是支持標錯的,你使用時沒有觸發,而且他應該是基於正則表達式和當前文件緩存。 所以,意義並不大。
如果要更好的實現這個功能,需要加入一個抽象語法樹,讓它能讀取整個項目的結構。TextMate 目前不支持插件,但是,我們可以自己做一個編輯器?】
「對的,這就是我的意思,我們可以搞的吧。」
【理論上可以,但這不是一個小工程。】
「需要進行一定的推理運算之類的嗎?」
【是的,我簡單的的想了一下,我可以設計一個部髒標記傳播算法,還需要一個增量解析的數學模型,這樣才可以保證體積的輕量型。我們可以用純 C 語言寫一個代碼分析進程,Objective-C 和 Cocoa 框架,應該可以實現一個支持無限行數不卡頓的文本渲染引擎。】
陳一然走到冰箱,從冷凍層抽了兩個前幾天才到貨的運動員冰袋,一個貼在額頭上,一個擱在後脖子上,順手又拿了兩個冰淇淋。
拿出手機,在五月花點了三碗烏龍麵。邊上的零食架上又摸出一袋奧利奧和兩根能量棒,全堆在桌上。
「上吧茉莉!啟動!干就完了!」
他一邊吃一邊刷著網頁等茉莉,總得先看看市場情況。
Reddit 上 r/programming 又有人在罵 TextMate 2.0 跳票,底下評論區有人說了句 「TextMate is dead」。
還有人回復 「I love TextMate's simplicity, but the lack of real-time error checking is killing me. I have to compile just to find a typo. In 2010.」
說得真對,都 2010 年了,Word 都能畫紅線了呢。
沒看幾分鐘,陳一然就感覺身體情況已經不足以支撐他看網頁了,他只能躺屍。
每五分鐘,茉莉都會提示陳一然測下體溫,以防不小心把自己燒死。
還好,一直也只是低燒。之前茉莉推測,身體有自我保護,溫度過高他也會卡頓好像是真的。
但是這是不是意味著,以後他要是真的發燒了,茉莉就會運行不良。
就這麼迷迷糊糊的想著,外賣到了,連吃了三碗面小肚子撐的溜圓之後,茉莉發聲了。
【思路基本理清了,我還是沒敢過大的推理情況,所以需要我們實際編輯的時候稍微試錯下。但是,整體來是沒有問題的。】
「雖然我也不一定聽得懂,但是你給我說說。」
【核心思路是兩個:第一,把界面和代碼分析分到不同的進程里跑。TextMate 卡是因為界面渲染和語法分析擠在一個線程里,分析一卡,界面就跟著卡。分開之後,分析再慢也不影響打字。】
「這跟瀏覽器幹的事差不多吧?Chrome 每個標籤頁都是獨立進程。」
【原理類似。第二,代碼分析不能只做正則匹配,要真正理解代碼結構。這就需要一個語義分析引擎,實時解析代碼的抽象語法樹,構建符號表,跟蹤變量的定義和引用。有了這個,就能做到實時的錯誤檢測和智能補全。
不只是給關鍵字變個顏色,而是真的看懂你寫了什麼。變量在哪裡定義的,有沒有拼錯,括號有沒有配對,函數參數對不對。你打錯了,當場就能標出來,不用等運行。】
「所以用 Python 寫?」
【性語義分析需要遍歷整個代碼的語法樹,Python 的執行速度不夠快。而且無法直接與作業系統底層的應用程式二進位接口無縫對接。需要用 C++ 寫核心框架,只有 C++ 既能提供極高的抽象能力,又能毫無損耗地轉化成機器碼。
NET 生態有成熟的元數據系統和 XML 文檔,可以利用 Mono 運行時做跨平台。先做好 C# 的支持,驗證架構可行,再擴展其他語言。】
「Mono 又是什麼?」
【.NET 的開源跨平台實現工具。微軟的 .NET 只跑在 Windows 上,Mono 讓 C# 程序可以在 Mac 和 Linux 上運行。我們的編譯器如果做好,應該可以代替 mono,我們的編譯會更好,也可以直接支持.NET】
「茉莉,這個做出來,有人會買嗎?」
【根據論壇上的反饋,對更好代碼編輯器的需求是真實存在的。TextMate 2.0 跳票導致大量用戶在尋找替代品,但目前沒有一款 Mac 編輯器能同時做到速度快、功能全、有實時錯誤檢測。
如果我們的工具能做到這些,是有商業潛力的。並且,我們還支持.NET,應該會有銷路。】
「那就先搞這個,DeepFlow 不急,先搞定工具,之後幹什麼都會快點。」
【收到,項目代號?】
「項目代號,茉莉工具一號。」
【收到。Jasmine Tool No. 1 項目啟動。
但陳一然發現一個問題,他忍不了了。
那就是他打字的時候,TextMate 會卡。
不是每次都卡,但越來越頻繁。本來照著茉莉的知識,雙手打得飛快,突然光標就莫名其妙的停住了,等個一兩秒才把字蹦出來。他手已經敲下去了,有的時候直接吞子打亂了。
陳一然有種,玩勁舞團,空格敲的正爽,突然音樂停了的感覺。
一開始他以為是文件太大。DeepFlow 的代碼已經寫了快一千多行了,但是感覺也不至於吧,正常寫個 word 什麼的,比這個字數多多了啊。
又以為是內存不夠,可 MacBook Pro 17 寸頂配,8G 內存,在 2010 年應該不算差了。
「茉莉,是不是,我們硬體不太行了啊。」
【打開 Activity Monitor 看看各種沿用情況。】
陳一然聽話的打開了 Activity Monitor 看了一眼, TextMate 占了不到兩百兆,CPU 偶爾飆到百分之十幾,大部分時候都很安靜。
【看來是軟體問題吧,我們換個軟體試試?】
蘋果自帶的 Vim 和 Nano 更難用,否則陳一然也不會買了 TextMate 來用,正正 50 刀呢。
陳一然打開谷歌,搜了一下 Mac 上的代碼編輯器。2010 年的選擇並不算多,之前搜過 TextMate 是最主流的,但不是唯一的。
他先試了試 Sublime Text,這個編輯器 2008 年出的,速度確實快,打開文件幾乎秒開,不會像 TextMate 那樣卡。但功能太少了,連代碼片段都沒有,更別說自動補全。
寫 Python 的時候連縮進都要自己管,和 TextMate 比起來就像從轎車換成了摩托車。快是快了,但是對人肉打字機陳一然非常的不友好。
又試了 BBEdit,這是 Mac 上的老牌編輯器,1992 年就有了,功能比 TextMate 還多。但界面丑得離譜,看起來像上世紀的軟體,而且它強項是 HTML 和文本處理,寫 Python 的體驗很差,語法高亮支持的語言倒不少,但代碼補全基本沒有。
試了一圈,沒一個讓他滿意的。要麼快但功能少,要麼功能多但慢又丑。最後還是回到了 TextMate。倒是很多論壇都在說 TextMate2.0 的事情,但是據說作者好久沒都沒出現了。大家都猜,2.0 應該難產甚至流產了。
只能先用回 TextMate,可剛打開沒多久又卡了。
「茉莉,想點辦法啊茉莉,有沒有什麼簡單的方法優化一下呢。」
【TextMate 1.x 的文本渲染引擎在處理大文件時效率不高,隨著碎片增多也會造成混亂,這個沒辦法解決。】
想到了之前茉莉編寫的翻頁小腳本,陳一然覺得,可以試試搞個新項目。
TextMate 卡,Sublime 功能少,BBEdit 丑,Vim 不會用。
它們功能也很一般,陳一然打錯字的時候,沒有一個編輯器會提醒他。別的程式設計師可不像他有茉莉在後台提醒,可能打錯之後,就錯到最後了又要回頭費勁的找那裡拼錯了。
在陳一然淺薄的知識里,覺得這功能應該不難啊,後世隨便說很麼打字軟體糾錯能力總是有的吧。
還有括號配對這種低級錯誤,他每天至少犯兩三次。茉莉一天不知道多少次提示他少打一個右括號,普通程式設計師天天這麼操心,掉頭髮簡直理所當然。
「茉莉,你說寫文章都能自動糾錯,Word 里打錯一個字底下就畫紅線。編程怎麼就沒有這種東西?」
【編程的糾錯比自然語言複雜得多,需要理解代碼的語義。事實上之前 BBEdit 的介紹里是支持標錯的,你使用時沒有觸發,而且他應該是基於正則表達式和當前文件緩存。 所以,意義並不大。
如果要更好的實現這個功能,需要加入一個抽象語法樹,讓它能讀取整個項目的結構。TextMate 目前不支持插件,但是,我們可以自己做一個編輯器?】
「對的,這就是我的意思,我們可以搞的吧。」
【理論上可以,但這不是一個小工程。】
「需要進行一定的推理運算之類的嗎?」
【是的,我簡單的的想了一下,我可以設計一個部髒標記傳播算法,還需要一個增量解析的數學模型,這樣才可以保證體積的輕量型。我們可以用純 C 語言寫一個代碼分析進程,Objective-C 和 Cocoa 框架,應該可以實現一個支持無限行數不卡頓的文本渲染引擎。】
陳一然走到冰箱,從冷凍層抽了兩個前幾天才到貨的運動員冰袋,一個貼在額頭上,一個擱在後脖子上,順手又拿了兩個冰淇淋。
拿出手機,在五月花點了三碗烏龍麵。邊上的零食架上又摸出一袋奧利奧和兩根能量棒,全堆在桌上。
「上吧茉莉!啟動!干就完了!」
他一邊吃一邊刷著網頁等茉莉,總得先看看市場情況。
Reddit 上 r/programming 又有人在罵 TextMate 2.0 跳票,底下評論區有人說了句 「TextMate is dead」。
還有人回復 「I love TextMate's simplicity, but the lack of real-time error checking is killing me. I have to compile just to find a typo. In 2010.」
說得真對,都 2010 年了,Word 都能畫紅線了呢。
沒看幾分鐘,陳一然就感覺身體情況已經不足以支撐他看網頁了,他只能躺屍。
每五分鐘,茉莉都會提示陳一然測下體溫,以防不小心把自己燒死。
還好,一直也只是低燒。之前茉莉推測,身體有自我保護,溫度過高他也會卡頓好像是真的。
但是這是不是意味著,以後他要是真的發燒了,茉莉就會運行不良。
就這麼迷迷糊糊的想著,外賣到了,連吃了三碗面小肚子撐的溜圓之後,茉莉發聲了。
【思路基本理清了,我還是沒敢過大的推理情況,所以需要我們實際編輯的時候稍微試錯下。但是,整體來是沒有問題的。】
「雖然我也不一定聽得懂,但是你給我說說。」
【核心思路是兩個:第一,把界面和代碼分析分到不同的進程里跑。TextMate 卡是因為界面渲染和語法分析擠在一個線程里,分析一卡,界面就跟著卡。分開之後,分析再慢也不影響打字。】
「這跟瀏覽器幹的事差不多吧?Chrome 每個標籤頁都是獨立進程。」
【原理類似。第二,代碼分析不能只做正則匹配,要真正理解代碼結構。這就需要一個語義分析引擎,實時解析代碼的抽象語法樹,構建符號表,跟蹤變量的定義和引用。有了這個,就能做到實時的錯誤檢測和智能補全。
不只是給關鍵字變個顏色,而是真的看懂你寫了什麼。變量在哪裡定義的,有沒有拼錯,括號有沒有配對,函數參數對不對。你打錯了,當場就能標出來,不用等運行。】
「所以用 Python 寫?」
【性語義分析需要遍歷整個代碼的語法樹,Python 的執行速度不夠快。而且無法直接與作業系統底層的應用程式二進位接口無縫對接。需要用 C++ 寫核心框架,只有 C++ 既能提供極高的抽象能力,又能毫無損耗地轉化成機器碼。
NET 生態有成熟的元數據系統和 XML 文檔,可以利用 Mono 運行時做跨平台。先做好 C# 的支持,驗證架構可行,再擴展其他語言。】
「Mono 又是什麼?」
【.NET 的開源跨平台實現工具。微軟的 .NET 只跑在 Windows 上,Mono 讓 C# 程序可以在 Mac 和 Linux 上運行。我們的編譯器如果做好,應該可以代替 mono,我們的編譯會更好,也可以直接支持.NET】
「茉莉,這個做出來,有人會買嗎?」
【根據論壇上的反饋,對更好代碼編輯器的需求是真實存在的。TextMate 2.0 跳票導致大量用戶在尋找替代品,但目前沒有一款 Mac 編輯器能同時做到速度快、功能全、有實時錯誤檢測。
如果我們的工具能做到這些,是有商業潛力的。並且,我們還支持.NET,應該會有銷路。】
「那就先搞這個,DeepFlow 不急,先搞定工具,之後幹什麼都會快點。」
【收到,項目代號?】
「項目代號,茉莉工具一號。」
【收到。Jasmine Tool No. 1 項目啟動。