LFortran 文档¶
LFortran 是建立在 LLVM 之上的现代开源(BSD 许可)交互式 Fortran 编译器。它可以交互地执行用户代码以允许探索性工作(很像 Python、MATLAB 或 Julia),也可以编译为二进制文件,目标是在多核 CPU 和 GPU 等现代架构上运行用户代码。
Website: https://lfortran.org/
Main repository: https://github.com/lfortran/lfortran
功能亮点¶
LFortran 正在开发中,有些功能现在可以使用,有些功能正在实现中。你还可以查看 Development Status 部分,了解有关被支持和正在开发的功能的更多信息。
现有功能¶
交互式,Jupyter 支持:LFortran 可以在 Jupyter 中用作 Fortran 内核,允许 Python/Julia 风格的快速原型设计和探索性工作流程(参见示例笔记: 静态 或 交互)。或者,它可以在交互式提示 (REPL) 中的命令行中使用。
简洁、模块化设计,可用作库:LFortran 围绕两个独立模块 AST 和 ASR 构建,这两个模块都是独立的(完全独立于 LFortran 的其余部分),鼓励用户将它们独立用于其他应用程序并在上面构建工具。有关详细信息,请参阅 Design 和 Developer Tutorial 文档。
与 GFortran 的互操作:LFortran 可以将 GFortran 模块文件解析为 ASR 并生成一个 Fortran 包装器,该包装器可以用任何 Fortran 编译器编译并与原 GFortran 编译模块链接。
创建可执行文件:它可以像其他 Fortran 编译器一样创建可执行文件。
在 Linux、Mac 和 Windows 上运行:所有三个平台都由我们的 CI 定期测试。
计划¶
已计划这些功能正在开发中,有对应议题的链接,方便大家关注跟踪进度。
与其他语言(以及其他 Fortran 编译器)的原生互操作:只需使用
use
语句即可自动调用其他语言(如 C 或 Python)编写的代码,参见 #44。它理解其他 Fortran 编译器模块文件(可以use
它们)及其 ABI 以正确链接(支持 GFortran,计划使用其它编译器,请参阅 #56),它允许将 LFortran 与如今的生产代码一起使用。现代硬件支持:得益于 LLVM,LFortran 的目标是在现代硬件上运行,并利用原生 Fortran 语言结构(例如
do concurrent
)在多核 CPU 和 GPU 上运行,请参阅 # 57。完整的 Fortran 2018 支持:目前只实现了 Fortran 的一个子集,但目标是完整实现最新的 Fortran 2018 标准,请参阅 #58。
请在我们的 议题跟踪器 中对你希望我们优先考虑的问题进行投票(如果我们遗漏任何内容,请随时创建新问题)。
路线图¶
以下是我们如何实现上述所有计划功能的路线图:
端口代码生成以使用 ASR 并通过所有当前测试 (#74)。删除用于注释 AST 树的旧代码生成和旧语义,这很混乱。
获取使用
use
模块的 GFortran 模块文件,包括假定大小和假定形状数组 (#52)。这将允许立即将生产代码与 LFortran 一起使用。同时做这些:
a) 实现更多 Fortran 功能,直到最终支持完整的 Fortran 2018 (#58)。
b) 逐渐转向 C++ 以获得稳健性和速度(#70)。 Python API 不会改变(或只有很小的改变),因此 Python 的用户体验不会改变。
c) 实现所有其他很酷的功能:用于 C 和 Python 的
use
模块和自动包装器(#44)、现代硬件支持(# 57)、生成较旧的 Fortran 标准(#72)、Fortran doctest 功能(#73), SymPy 集成(#71)、IDE 的语言服务(#12)和其他想法(#29)。
第 1 步是内部重构,不会花费很长时间。
第 2 步将允许 LFortran 立即与生产代码交互使用(生产代码将使用 GFortran 编译,然后“使用” LFortran 中的任何模块,并且可以交互调用函数/子例程,模块本身可以使用任何 GFortran 支持的功能,但 API 必须适合 LFortran 理解的子集 —— 对于大量应用程序,带有数组参数的简单函数/子例程就足够了)。这将使 LFortran 可供第一批用户使用,并且在 LFortran 支持给定功能之前,始终可以临时使用 GFortran。我们预计在 2019 年夏末完成第 2 步,希望能更快。
最后,第 3 步将整体改进 LFortran,允许第一批用户回馈,发展社区并使 LFortran 逐渐对越来越多的人有用。