Elixir Programming Language 是 Ruby Programmer José Valim 嘗試提升Ruby效能時,發現Ruby沒有適合的工具來支持併行(Concurrency),所以他開始研究有沒有其他的語言或者技術可以使用,最後找到了 Erlang 這個古老的語言,並且創立了 Elixir 程式語言。
因為 Elixir 是基於 Erlang 所創造的語言,執行時也是使用 Erlang Virtual Machine ,所以承襲了 Erlang 的特性。
個人覺得跟其他語言比較不同的部分,是他可以在 run time 時加入更多的執行緒(在 Erlang 裡面稱作 process),彼此都是獨立的,且如果有一個 process 因為錯誤而死掉(Crash)的時候,不會影響到其他 process 的運行。
但為什麼不直接使用 Erlang 就好了,而需要創造另外一個 Elixir 但是運行在 Erlang 上面呢?我想應該是基於 Erlang 是 1986 年創造出來的語言,其 Syntax 對於目前程式語言比較格格不入,所以 Elixir 就像是一個語法糖,把 Erlang 變成了符合現代的程式語言。
第一次接觸 Elixir,會覺得根本是在寫 Ruby ,像是在建立 Module 的時候, Syntax 根本是同一個模子。
defmodule Test do
def post do
IO.inspect("Hello World")
end
end
但深究的話,其實會發現還是有本質上的不同,因為 Ruby 是物件導向(OOP)的關係,所有的東西都是物件,而該物件會有不同的方法來對其進行操作。
但 Elixir 是函數式語言(Functional Programming Language),沒有物件,所有的東西都是一個模組,而呼叫該模組的方法時,需要有符合該方法的 input argument,然後會產出 output,這邊可以將這個模組的方法看成是一個黑盒子(Black Box)
所以在寫 Elixir 的時候,通常都會看到,我們會先指令一個模組,然後呼叫他裡面的方法,並且給予他需要的 input:
String.upcase("hello world") # HELLO WORLD
如果是 Ruby 的話,就會直接對字串進行操作:
"hello world".upcase()
另外一個比較不同的地方,是Elixir 可以在同一個模組上面建立同一個方法,但是輸入不同的 argument:
defmodule Demo do
def print(%{key: _key} = map) do
IO.inspect("Your input is a map: #{inspect(map)}")
end
def print(string) when is_binary(string) do
IO.inspect("Your input is a string: #{string}")
end
def print(number) when is_number(number) do
IO.inspect("Your input is number: #{inspect(number)}")
end
end
其執行出來的結果會是:
Demo.print(%{key: "value"})
"Your input is a map: %{key: \"value\"}"
Demo.print("STRING VALUE")
"Your input is a string: STRING VALUE"
Demo.print(999)
"Your input is number: 999"
那如果你給他不屬於這三個型別的值呢?那他就會跟你抗議了:
** (FunctionClauseError) no function clause matching in Demo.print/1
The following arguments were given to Demo.print/1:
# 1
[1, 2, 3]
iex:9: Demo.print/1
因為程式語言叫做 Elixir 的關係,拿去查字典,發現他的意思是:萬靈藥,靈丹妙藥,長生不老藥
所以他的 package system 的指令式 mix ,把所有的魔藥都混合起來吧!
Erlang Programming Language
Elixir Programming Language
An Interview with Elixir Creator José Valim