「人类智慧的总和并不包含在任何一种语言之中」
——埃兹拉·庞德
Octave 是一门解决科学和工程中众多问题的极佳语言。然而,它并非唯一的计算机语言,有时您可能希望使用其他语言编写的代码。这样做的充分理由包括:1)不重复发明轮子;已经过充分测试和调试的现有函数库或大规模模拟代码库就是很好的例子;2)访问不同语言的独特功能;例如,著名的 Perl 正则表达式函数(但不必这样做,因为 regexp 在 Octave 中已经存在)。
性能通常不应成为使用编译扩展的理由。尽管编译后的扩展可以运行得更快,特别是当它们替代 Octave 代码中的循环时,但这几乎从来都不是最佳途径。首先,有许多技术可以在不离开 Octave 语言的前提下提升性能。其次,Octave 是一种高级语言,能够轻松完成常见的数学任务。放弃这一点意味着将焦点从解决实际问题转移到解决计算机编程问题上。这意味着要回到低级构造,如指针、内存管理、数学上溢/下溢等。由于这种低级特性,以及编译代码在 Octave 外部执行的事实,极有可能导致解释器崩溃并丢失工作成果。
在继续之前,您应该首先确定是否真的需要在 Octave 之外编写代码。
即使某个功能已经存在于语言之外,通常更好的做法是在 m 文件中简单地复现该行为,而不是尝试与外部代码接口。
如果性能是问题所在,那么您应该始终从语言内部技术入手以获得更好的性能。其中最主要的是向量化(参见 向量化与更快的代码执行),它不仅使代码简洁易懂,还能提升性能(10 倍到 100 倍)。如果必须使用循环,请确保变量的空间分配是在循环外部进行的,通过对适当大小的矩阵或零矩阵进行赋值。
这些例程经过高度优化,且许多例程没有解释执行的开销。
学习 Octave 的外部代码接口需要时间,并且编译器等工具也难免出现问题。
话虽如此,Octave 提供了一个通用接口,用于将编译后的代码块作为动态链接扩展包含进来。这些动态链接函数可以像任何普通函数一样从解释器中调用。该接口是双向的,外部代码可以调用 Octave 函数(如 plot),否则这些函数可能很难自行开发。
该接口以支持 C++、C 和 Fortran 语言为核心。Octave 本身是用 C++ 编写的,可以通过其原生 oct 文件接口调用外部 C++/C 代码。同时,通过 mex 文件接口支持 C 语言,以保持与 MATLAB 的兼容性。Fortran 代码最容易通过 oct 文件接口调用。
由于许多其他语言都提供 C 或 C++ 应用程序编程接口(API),因此在 Octave 与其他语言之间建立桥梁相对简单。这也是桥接硬件资源的一种方式,这些硬件资源通常具有用 C 编写的设备驱动程序。