保留JavaScript能力,改写表达方式

CoffeeScript由杰里米·阿什肯纳斯发起,目标来自网页开发者日常面对的代码复杂性。JavaScript已经能处理函数、对象和原型关系,但实现相同工作时,括号、分号和重复结构常遮住程序意图。CoffeeScript把重点放在作者书写和阅读的形式上。

阿什肯纳斯在2011年的书序中解释,他希望让开发者更直接地使用JavaScript中有用的机制,并保持两种语言之间较清楚的对应关系。因此,CoffeeScript源代码先被编译成JavaScript,再交给浏览器或其他JavaScript环境执行。这个选择让新语言能够利用已有执行引擎与程序库。

参考:[1]

从初版到自举编译器

项目发布记录把0.1.0版列在2009年12月24日。最初的编译器用Ruby编写;2010年2月21日发布的0.5.0版将其换成以CoffeeScript编写的自举编译器。编译器开始使用自己所处理的语言,语言的开发也成为对它自身的一项持续应用。

早期语法仍在快速调整。2010年1月的版本引入有意义的缩进,随后把函数符号改为后来熟悉的箭头形式。发布说明特别感谢利亚姆·奥康纳-戴维斯在缩进和表达式处理方面的帮助,显示项目通过协作者反馈完善规则。2010年12月24日,1.0.0版发布。

参考:[2]

一个列表程序怎样变短

伯纳姆的语言教材用求立方演示这种转换。定义函数可写成“cube = (num) -> Math.pow num, 3”,随后给出一个数字列表,再用“cubedList = (cube num for num in list)”逐项计算。箭头引出函数体,括号中的推导式把遍历和收集结果放在一起。

在相应的JavaScript写法中,这项工作需要函数定义、返回语句、结果数组、循环索引,以及把每次计算结果加入数组的操作。CoffeeScript把这些常见结构交给编译器展开。缩短的是表达过程;求立方、遍历和保存结果的工作仍要由生成的程序完成。

这种方法也保留了与原有代码混用的便利。字符串、数字及函数调用仍可与JavaScript程序交换,开发者可以逐步改写一部分文件,不必先把整个应用迁移到一个新的运行系统。

参考:[3]

可读性仍需要工程判断

马克·贝茨在2012年教材中记录,自己曾于2010年10月把0.9.4版用于客户项目,但当时的缺陷和缺失功能,加上项目只需要少量脚本,使他暂时放弃。后来在JavaScript工作量更大的应用中重试,才改变看法。这段经历表明,简洁语法的价值也取决于项目规模与工具成熟度。

教材同时提醒,CoffeeScript增加了一门团队需要理解的语言。程序员仍需知道生成代码怎样运行,并学习变量作用域、比较运算和程序库调用。团队在使用简洁语法的同时,也要理解对应的JavaScript行为。

参考:[4]

进入Rails的资源处理流程

2011年的Ruby on Rails 3.1把CoffeeScript纳入资源管线。官方指南说明,使用默认相关组件生成控制器时,可以同时生成以“.js.coffee”结尾的文件;Sprockets组织资源,CoffeeScript处理器将其转换为JavaScript。浏览器收到的是转换后的脚本。

这一集成把语言选择落实到项目文件和部署步骤中。开发时可以处理独立文件,生产环境则可预先编译并交由服务器发送静态资源。CoffeeScript因此进入常规的网页应用工作流,编译这一步不再完全依赖开发者手动维护。

参考:[5]

后续版本改变输出目标

2017年的CoffeeScript 2继续沿用简洁的表面语法,却改为生成现代JavaScript结构。例如,绑定箭头函数和类可以直接输出为JavaScript的箭头函数和class语法,并加入异步函数及JSX等支持。需要照顾较旧执行环境时,生成结果还可能经过Babel再次转换。

从最初用新语法生成既有脚本,到随着JavaScript演进调整输出形式,CoffeeScript始终把编译作为连接作者与运行平台的办法。它的早期历史包含明确的三个阶段:2009年初次发布、2010年自举实现,以及同年年底的1.0版。

参考:[6] [2]