在 WebAssembly 上的 Fortran – George W Stagg 博士

这是一篇关于将 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 容器供实验使用。
阅读 19
0 条评论