非常教程

Erlang 20参考手册

指南:教程 | Guide: Tutorial

2.总览 | 2. Overview

2.1内置机制

Erlang运行时系统中内置了两个互操作机制,分布式Erlang端口。端口的变体是连接驱动程序

分布式Erlang

一个Erlang运行时系统通过给它起一个名字而成为一个分布式的Erlang节点。分布式Erlang节点可以连接到并监视其他节点。它也可以在其他节点产生进程。不同节点上的进程之间的消息传递和错误处理是透明的。分布式Erlang系统中提供了许多有用的STDLIB模块。例如,global提供全球名称注册。分发机制是使用TCP / IP套接字实现的。

何时使用:分布式Erlang主要用于Erlang-Erlang通信。如果C程序是作为C节点实现的,那么它也可以用于Erlang和C之间的通信C and Java Libraries

在哪里阅读更多内容: Erlang书中描述了分布式Erlang和一些分布式编程技术。

有关更多信息,请参阅 Distributed Programming.

相关手册页如下:

  • erlang ERTS手册页(介绍BIF)
  • global 内核中的手册页
  • net_adm 内核中的手册页
  • pg2内核中的手册页
  • rpc内核中的手册页
  • poolSTDLIB中的手册页
  • slaveSTDLIB中的手册页

端口和连接驱动程序

从Erlang的角度来看,端口提供了与外部世界进行沟通的基本机制。这些端口为外部程序提供了一个面向字节的接口。当创建一个端口时,Erlang可以通过发送和接收字节列表(而不是Erlang条款)与它进行通信。这意味着程序员可能不得不制定一个合适的编码和解码方案。

港口机制的实施取决于平台。对于UNIX,使用管道,假定外部程序从标准输入读取并写入标准输出。外部程序可以用任何编程语言编写,只要它可以处理实现该端口的进程间通信机制。

外部程序驻留在另一个OS进程中,而不是Erlang运行时系统。在某些情况下,这是不可接受的。例如,考虑非常困难时间需求的驾驶员。因此可以按照某些原则用C语言编写程序,并将其动态链接到Erlang运行时系统。这被称为链接驱动程序

何时使用:端口可用于Erlang程序和其他程序在同一台计算机上运行的各种互操作性情况。编程相当简单。

链接驱动程序涉及用C语言编写特定的回调函数。这需要非常好的技能,因为代码链接到Erlang运行时系统。

警告

错误的链接驱动程序导致整个Erlang运行时系统泄漏内存、挂起或崩溃。

在哪里阅读更多信息: Erlang书籍的“其他项目”部分描述了端口。链接的驱动程序在附录E中描述。

BIF open_port/2记录erlang在ERTS 的手册页中。

对于链接的驱动程序,程序员需要阅读erl_ddllKernel中的手册页。

示例:中的端口示例Ports

2.2 C与JAVA库

Erl_Interface

在港口另一端的程序通常是一个C程序。为了帮助C程序员,开发了Erl_Interface库,包括以下五个部分:

  • erl_marshalerl_etermerl_format,和erl_malloc:Erlang的外部术语格式的处理
  • erl_connect:与分布式Erlang进行通信,见C nodes下文
  • erl_error:错误打印例程
  • erl_global:访问全球注册名称
  • Registry:存储和备份键值对

Erlang外部术语格式是一个Erlang术语的表示形式,即字节序列,即二进制。两种表示之间的转换使用以下BIF完成:

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

可以将端口设置为使用二进制代替字节列表。因此没有必要发明任何编码/解码方案。Erl_Interface函数用于解包二进制文件并将其转换为类似于Erlang术语的结构。这样的结构可以以不同的方式进行操作,可以转换为Erlang外部格式,并发送给Erlang。

何时使用:在C代码中,结合Erlang二进制文件。

在哪里阅读更多:请参阅Erlang接口用户指南,命令参考和库参考。在Erlang/OTP R5B及更早版本中,信息是内核应用程序的一部分。

示例: Erl_Interface示例中的Erl_Interface

C节点

使用Erl_Interface函数建立与分布式Erlang节点的连接并与其通信的AC程序称为C节点隐藏节点。C节点的主要优点是从Erlang程序员的角度来看,通信非常容易,因为C程序的行为与分布式Erlang节点相同。

何时使用: C节点通常可用于设备处理器(与控制处理器相反),其中由于内存限制或应用程序特性或二者,C是比Erlang更好的选择。

在哪里阅读更多信息:请参阅erl_connectErl_Interface文档的一部分。编程人员还需要熟悉TCP / IP套接字,请参阅套接字Standard Protocols和分布式Erlang Built-In Mechanisms

示例:C节点示例中的C N odes

JInterface

在Erlang/OTP R6B中,添加了一个类似于Java的Erl_Interface的库,称为jinterface。它为Java程序提供了与Erlang节点通信的工具。

2.3标准协议

有时Erlang程序和另一个使用标准协议的程序之间的通信是可取的。Erlang/OTP目前支持TCP/IP和UDP 套接字:如下所示:

  • SNMP
  • http
  • IIOP(CORBA)

使用后三者中的一个需要关于协议的良好知识,本教程未涉及。请分别参见SNMP,Inets和Orber应用程序。

Sockets

简而言之,面向连接的套接字通信(TCP/IP)由在特定主机上启动并具有特定端口号的启动器套接字(“服务器”)组成。连接器套接字(“客户端”)知道发起者的主机名和端口号,可以连接到它并且可以在它们之间发送数据。

无连接套接字通信(UDP)由一个具有特定端口号的特定主机上的发起者套接字和一个向其发送数据的连接器套接字组成。

有关套接字概念的详细说明,请参阅有关网络编程的合适书籍。一个建议是UNIX网络编程,第1卷:网络API - W. Richard Stevens的套接字和XTI,ISBN:013490012X。

在Erlang/OTP中,模块gen_tcpgen_udp内核提供对TCP / IP和UDP套接字的访问。两者都易于使用,并且不需要关于套接字概念的详细知识。

何时使用:运行在与Erlang程序相同或另一台机器上的程序。

在哪里阅读更多:请参阅Kernel中gen_tcpgen_udp手册页。

2.4 ic

IC(Erlang IDL编译器)是一个接口生成器,根据IDL接口规范,它会自动生成Erlang,C或Java中的存根代码。请参阅IC使用说明书和IC参考手册。

有关详细信息,请参阅icIC中的手册页。

2.5旧应用

两个旧的应用程序对互操作性很感兴趣。两者已被IC取代,并在此仅提及仅供参考:

  • IG - 从Erlang/OTP R6B中删除。IG(接口生成器)为Erlang程序和C程序之间的端口或套接字通信自动生成代码,给定一个包含某些关键字的C头文件。
  • Jive - 从Erlang/OTP R7B中删除。

Jive在Erlang程序和Java程序之间提供了一个简单的接口。

Erlang 20

Erlang 是一种通用的面向并发的编程语言,可应付大规模开发活动的程序设计语言和运行环境。

主页 https://www.erlang.org/
源码 https://github.com/erlang/otp
版本 20
发布版本 20.1