Elixir 是一種動態函數式語言,用於建置可擴充且可維護的應用程式。
Elixir 在 Erlang VM 上執行,以建立低延遲、分散式且容錯的系統而聞名。這些功能和 Elixir 工具讓開發人員可以在各種產業的許多領域中發揮生產力,例如網頁開發、嵌入式軟體、機器學習、資料管道和多媒體處理。
以下是簡要說明
iex> "Elixir" |> String.graphemes() |> Enum.frequencies()
%{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1}
在生產環境中使用 Elixir 的公司
查看更多案例 →平台功能
可擴充性
所有 Elixir 程式碼都在輕量級執行緒 (稱為處理程序) 中執行,這些處理程序是獨立的,並透過訊息交換資訊
current_process = self()
# Spawn an Elixir process (not an operating system one!)
spawn_link(fn ->
send(current_process, {:msg, "hello world"})
end)
# Block until the message is received
receive do
{:msg, contents} -> IO.puts(contents)
end
由於其輕量級特性,您可以在同一台機器上同時執行數十萬個處理程序,有效率地使用所有機器資源 (垂直擴充)。處理程序也可以與執行在不同機器上的其他處理程序通訊,以協調多個節點上的工作 (水平擴充)。
與 Numerical Elixir 等專案結合後,Elixir 可擴充至多個核心、叢集和 GPU。
容錯性
關於生產環境中軟體的不可避免的事實是:事情會出錯。當我們考慮網路、檔案系統和其他第三方資源時,情況更是如此。
為了對故障做出反應,Elixir 監督程式會說明當事情出錯時如何重新啟動系統的某些部分,並回到保證會運作的已知初始狀態
children = [
TCP.Pool,
{TCP.Acceptor, port: 4040}
]
Supervisor.start_link(children, strategy: :one_for_one)
容錯性和訊息傳遞的結合,讓 Elixir 成為事件驅動系統和強健架構的絕佳選擇。例如 Nerves 等架構建立在這個基礎上,以利於可靠的嵌入式/IoT 系統的生產開發。
語言功能
函數式程式設計
函數式程式設計推廣一種編碼風格,可協助開發人員撰寫簡潔、精確且可維護的程式碼。例如,模式比對讓我們能夠優雅地比對並斷言特定條件,以便執行某些程式碼
def drive(%User{age: age}) when age >= 16 do
# Code that drives a car
end
drive(User.get("John Doe"))
#=> Fails if the user is under 16
Elixir 仰賴這些功能來確保您的軟體在預期的限制下運作。如果沒有,別擔心,監督程式會支援您!
可擴充性和 DSL
Elixir 的設計具備可擴充性,讓開發人員可以自然地將語言擴充至特定領域,以提高其生產力。
舉例來說,讓我們使用 Elixir 的測試架構 ExUnit 撰寫一個簡單的測試案例
defmodule MathTest do
use ExUnit.Case, async: true
test "can add two numbers" do
assert 1 + 1 == 2
end
end
async: true
選項允許 test
並行執行,使用盡可能多的 CPU 核心,而 assert
功能可以內省您的程式碼,在發生故障時提供出色的報告。
其他範例包括使用 Elixir 編寫 SQL 查詢、將 Elixir 的子集編譯到 GPU 等。
工具功能
不斷成長的生態系統
互動式開發
像 IEx(Elixir 的互動式殼層) 等工具,利用語言和平台提供自動完成、除錯工具、程式碼重新載入,以及格式良好的文件。
$ iex
Interactive Elixir - press Ctrl+C to exit (type h() ENTER for help)
iex> h String.trim # Prints the documentation
iex> i "Hello, World" # Prints information about a data type
iex> break! String.trim/1 # Sets a breakpoint
iex> recompile # Recompiles the current project
像 Livebook 等程式碼筆記本,讓您能直接從瀏覽器與 Elixir 互動,包括支援繪圖、流程圖、資料表、機器學習等更多功能!