譯者 | 晶顏
審校 | 重樓
盡管我們很喜歡編程語言,但不可否認它們常常像件“緊身衣”,讓人感覺束縛和窒息。它們是一組復雜的語法規則,如果我們破壞了它們——即使只有一次——編譯器就會開始發出錯誤消息。定義每一件小事都有規則,例如命名變量的最佳方式或如何縮進代碼。語言設計者聲稱這些約束是一個特性,而非一種缺陷。
多年來,聰明的開發人員已經想出了很多方法來用他們自己獨特的風格編寫代碼。預處理器就是彌補這一差距的關鍵,它會在代碼編譯之前進入管道,以修復所有奇怪的扭曲和保持編碼樂趣的個人風格。
預處理器其實并不是什么新鮮事物。像C這樣的語言多年來一直依賴于它們。但是最近它們變得越來越流行,因為開發人員創造了更多的表達方式,讓程序員可以隨心所欲地編寫軟件。到了編譯的時候,所有這些獨特的風格都會被悄悄地刪除和替換,讓最終版本能夠符合該語言的細致規則。
為了幫助程序員擺脫束縛,這里列出了一些預處理代碼的方法。其中包括特定于語言的預處理器,這些預處理器可以彌合數據科學家和開發人員之間的差距,甚至可以將美式英語轉換為更適合大洋彼岸同事的語言。
LESS和SASS
CSS(層疊樣式表)作為前端入門的三駕馬車之一,其作用之大、地位之重可想而知。然而,CSS不像其他編程語言能夠定義變量、常量、條件語句等,也不能提供重用性,對后期的代碼維護也十分復雜。針對以上問題,CSS預處理器應運而生。
LESS是一個使用廣泛的CSS預處理器,它通過引入變量、嵌套規則、混合、運算和函數等動態語言的特性,極大地擴展了CSS的功能,同時顯著減少了CSS的代碼量,提高了代碼的可讀性和可維護性。誕生于2007年的SASS則是最早且最成熟的CSS預處理器,比CSS多出很多功能,包括變量、嵌套、運算、混入、繼承、指令、函數等。
SASS與LESS的主要區別在于SASS需要Ruby環境,日常開發使用SASS插件(Live Sass Compiler或其他)(運行在服務器端);LESS則基于JavaScript,需要引入LESS.js來處理代碼輸出CSS(客戶端運行,也就是瀏覽器運行)。此外,兩者在變量符、輸出風格以及條件語句等方面也有諸多不同。不過,這兩種工具都可以讓你以程序員的觸覺和敏感性來清理看似無窮無盡的CSS布局選項列表。
AbsurdJS
有些人喜歡一致性,喜歡使用一種特定的語言。如果你是JavaScript的粉絲,并且想用它的力量來制作你的CSS,那么AbsurdJS將是你的理想預處理器。
AbsurdJS是一個用JavaScript編寫的能夠支持HTML和CSS的預處理器。你可以使用AbsurdJS把JavaScript、JSON、YAML轉換成HTML和CSS。它支持Nodejs和瀏覽器,并且一個額外的好處是提供流行編程語言的語法,如JavaScript。
正如其他預處理器一樣,它具有如文件導入、變量、媒體查詢冒泡算法、 混合、嵌套選擇器等諸多功能,可被用作純JavaScript以使用變量來生成CSS文件或者實現其他的動態功能。
像LESS和SASS一樣,這個預處理器也可以讓你像程序員而不是設計師那樣思考。
Bython
一些開發人員喜歡使用大括號來定義代碼塊,而另一些人則更喜歡按空格鍵和tab鍵。Python是為喜歡良好縮進的程序員設計的?,F在它變得更加強大和普遍,一些喜歡花括號的人可能也想要使用Python庫和工具。Bython作為一個預處理器,將允許你保留大括號和Python庫。你只需要像平常一樣編寫代碼,剩下的全部交由Bython來完成。它會自動將花括號替換為縮進,這樣你就不必按空格鍵了。
Pypreprocessor
長期以來,C語言為C程序員提供了使用#ifdef等預處理語句對代碼做出復雜決定的機會,#ifdef可以打開和關閉大塊代碼?,F在Python程序員可以用Pypreprocessor做同樣的事情,Pypreprocessor是一個動態庫,允許你使用標志和元變量使代碼隨意消失和重新出現。
TypeScript
JavaScript最初是為需要向主要由HTML構建的網站添加短代碼塊的Web程序員設計的。如果你不想拼寫變量的類型,也沒什么大不了的,因為JavaScript代碼塊很小,而且易于理解。不過,這種情況已經發生了變化,現在許多開發人員使用成千上萬行JavaScript構建復雜且非常動態的站點。
考慮到JavaScript語言本身的局限性,TypeScript作為一個折衷方案應運而生。TypeScript是微軟開發的一個開源的編程語言,通過在JavaScript的基礎上添加靜態類型定義構建而成。TypeScript通過TypeScript編譯器或Babel轉譯為JavaScript代碼,可運行在任何瀏覽器,任何操作系統。
TypeScript仍然可以接受泛型JavaScript,這意味著你添加的所有類型信息都是可選的。TypeScript的預處理階段會在能找到錯誤的時候仔細檢查,然后輸出一些通用JavaScript引擎可以處理的程序。一些最流行的JavaScript框架(比如Angular)現在都依賴于TypeScript來實現強類型編程(strong typing,對變量的類型有嚴格的要求,類型錯誤在編譯時就能發現)。
CoffeeScript
對于每一個渴望用C風格語法編寫代碼的Python程序員來說,都渴望能夠實現自由和簡單地編寫程序。CoffeeScript就是這一訴求的答案。它現在有許多變體,如ToffeeScript、Civet、 Storymatic、CoffeeScript II: The Wrath of Khan,以及其他十幾種變體。所有這些語言都讓我們免去了舉起右手小指按分號鍵的繁瑣工作。它們還提供了一些簡潔的特性,比如異步語法和精細的元編程機制。結果就是代碼更簡潔,標點符號更少了,至少在CoffeeScript程序員看來,這更容易閱讀。
Handlebars和Pug
現代代碼通常包含許多文本塊,其中包含最終人類用戶的消息。它們通常充滿了許多插入和自定義。像Handlebars和Pug這樣的模板系統有助于加快編寫這些人類可讀文本塊的速度,而無需編寫粘合字符串所需的低級代碼。你只需編寫文本,該模板系統就會處理將所有部分拼接在一起的雜務。
AWK
Unix命令行工具是處理純文本的最簡單和最強大的工具之一。AWK以它的三位創建者Alfred V. Aho、Peter J. Weinberger和Brian W. Kernighan的名字命名,它將許多命令鏈接在一起,用于從行中提取數據并對其進行排序和過濾。程序員還會使用它在主程序導入原始數據之前清理/處理管道中的原始數據。
Vapour
R是一門主要由統計學家創造的強大語言,這些統計學家通常像數學家而非計算機程序員那樣思考。這并不是一件壞事,但它可能成為使用R中所有優秀庫的障礙,這些庫在編程設計中缺乏一些偉大的進步。Vapor作為一個預處理器,將允許R用戶像程序員一樣思考,特別是像那些喜歡使用類型系統來捕捉錯誤和強化結構的程序員一樣思考。Vapou的開發人員表示,它仍處于早期的alpha階段,所以他們可能會增加新的功能和調整語法。最終目標是讓工具隨著用戶的需求快速發展。
Spiffing
并不是所有說英語的人都以同樣的方式使用英語,尤其是在不同的大陸和文化中。Spiffing是一種可以將用美式英語編寫的代碼翻譯成英式英語的預處理器。這聽起來有點傻,但這并不意味著它沒有用處或無法彌合文化鴻溝。如果它流行起來,也許有一天,開發人員會構建出預處理器,這樣它就能把相當直接的美式語言轉換成更含蓄的英式語言。例如,我們可以使用perchance- else語法代替if-then語句。
Linting preprocessors
并不是所有的預處理器都會轉換代碼。有些預處理器會跟在我們后面尋找遺漏的漏洞。最初的Unix命令行工具“lint”已經發生變化,現在在許多語言開發堆棧中都可看到它作為預處理器的身影。這些linting工具(或linters)會修復格式、強制命名約定,甚至修復一些語法和語義錯誤。流行的版本包括適用于Ruby代碼的RuboCop,適用于Python的Pylint以及適用于JavaScript的ESLint(ECMAScript)。
用于文檔的預處理器
一些預處理器還會產生可運行代碼以外的東西。Sphinx、MkDocs和Doxygen等工具能夠分析文件,并直接從代碼創建一組帶注釋和交叉引用的文檔文件。這些工具設計用于多種語言,但幾乎所有語言都有自己的官方預處理器。流行的例子包括Javadoc、Rustdoc、Godoc和JSDoc。
集成數據報告的預處理器
數據科學家不僅僅會說R語言。他們還用人類語言編寫復雜的數據報告,其中充滿了R創建的圖表、表格和圖形。多年來,數據科學家不僅為R創建了復雜的預處理器,還為排版語言LaTeX創建了復雜的預處理器??茖W家用R和人類語言編寫所有內容,然后預處理器將其分解,將計算指令發送給R,將排版指令發送給LaTeX。與此同時,它會調整各個部分,這樣R生成的圖片就會出現在你文檔中的正確位置。然后,LaTeX將它們折疊成最終的PDF,該PDF由文件的人類語言部分生成。它在完成所有這些工作的同時,還會組織頁面引用和插圖編號以保持一致。
此類預處理有各種不同的選擇,具備不同的優勢和強項。R Markdown是普通Markdown的一種變體,可用于合并計算和數據分析。它還可以合并來自Python或SQL等語言的結果來生成幻燈片、文檔、書籍和網站。Knitr和它的前身Sweave是兩個緊密結合的預處理器,都得到了Rstudio的良好支持。對于那些想要將Python與LaTeX合并的人,還有Pweave可供選擇。有一天,或許還會出現一個元版本,將所有這些合并到一個大的預處理器中。
使用AI進行預處理
所有的預處理器都需要一些配置。那么,為什么不讓人工智能來做呢?有些人已經將他們的預處理器上傳到了LLM(大型語言模型),并要求它修復所有錯誤。在一個例子中,一些精打細算的人在開發者告訴他們重寫Agda編譯器來實現更新需要花費超過100萬美元后勃然大怒。有人想出了一個好主意,從他們的代碼庫中上傳所有500多個文件到Anthropic的Sonnet-3.5。瞧!一眨眼的功夫,編譯器就被轉換成了TypeScript。開發人員報告稱,大多數代碼在沒有干預的情況下均運行良好。LLM并不完美,但它們讓我們更接近這樣一個世界:我們只要揮揮手,機器就會像變魔術一樣為我們做事。
原文標題:14 great preprocessors for developers who love to code,作者:Peter Wayner