2011年的早期试验

Elixir由巴西程序员若泽·瓦林主导创建。2014年的1.0发布说明把代码仓库的第一次提交追溯到2011年1月9日;这是项目留下的起始记录。瓦林在2011年约4月发布0.3.0版,开始用于自己的项目,实际使用却让他发现早期设计偏离了需要。

他希望得到有生产力且便于扩展的语言,同时利用Erlang已经具备的运行基础。旧版本离Erlang过远:调用既有模块需要另写包装,新模块出现后也要逐一跟进,维护工作因而不断增加。

参考:[2] [4]

放弃包装层,重新设计互操作

2011年12月23日,瓦林在开发邮件列表宣布已把重写版本放入主分支。他说明,旧Elixir与Erlang编译模块不能方便地直接互调,迫使他包装通用服务器等行为和数据类型;原先偏向面向对象的组织方式,也与不可变数据不易协调。

新的设计受到Clojure和Ioke的启发,保留多态与元编程目标,却更强调与Erlang衔接。瓦林在翌日解释,宏能把代码表示为树状结构,使条件和短路运算等构造可以用Elixir自身实现。重写调整了语言扩展的方法,也使早期示例需要重新编写。

参考:[1]

公司支持与0.5.0发布

瓦林后来回顾,2011年10月短暂停留旧金山时,他在耶胡达·卡茨帮助下理清了新版本的基础。2012年约2月,他向所在的软件公司Plataformatec提出赞助计划并获得支持。公司团队参与标识、网站与文档建设,早期用户也通过社区交流试用语言。

原计划在2012年4月推出的版本,因用户反馈而继续调整设计与语法。5月25日,0.5.0正式发布,公告明确称它是重写后的首次发布,并承诺稳定的语法与基本标准库。因此,2011年的起始开发与2012年的这一发布节点各有含义。

参考:[2]

在同一虚拟机上组织并发

Elixir使用Erlang虚拟机,通常称为BEAM,并兼容开放电信平台(OTP)的工具与设计方式。它不是另起一套并发运行时,而是让另一种语言直接利用既有的进程调度和分布式设施。各轻量进程拥有自己的状态,彼此通过消息交流,虚拟机把这些工作调度到处理器上。

戴夫·托马斯2014年的教材用并行映射说明这种组织:为集合中的各元素启动任务,分别应用一个函数,再收集结果。例如对1、2、3分别求平方,可得到1、4、9。任务执行可以重叠,结果仍能由调用者收集;这是把数据转换分派给轻量进程,并不意味着每个数都要占用一个操作系统进程。

参考:[3] [5]

宏把代码结构交给工具

瓦林2013年总结的三项设计目标是兼容性、生产力与可扩展性。语言采用较小核心,许多控制结构由宏实现。宏在编译阶段接收代码的表示,而不只是运行后得到的值,因此能够检查表达式并生成新的代码。

单元测试提供了具体例子。测试框架ExUnit中的“assert 1 + 2 == 4”会失败;assert作为宏,可以看出这里使用了相等比较,从而报告左侧计算出的3与右侧4的差别。简短的断言因此保留了可用于诊断的结构,而不是只给出一个真假结果。

参考:[3]

1.0版把语言与工具一起稳定下来

2014年9月18日,Elixir发布1.0版。瓦林当时统计,项目累计有189名贡献者和8005次提交。版本包括编译器、运行支持和标准库,也统一管理EEx模板库、ExUnit测试库、IEx交互环境、Logger日志设施及Mix构建工具;开发者可以在同一套工具中创建、编译和测试项目。

1.0公告提出语义化版本与兼容性预期,同时保留安全修复、错误修正等必要例外。这里还区分源码与二进制:同一小版本分支保持编译产物兼容,跨到下一小版本通常需要重新编译。Elixir由早期个人试验走向稳定发布,依靠的是互操作设计、社区贡献和配套工具的共同成熟。

参考:[4]