譯者 | 晶顏
審校 | 重樓
盡管我們很喜歡編程語言,但不可否認它們常常像件“緊身衣”,讓人感覺束縛和窒息。它們是一組復(fù)雜的語法規(guī)則,如果我們破壞了它們——即使只有一次——編譯器就會開始發(fā)出錯誤消息。定義每一件小事都有規(guī)則,例如命名變量的最佳方式或如何縮進代碼。語言設(shè)計者聲稱這些約束是一個特性,而非一種缺陷。

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

























