檢視原始碼 概觀

內建機制

Erlang 執行時系統內建了兩種互通性機制:分散式 ErlangNIFs。埠的一種變體是連結式驅動程式

分散式 Erlang

透過給予名稱,Erlang 執行時系統會成為一個分散式 Erlang 節點。分散式 Erlang 節點可以連接和監控其他節點。它也可以在其他節點上產生程序。不同節點上程序之間的訊息傳遞和錯誤處理是透明的。分散式 Erlang 系統中提供了許多有用的 STDLIB 模組。例如,global,它提供全域名稱註冊。分散式機制是使用 TCP/IP sockets 實現的。

何時使用: 分散式 Erlang 主要用於 Erlang-Erlang 通訊。如果 C 程式是以 C 節點的形式實作,它也可以用於 Erlang 和 C 之間的通訊,請參閱C 和 Java 函式庫

在哪裡閱讀更多資訊: 《Erlang》書籍中描述了分散式 Erlang 和一些分散式程式設計技術。

如需更多資訊,請參閱分散式程式設計

相關的手冊頁面如下

  • erlang ERTS 中的手冊頁面 (描述 BIF)
  • global Kernel 中的手冊頁面
  • net_adm Kernel 中的手冊頁面
  • pg Kernel 中的手冊頁面
  • rpc Kernel 中的手冊頁面
  • pool STDLIB 中的手冊頁面
  • slave STDLIB 中的手冊頁面

埠和連結式驅動程式

從 Erlang 的角度來看,埠提供了與外部世界通訊的基本機制。埠提供了一個面向位元的介面給外部程式。當埠被建立時,Erlang 可以透過傳送和接收位元組列表二進制(不是 Erlang 項)與其通訊。這表示程式設計師可能必須發明一個合適的編碼和解碼方案。

埠機制的實作取決於平台。對於 UNIX,會使用管道,並且假設外部程式會從標準輸入讀取並寫入標準輸出。只要外部程式可以處理實作埠的行程間通訊機制,它可以使用任何程式語言撰寫。

外部程式與 Erlang 執行時系統位於不同的 OS 行程中。在某些情況下,這是無法接受的。例如,考慮有非常嚴格時間要求的驅動程式。因此,可以根據某些原則用 C 撰寫程式,並將其動態連結到 Erlang 執行時系統。這稱為連結式驅動程式

何時使用: 埠可用於所有 Erlang 程式和其他程式在同一部機器上執行的互通性情況。程式設計相當簡單明瞭。

連結式驅動程式涉及用 C 撰寫特定的回呼函式。由於程式碼是連結到 Erlang 執行時系統,因此這需要非常好的技能。建議使用NIFs 而不是連結式驅動程式,因為它們提供了更豐富的功能集,並且可以使用用於長時間工作的 dirty 排程器

警告

有缺陷的連結式驅動程式會導致整個 Erlang 執行時系統洩漏記憶體、掛起或崩潰。

在哪裡閱讀更多資訊:《Erlang》書籍的「雜項項目」章節中描述了埠。附錄 E 中描述了連結式驅動程式。

BIF open_port/2 在 ERTS 中的 erlang 手冊頁面中有說明文件。

對於連結式驅動程式,程式設計師需要閱讀 Kernel 中的 erl_ddll 手冊頁面。

範例:中的埠範例。

原生實作函式 (Nifs)

NIF 提供了一種替代方法,使用連結式驅動程式將 C 程式碼連結到 Erlang 執行時系統。當與 OS 或其他外部函式庫互動時,NIF 可以提供普通 Erlang 函式的 C 實作。

警告

有缺陷的 NIF 會導致整個 Erlang 執行時系統洩漏記憶體、掛起、崩潰或洩漏敏感資訊。

何時使用:由於有缺陷的 NIF 可能會導致許多與穩定性和安全性相關的不同問題,因此建議盡可能使用外部埠。如果無法接受額外負擔,則 NIF 是與任何原生程式碼(無論是 C、C++ 還是 Rust)互動的良好解決方案。

