译者 | 晶颜
审校 | 重楼
尽管我们很喜欢编程语言,但不可否认它们常常像件“紧身衣”,让人感觉束缚和窒息。它们是一组复杂的语法规则,如果我们破坏了它们——即使只有一次——编译器就会开始发出错误消息。定义每一件小事都有规则,例如命名变量的最佳方式或如何缩进代码。语言设计者声称这些约束是一个特性,而非一种缺陷。
多年来,聪明的开发人员已经想出了很多方法来用他们自己独特的风格编写代码。预处理器就是弥补这一差距的关键,它会在代码编译之前进入管道,以修复所有奇怪的扭曲和保持编码乐趣的个人风格。
预处理器其实并不是什么新鲜事物。像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是为喜欢良好缩进的程序员设计的。现在它变得更加强大和普遍,一些喜欢花括号的人可能也想要使用Python库和工具。Bython作为一个预处理器,将允许你保留大括号和Python库。你只需要像平常一样编写代码,剩下的全部交由Bython来完成。它会自动将花括号替换为缩进,这样你就不必按空格键了。
Pypreprocessor
长期以来,C语言为C程序员提供了使用#ifdef等预处理语句对代码做出复杂决定的机会,#ifdef可以打开和关闭大块代码。现在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创建了复杂的预处理器。科学家用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