这是一篇关于将 Fortran 代码编译为 WebAssembly 并在浏览器中运行的博客文章,主要内容总结如下:
- 引言:Fortran 是最古老的编程语言之一,历史悠久,在科学和工程计算中应用广泛。本文介绍了将现有 Fortran 代码编译为 WebAssembly 以便在浏览器中运行的方法,以及目前可用的 Fortran 编译器和工具链的情况。
- 问题阐述:编译 Fortran 到 WebAssembly 有多种方法和工具链,但都不完美,存在各种缺点和限制。2020 年 Christoph Honal 的文章总结了当时的情况,而现在情况有所变化,但仍没有一个简单的“即插即用”解决方案。
编译器综述:
f2c
:将 Fortran 77 转换为 C 代码,再由 Emscripten 编译为 WebAssembly,但不支持现代 Fortran 代码。- LFortran:在过去几年中取得了很大进展,支持更广泛的 Fortran 语言特性,但仍处于 alpha 阶段,不完全支持 Fortran 规范。
- Dragonegg:使用 GCC 和 LLVM 的插件,将 Fortran 代码编译为 WebAssembly,但需要旧版本的 GCC 和 LLVM,且 LLVM IR 需要额外处理。
- Classic flang:基于开源的 PGI/NVIDIA 编译器
pgfortran
,但不支持 32 位输出。 - LLVM Flang:是 LLVM 的 Fortran 前端重新实现,目前尚未准备好用于生产,但开发活跃,可通过修改 LLVM 源代码将其与 WebAssembly 后端结合使用。
- 构建和使用 LLVM Flang 进行 WebAssembly 编译:需要从源代码编译 LLVM Flang,修改相关代码以支持
wasm32
目标,然后可以编译 Fortran 代码为 WebAssembly 对象。还介绍了如何从 C 程序调用 Fortran 子例程以及从 JavaScript 调用 Fortran 例程的方法。 - Fortran 运行时库:尝试构建“Hello, World!”的 Fortran 子例程时遇到了缺少符号的问题,这是由于未编译 LLVM Fortran 运行时库所致。通过构建运行时库并进行一些修改,解决了部分问题,但仍存在一些不一致性。
- 编译 BLAS 和 LAPACK 为 WebAssembly:获取 BLAS 和 LAPACK 的参考实现版本,修改配置选项,使用编译后的 LLVM Flang 进行编译。并展示了如何在 Fortran 例程中使用 BLAS 和 LAPACK 例程。
- 示例:包括手写数字分类器和多项式插值演示,展示了使用 Fortran 编写的代码在浏览器中利用 BLAS 和 LAPACK 进行数值计算的效果。
- 最终思考:拥有可以将现代 Fortran 代码编译为 WebAssembly 的 LLVM Flang 版本,但如果
flang-new
编译器能正式支持 WebAssembly 将更好。提供了 Docker 容器供实验使用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。