Fortran 奇遇记

💡 原文英文,约600词,阅读约需3分钟。
📝

内容提要

BLAS和LAPACK的错误处理程序xerbla_默认会终止整个进程,替换它需依赖链接器,在macOS、Windows和静态库上日益困难。参考实现中已有开放拉取请求,允许客户端程序直接传入新处理程序,无需链接器介入。实现需用Fortran的ENTRY关键字存储持久数据,因LAPACK的自动翻译工具无法处理模块。该方案将解决动态语言绑定等难题。

🔎

延伸解读

链接器替换的困境

文章指出,传统上替换xerbla_错误处理程序需要依赖链接器插入替代例程,但在macOS、Windows以及使用静态库时,这种做法越来越困难甚至不可行。这导致开发者难以自定义错误处理行为,尤其是在跨平台或静态链接场景下。

新方案:直接传入处理程序

参考实现中已有开放拉取请求,允许客户端程序直接传入新的错误处理程序,无需链接器介入。这将永久解决上述难题,使错误处理更加灵活,尤其有利于动态语言绑定和跨平台开发。

Fortran实现的技术挑战

实现该方案需在Fortran中存储持久数据。由于LAPACK的自动翻译工具无法处理模块,作者改用ENTRY关键字这一较老的惯用法,成功在xerbla_中实现了回调注册与获取,并验证了其可行性。

Q&A

BLAS和LAPACK中的xerbla_默认行为是什么?

xerbla_是BLAS和LAPACK的错误处理程序,默认会终止整个进程。

为什么替换xerbla_在macOS、Windows和静态库上越来越困难?

因为替换xerbla_需要依赖链接器将替换例程插入,而在macOS、Windows和静态库上,这种链接器操作日益困难或不可能。

新的拉取请求如何解决xerbla_替换问题?

新的拉取请求允许客户端程序直接传入新的处理程序,无需链接器介入,从而永久解决替换问题。

为什么在LAPACK中实现新方案需要使用ENTRY关键字?

因为LAPACK有自动翻译工具,会将源文件转换为后缀为_64的版本,但该工具无法处理模块,所以必须使用ENTRY关键字这种旧式惯用法来存储持久数据。

新方案将解决哪些难题?

新方案将解决动态语言绑定等难题,尤其对制作BLAS等动态语言绑定的人,以及在macOS、Windows等平台上使用的人有帮助。

实现新方案时,第一次尝试使用模块为什么失败?

因为LAPACK的自动翻译工具无法处理模块,所以使用模块的第一次尝试在LAPACK中失败。

🏷️

标签

➡️

继续阅读