简化封装器和接口生成器

作者:Wael Hassan
Simplified Wrapper and Interface Generator

SWIG(简化封装器和接口生成器)是一个软件开发工具,用于连接用 C、C++ 和 Objective-C 编写的程序与各种高级编程语言。它通常与常见的脚本语言(如 Perl、Python 和 Tcl/Tk)一起使用。此外,它已被扩展到包括 Java、Eiffel 和 Guile 等语言。

SWIG 用于为系统集成创建高级解释型编程环境,并作为构建用户界面和测试的工具。它以开源形式分发,可以从 http://www.swig.org/ 下载。

在以下章节中,我将讨论 SWIG 的一些功能以及我作为 Zero Knowledge Systems (http://www.zeroknowledge.com/) Freedom 软件的测试工程师的个人经验。

环境和任务

在工作中,我必须测试电子邮件、Web、IRC、FTP、代理服务器和 TELNET 客户端。我的机器是一台 Pentium,由 266MHz 处理器驱动,运行 Red Hat Linux,配备 128MB 内存。我的职责包括测试当前正在开发的源代码——关键任务系统中数十万行代码,不容有错。鉴于“安全系统的强度在于其最薄弱的环节”,因此没有缺陷的余地。由于客户端和服务器的分布式架构,代码无法手动测试。因此,迫切需要一种高效的工具来自动化测试程序。该工具必须是平台独立的,并且兼容 C 和 C++。

然后就有了光明!

经过一番比较,我从其网页上了解到了 SWIG。源代码可以轻松地为 Linux 编译;它大约 2MB 大小。SWIG 是多平台的,即无需为 Linux 和 Windows 重复测试程序;它支持 C 和 C++;并且可以集成到 MSVC++(Microsoft Visual C++)中。SWIG 被证明是完美的工具。

让我们一起 SWIG

SWIG 接受 ANSI C 风格的接口文件作为输入,该文件描述了构成要测试程序的函数和对象。接口文件还可以包括 SWIG 指令和文档。SWIG 将函数包装在另一个 C 程序中。当这两个程序(源代码和包装后的源代码)都被编译时,SWIG 会创建一个可以从 Tcl shell 调用的库文件。

逐步进行
  • 程序:首先编写要测试的 C 程序。需要注意的一点是,您必须修改 “main” 函数的名称。清单 1 是一个 C 程序示例。

清单 1

  • 接口文件:为了允许 SWIG 控制此程序,我们必须编写一个 “接口文件”。我们的 C 函数的接口文件可能类似于清单 2 中的文件。

清单 2
  • 构建 Tcl 模块:在提示符下,键入以下内容

swig -tcl8 my_interface.i
此命令将创建一个符合 Tcl 8.0 标准的库。
  • 使用以下命令编译 Tcl 的包装器

        gcc -fpic -c example.c example_wrap.c\
           -I/usr/local/include
        gcc -shared example.o example_wrap.o\
           -o example.so
  • 通过键入 tclsh 调用 Tcl shell。

  • 使用以下命令加载 example.so 库

  • load ./example.so example

现在,可以随意调用在 C 程序中实现的函数
get_time
Sun Feb 11 23:01:07 1996
处理业务

SWIG 帮助了我很多,因为它提供了函数调用的灵活性。公司有一个安全的邮件系统需要测试。在这个系统中,所有电子邮件消息在到达最终目的地之前都会经过多个服务器,并且每次通过新的路由服务器时都会被加密。

我对测试此环境的方法是编写一个 C 语言的电子邮件生成器程序,我称之为 GenerateMail。GenerateMail 接受多个选项,例如 To、CC 和 Bcc 副本的数量、文件附件的数量等。它生成一个准备管道传输到 Sendmail 的文件。

典型的 GenerateMail 运行如下所示

tclsh generate_mail -Attachments 3 -CC 2\
   -output file msg.txt
tclsh send_mail msg.txt

第一行创建一个电子邮件消息文件。该消息有三个目标地址和两个抄送副本。三个二进制文件作为 MIME 附件附加。默认情况下,GenerateMail 使用其当前目录中的位图。

第二行使用适当的选项调用 Sendmail 以接受该邮件消息并将其发送到网络上。这样做,很容易生成大量邮件消息。此外,借助 SWIG,比较源消息和目标消息的校验和非常容易。

SWIG 的优势

SWIG 的优势在许多方面都很明显。它增加了测试程序的灵活性,可用于原型设计并有助于系统集成。几乎不需要修改代码。此外,SWIG 指令可以轻松扩展。

另一方面,当涉及到 C 和 C++ 程序时,包装器有一些限制,因为 SWIG 的作者并不打算将其作为一个完全成熟的解析器。

以下是一些不可接受的输入的示例。

  • 具有可变长度参数的函数将无法工作。

  • 函数指针和数组声明存在问题;可以使用 typedef 从接口文件中隐藏它们。

  • C++ 的大多数功能(如模板和运算符重载)不受支持。

尽管如此,SWIG 仍然是一个强大的工具,尤其因为它可以与 Microsoft Visual C++ 集成。

结束

SWIG 是一款功能强大的工具,可在多个平台上运行并支持多种语言。它实现了我在指定时间限制内测试系统的目标。它是一个简洁的工具,仍有很大的扩展空间。如果您从事测试、原型设计业务,SWIG 是您的不二之选。

Simplified Wrapper and Interface Generator
Wael Hassan 是 Concordia University 计算机科学专业的研究生。他正在攻读硕士学位,对 Linux、密码学、CORBA 和电子商务感兴趣。可以通过电子邮件 wael@acm.org 联系 Wael。
加载 Disqus 评论