在哪裡閱讀更多資訊: Erlang NIF 函式庫的 API 函式中描述了 NIF。

範例:NIF中的埠範例。

C 和 Java 函式庫

Erl_Interface

埠另一端的程式通常是 C 程式。為了幫助 C 程式設計師,開發了 Erl_Interface 函式庫

Erlang 外部項格式是以位元組序列(即二進制)表示 Erlang 項。這兩種表示法之間的轉換是使用下列 BIF 完成的

Binary = term_to_binary(Term)
Term = binary_to_term(Binary)

可以將埠設定為使用二進制而不是位元組列表。那麼就沒有必要發明任何編碼/解碼方案。Erl_Interface 函式用於解壓縮二進制並將其轉換為類似於 Erlang 項的結構。這種結構可以用不同的方式操作,轉換為 Erlang 外部格式,並傳送到 Erlang。

何時使用: 在 C 程式碼中,與 Erlang 二進制一起使用。

在哪裡閱讀更多資訊: 請參閱 Erlang Interface 使用者指南、命令參考和函式庫參考。在 Erlang/OTP R5B 和更早版本中,資訊是 Kernel 應用程式的一部分。

範例:Erl_Interface中的 Erl_Interface 範例。

C 節點

使用 Erl_Interface 函式來設定連線並與分散式 Erlang 節點通訊的 C 程式稱為 _C 節點_ 或隱藏節點。C 節點的主要優點是從 Erlang 程式設計師的角度來看,通訊非常容易,因為 C 程式的行為就像一個分散式 Erlang 節點。

何時使用: C 節點通常可用於裝置處理器(相對於控制處理器),在裝置處理器中,由於記憶體限制或應用程式特性(或兩者),C 比 Erlang 更好。

在哪裡閱讀更多資訊:請參閱Erl_Interface文件中的 ei_connect 部分。程式設計師還需要熟悉 TCP/IP sockets,請參閱標準協定中的 Sockets 和內建機制中的分散式 Erlang。

範例:C 節點中的 C 節點範例。

Jinterface

在 Erlang/OTP R6B 中,新增了一個類似於用於 Java 的 Erl_Interface 的函式庫,稱為 _jinterface_。它為 Java 程式提供了一個與 Erlang 節點通訊的工具。

標準協定

有時,需要使用標準協定在 Erlang 程式和另一個程式之間進行通訊。Erlang/OTP 目前支援 TCP/IP 和 UDP sockets:如下所示

  • SNMP
  • HTTP
  • IIOP (CORBA)

使用後三者之一需要對協定有充分的了解,並且本教學課程中不涵蓋。請分別參閱 SNMP、Inets 和 Orber 應用程式。

Sockets

簡而言之,面向連線的 socket 通訊 (TCP/IP) 包括在具有特定埠號的特定主機上啟動的起始器 socket(「伺服器」)。知道起始器主機名稱和埠號的連接器 socket(「客戶端」)可以連接到它,並且可以在它們之間傳送資料。

無連線 socket 通訊 (UDP) 包括在具有特定埠號的特定主機上的起始器 socket 和傳送資料到它的連接器 socket。

如需 socket 概念的詳細說明,請參閱有關網路程式設計的合適書籍。建議使用 W. Richard Stevens 的《UNIX Network Programming, Volume 1: Networking APIs - Sockets and XTI》,ISBN:013490012X。

在 Erlang/OTP 中,Kernel 中的模組 gen_tcpgen_udp 提供了對 TCP/IP 和 UDP socket 的存取。它們都易於使用,並且不需要有關 socket 概念的詳細知識。

何時使用: 用於在與 Erlang 程式相同或不同的機器上執行的程式。

在哪裡閱讀更多資訊: 請參閱 Kernel 中的 gen_tcpgen_udp 手冊頁面。

IC 和 CORBA

IC(Erlang IDL 編譯器)是一個介面產生器,它會根據 IDL 介面規範自動產生 Erlang、C 或 Java 中的 Stub 程式碼。請參閱 IC 使用者指南和 IC 參考手冊。

如需詳細資訊,請參閱corba repository