函数式编程语言-Elixir
Elixir是一种函数式编程语言,建立在Erlang虚拟机之上。它是一种动态语言,灵活的语法与宏支持,利用Erlang的能力来构建并发、分布式、容错应用程序与热代码升级。采用Apache协议授权。
Elixir is a functional, meta-programming aware language built on top of the Erlang VM. It is a dynamic language that focuses on tooling to leverage Erlang's abilities to build concurrent, distributed and fault-tolerant applications with hot code upgrades.

José Valim是Elixir语言的设计者。他创造该语言的目标是在维持与现有Erlang工具链及生态环境兼容性的同时,让人们可以在Erlang虚拟机上进行扩展性更好的、高生产率的开发。
特性
基于Erlang虚拟机(BEAM)。
与Erlang语言的无缝衔接;与其相互调用几乎无任何额外开销。
基于宏的元编程能力,语言的抽象语法树作为头等公民。
基于协议的多态实现。受到Clojure启发,协议提供了动态分派机制。但是不可混淆于多分派,因为Elixir协议在一个单一类型上进行分派。
完善的文档支持;一切均为表达式;模式匹配。
通过消息传递(演员模型)支持 Shared-nothing 并行事务。
强调利用递归和高阶函数的函数式编程胜过基于副作用和循环的命令式编程。
惰性求值,拥有诸如futures和promises一类的异步流数据类型。
Unicode支持,UTF-8字符串。
创建的背景
2013年,巴西人José Valim(何塞)又发明了一个编程语言Elixir,他本科在巴西圣保罗大学读电气工程,后来在意大利都灵理工大学拿到硕士学位。这个编程语言知道的人不太多,但是很多著名公司都在使用它,如:Spotify,PepsiCo,Discord,Square Enix,Adobe,Slack,Pinterest,Toyota。
Elixir特别适合开发分布式、可扩展的、高并发的应用程序。Discord的CTO在2017年的一篇文章中说道:Discord 就是 其早期采用者, Erlang VM 是我们想要构建的高并发实时系统的完美候选者,过去两年,系统中的并发用户数已达到近 500 万,每秒有数百万个事件......
如果让我从头再选择一次的话,我还会选择Elixir。而在Stackoverflow 2021年的报告中,在38种编程语言中,Elixir是收入排行第三的编程语言。
何塞在意大利时他遇到了现在的波兰妻子,然后搬到了波兰。在发明Elixir之前,何塞已经是著名Web框架Ruby on Rails团队的核心成员。可惜的是Ruby语言在并发,多核的表现不咋滴,没有解决并发问题的适当工具。这让他有点沮丧,他不断研究其他解决方案,直到有一天,它发现了Erlang虚拟机。
Erlang虚拟机已经解决了高并发和分布式的问题,为什么不把Ruby移植上去呢?主要是Ruby的思想和概念和Erlang格格不入,没办法的何塞最终决定:发明一门新的编程语言Elixir。在设计上,何塞借鉴了Erlang,Clojure和Ruby的思想。
Erlang :函数式思想、基础设施
Ruby:优雅的语法、标准库、命名方式
Clojure :基于协议的多态实现
大家可能觉得一个大牛发明一门新语言是很容易的,其实并非如此。何塞并不是科班出身,也缺乏编译器的知识,也得从头学词法分析,语法分析......他看了几本经典编译书籍如龙书,更关键的是阅读了Erlang、Ruby、JavaScript等语言的解析器源代码,然后才开始动手。即使如此,何塞依然步履维艰,他的第一个Elixir原型非常糟糕,就像迷失在了山洞中的原始人,到处探索。等到第一个版本发布,已经是两年以后了。

一门新语言出现以后,如果获得众人关注是最难的一步。在这一点上,何塞充分学习了Rails创始人DHH的营销能力。他开始走出去,在各种活动上宣传Elixir,接受各种采访介绍Elixir,写各种文章为Elixir造势。提到它就不能不提Web框架Phoenix。
他们像当年的Rails一样,录制了一个视频:在15分钟内克隆一个Twitter。这个视频引发了不小的关注度,成功地引发了对Elixir和Phoenix的讨论,吸引了更多人来使用Elixir。Elixir的关键点和其他编程语言不同,Elixir的process并不是操作系统的进程(Process)或者线程(Thread);其process是非常轻量级的,在单台服务器上可以几十万,甚至上百万个process。这也正是Erlang平台的优势所在!
所以发明人何塞说:Elixir非常适合开发一切运行在socket上应用!
上世纪90年代,写一段代码,放在那里什么也不做,两年以后,新的硬件就会让它的性能提升一倍。现在摩尔定律失效了,CPU走向了多核,系统走向了分布式。多核和分布式让编程变得非常麻烦,但是Elixir用函数式编程的不变性和Erlang平台正好解决了这两个问题。如果有类似的需求,强烈建议关注下这门独特的编程语言,它也许就是帮助你击败竞争对手的秘密武器。
最新版本:1
此版本更新内容如下:
功能增强
[Logger] 添加了 Logger.enable/1 和 Logger.disable/1
向后不兼容改进
[GenEvent] 不再支持 {:swap_handler, ...} 作为回调返回值
[List] List.unzip/2 已被移除
v1.20 发布:正式成为 “渐进式类型” 编程语言
创始人 José Valim 于 6 月 3 日正式发布了 Elixir v1.20,这是一个里程碑式的版本 ——Elixir 正式成为一个渐进式类型(Gradually Typed)语言。这意味着开发者可以在不添加任何类型注解的情况下获得类型推断和类型检查的能力,同时也可以选择性地添加类型注解来获得更精确的类型验证。本次类型系统的实现采用了基于集合论的设计,支持并集、交集和否定运算等集合操作。这种设计使得类型表达更加精确和灵活,开发者可以更自然地描述复杂的数据结构和函数签名。引入的 dynamic () 类型是另一个重要特性,它提供了兼容性和类型收窄的能力,让渐进类型系统的过渡更加平滑。
def percentage_or_error(value) when is_integer(value) do
value_or_error =
if value > 1 do
value
else
"not well"
end
# ... more code ...
if value > 1 do
value_or_error / 100
else
String.upcase(value_or_error)
end
end
值得注意的是,这个类型系统能够发现 "已验证 bug"—— 即运行时必定失败的类型违规。开发者强调,这类验证的误报率极低,不会给开发者带来过多的噪音。Valim 在公告中提到,他们通过 "if T" 基准测试对类型系统进行了评估,在 13 个类别中通过了 12 个,显示出相当高的可靠性。在编译改进方面,v1.20 针对多核机器进行了优化,编译速度有显著提升。新引入的:module_definition 编译器选项为开发者提供了更细粒度的编译控制能力。这些改进对于大型项目的开发体验有直接帮助。
Valim 也明确表示,类型签名的引入将分步骤进行。当前的 v1.20 实现了类型推断和基础类型检查,下一步将是递归类型、参数化类型和地图键值遍历等功能。在这些功能完善之后,类型签名才会被正式引入语言。这种渐进式的演进策略是 Elixir 社区的一贯风格 —— 不追求一步到位,而是确保每个阶段的功能都稳定可用。这个版本得到了 CNRS、Remote 等机构的支持,Fresha 和 Tidewave 也提供了赞助。对于已经在使用 Elixir 的开发者来说,v1.20 是一个值得尽快升级的版本;而对于考虑使用 Elixir 的开发者来说,渐进类型的加入让这门语言在保持灵活性的同时,获得了更强的静态分析能力。
官方主页:http://elixir-lang.org/