Beliavsky/Pure-Fortran

GitHub: Beliavsky/Pure-Fortran

一套功能全面的 Fortran 代码现代化与跨语言转换工具集,支持安全、增量式的代码重构和优化。

Stars: 6 | Forks: 0

# Pure-Fortran Pure-Fortran 是一套由 Codex 编写并由我进行提示和测试的 Python 工具集,旨在通过添加以下内容来帮助现代化和精简 Fortran 代码库: - 虚参上的 `INTENT(...)` - 过程上的 `PURE` / `ELEMENTAL` - 模块内部的 `PRIVATE` 可访问性 这些工具旨在用于实际项目的迭代使用:建议更改、应用安全编辑、编译,并在需要时回滚。 ## 动机 大型 Fortran 代码库通常在没有完整接口注释的情况下演变。缺失的 `intent`、缺失的 `pure` 以及宽泛的默认 `public` 可见性使得代码更难以推理,也更难以让编译器进行优化。 Pure-Fortran 专注于以下实际改进: 1. **保守性**:静态启发式方法避免激进的不安全重写。 2. **编译验证**:在修复模式下,工具可以验证代码是否仍能编译。 3. **增量性**:支持迭代传递 (`--iterate`) 以随着代码改进解锁更多优化机会。 4. **可逆性**:备份和回滚行为降低了风险。 ## 项目布局 主程序: - `xintent.py` - 建议/应用 `intent(in)`,可选的 `intent(out)`,以及可选的 `intent(in out)`。 - `xpure.py` - 建议/应用 `pure`,可选择升级为 `elemental`,并建议性提示 `impure elemental`。 - `xprivate.py` - 建议/应用模块级别的 `private :: name` 限制。 - `xprune.py` - 对可能未使用的顶级过程进行编译验证修剪。 - `ximplicit_none.py` - 建议/在程序单元中应用 `implicit none`。 - `xuse_only.py` - 建议/应用 `use ..., only: ...` 导入,以替换宽泛的 `use` 语句。 - `xunset.py` - 针对可能的“先使用后设置”变量的建议性检查器。 - `xunused.py` - 针对可能的未使用设置变量/常量的建议性检查器,带有可选的保守修复模式。 - `xparam.py` - 针对可转换为命名常量 (`parameter`) 的变量的建议性检查器,带有可选修复模式。 - `xrepeated_if.py` - 针对连续重复 IF 条件的建议性检查器/修复器。 - `xfunc_print.py` - 针对函数内部外部输出语句的建议性检查器/修复器。 - `xnotrim.py` - 针对字符串相等/不等比较中可能不必要的 `trim(...)` 的建议性检查器/修复器。 - `xoptval.py` - 针对可由 `stdlib` `optval(...)` 替换的可选参数默认值模式的建议性检查器/修复器。 - `xmerge.py` - 针对可由 `merge(...)` 替换的简单 `if/else` 赋值块的建议性检查器/修复器。 - `xdealloc.py` - 针对提前 `deallocate(...)` 机会的建议性检查器,带有注释/修复工作流。 - `xformat.py` - 针对可使用重复编辑描述符缩短的格式字面量的建议性检查器/修复器。 - `xadvance.py` - 针对可折叠的非推进 `write` 循环的建议性检查器。 - `xnames.py` - 针对与 Fortran 关键字/内部函数冲突的变量/过程名称的建议性检查器。 - `xkind.py` - 针对硬编码类别号 (`_8`, `kind=8` 等) 的建议性检查器/修复器。 - `xalloc_assign.py` - 针对紧接在整个数组赋值之前的冗余 `allocate(...)` 的建议性检查器/修复器。 - `xc2f.py` - 针对受支持 C 子集的实用 C 到 Fortran 转换器,带有面向 Fortran 的清理/后处理传递。 - `xc2f_batch_test.py` - 批量工具,用于在许多 C 文件中对 `xc2f.py` 进行冒烟测试,并提供编译/运行报告。 - `xf2c.py` - 针对受支持自由格式 Fortran 子集的实用 Fortran 到 C 转换器,带有构建/运行和单文件模式。 - `xp2f.py` - 针对受支持 Python 子集的实用 Python 到 Fortran 转换器,带有辅助模块集成和运行/比较选项。 - `xp2f_batch.py` - 批量工具,用于在多个 Python 源文件/glob 上运行 `xp2f.py` 并提供摘要报告。 - `xf2p.py` - 针对受支持自由格式 Fortran 子集的实用 Fortran 到 Python 转换器,带有编译/运行比较模式。 - `xr2f.py` - 针对受支持 R 子集的实用 R 到 Fortran 转换器,带有辅助模块集成和运行/比较选项。 - `xoct2f.py` - 针对受支持子集的实用 Octave/MATLAB 到 Fortran 转换器。 - `xlegal.py` - 轻量级 Fortran 合法性验证器(语句/形式检查,implicit-none/声明健全性,重复检查)。 - `xfix.py` - 针对常见结构问题(例如结束名称不匹配、重复定义/声明、简单括号修复)的保守自动修复器。 - `xerror_loc.py` - 用文件/行(以及可选的作用域)注释 `error stop` 消息,并可选地扩展 IF 守卫停止的条件值。 - `xcombine_decl.py` - 合并相邻的兼容声明和连续的 `public`/`private` 列表。 - `xindent.py` - Fortran 缩进和长行换行工具,具有可配置的缩进控制。 - `xnamed_arg.py` - 在保守规则下重写过程调用以使用命名参数。 - `xset_array.py` - 针对将连续标量数组元素赋值替换为一个数组赋值的建议性检查器。 - `xarray.py` - 针对可由数组操作(`sum/product/count` 和逐元素形式)替换的简单循环的建议性检查器。 - `xto_loop.py` - 建议性检查器/修复器,将选定的数组操作反转为显式循环(用于基准测试/审计往返)。 - `xroundtrip.py` - 依次应用 `xarray.py`/`xto_loop.py` 并比较往返代码的语义等价性的工具。 - `xbounds.py` - 针对可能的越界索引/切片模式的建议性检查器。 - `xone_line_if.py` - 针对可折叠的三行 IF 块(以及反向扩展模式)的建议性检查器/修复器。 - `xlong_lines.py` - 通过续行换行处理超长 Fortran 行的建议性检查器/修复器。 - `xpower.py` - 针对可写为幂 (`x**2`) 的重复乘法项 (`x*x`) 的建议性检查器/修复器。 - `xno_variable.py` - 针对可内联的单次使用局部标量临时变量的建议性检查器/修复器。 - `xdealloc_tail.py` - 针对局部可分配变量冗余的尾部 `deallocate(...)` 的建议性检查器。 - `xintent_pure.py` - 管道包装器 (`intent -> pure -> optional elemental`)。 - `xintent_pure_private.py` - 完整管道包装器 (`intent -> pure -> optional elemental -> private`)。 - `xstrip.py` - 剥离注释(`intent`、`pure/elemental/impure` 或两者)以用于测试。 - `xstrip_implicit_none.py` - 剥离 `implicit none` 语句以生成测试用例。 - `xstrip_use_only.py` - 将 `use ..., only: ...` 剥离回宽泛的 `use` 以用于测试。 - `xdecl.py` - 针对缺少 `::` 的声明的建议性检查器/修复器。 - `xend_name.py` - 针对普通 `end` 语句的建议性检查器/修复器,替换为命名形式(`end subroutine foo` 等)。 - `xspace.py` - 针对间距/布局规范化规则的建议性检查器/修复器。 - `xburkardt.py` - 从 Burkardt 风格的参数注释块推断/应用 `intent(in/out)`。 - `xmodule.py` - 针对模块外过程的信息包装检查器,通过临时模块包装进行编译测试。 - `xfree.py` - 固定格式 (`.f`) 到自由格式 (`.f90`) 转换器,带有可选的编译回归检查。 - `xtest.py` - 转换回归工具(基线编译 -> 转换 -> 后编译)作用于文件列表。 - `xcompile.py` - 作用于文件列表的仅编译批量工具,带有恢复/循环控制。 - `xbuild.py` - 作用于源文件集的可执行构建工具(在 `--codes` 中每组一行)。 - `xarith_if.py` - 针对算术 IF (`if (expr) l1, l2, l3`) 的建议性检查器/修复器,在安全的情况下进行结构化重写。 - `xassign.py` - 针对遗留 `ASSIGN` 和赋值 `GO TO`/赋值 `FORMAT` 模式的建议性检查器/修复器。 - `xassumed_shape.py` - 建议性检查器/修复器,用假定形状接口/主体包装或替换显式形状过程。 - `xassumed_shape_set.py` - 跨相关源文件的基于集合的假定形状迁移,包括调用者重写支持。 - `xerror.py` - 从编译日志汇总警告/错误类型(每种诊断的文件/行/命中数)。 - `xcount_goto.py` - 计算每个文件的 `goto` 语句数,并比较两个目录(`before` 与 `after`)及其总数/增量。 - `xdata.py` - 针对可提升为命名常量的 `DATA` 初始化变量的建议性检查器/修复器。 - `xdep.py` - 通过 `use` 模块图分析为主程序源集的依赖解析器/构建辅助工具。 - `xdp.py` - 建议性检查器/修复器,将默认 `real` 用法迁移到选定的类别参数(例如 `dp`)。 - `xformat_mismatch.py` - 针对 `print`/`write` 格式使用中可能的类型/描述符不匹配的建议性检查器。 - `xformat_statement.py` - 将带标签的 `FORMAT` 语句替换为内联或命名格式字符串的建议性检查器/修复器。 - `xgoto.py` - 针对可简化 `goto` 模式的建议性检查器/修复器,并为剩余的重度 goto 代码提供提取/报告工具。 - `xinit.py` - 建议性检查器/修复器,用于添加显式变量初始化(带有可配置的标记/NaN 和仅限不确定模式)。 - `xloop.py` - 针对带标签 DO 终止现代化的建议性检查器/修复器(`do label ...` 到 `end do` 形式)。 - `xmodularize.py` - 将外部过程程序集转换为基于模块的布局,并更新主程序 `use` 列表。 - `xoptional.py` - 针对可能在没有保证的 `present(...)` 守卫下使用的可选虚参的建议性检查器。 - `xproc_index.py` - 过程索引/报告工具,列出发现的过程名称和文件集中的重复定义。 - `xselect.py` - 建议性检查器/修复器,将符合条件的 IF/ELSEIF 链重写为 `select case`(包括范围/集合)。 - `xsubroutine.py` - 将标记的代码块(或自动选择的循环)提取到新的模块过程中,带有参数/局部推断、可选函数提取和编译/运行验证模式。 - `xsort_size.py` - 按源文件大小对文件列表(例如 `codes.txt`)进行排序。 - `xoptions.py` - 列出 `x*.py` 脚本的选项计数和选项名称。 - `xrepeat.py` - 用于重复工具执行工作流的实用辅助工具。 - `xdiff.py` - 比较 Fortran 模块的两个版本并报告结构差异,文档见[此处](/xdiff.md) 共享支持模块: - `fortran_scan.py` - 扫描/解析辅助工具,依赖排序,文件选择。 - `fortran_build.py` - 编译和回滚辅助工具,git 提交辅助工具。 - `fortran_pipeline.py` - 包装器使用的共享管道编排。 ## 系统要求 - Python 3.10+ - 可选但推荐:`gfortran`(或其他 Fortran 编译器命令)用于编译检查 - 可选:Git 用于 `--git` ## 通用行为 跨工具通用: - 如果未提供文件列表,工具将扫描当前目录中的 `*.f90` 和 `*.F90`。 -件处理顺序是感知依赖关系的(最少依赖优先)。 - `--exclude` 可重复使用以按 glob 模式跳过文件。 - `--backup`(修复工具中的默认值)在首次修改前写入 `.bak` 文件。 - `--compiler` 启用编译检查;对于修复管道,强烈建议使用此选项。 - `--git` 使用自动生成的消息提交更改的文件。 ## 常用 CLI 选项 许多修复器/检查器脚本遵循共享的 CLI 模式。 - `--fix`:应用编辑而不是建议性报告。 - `--diff`:显示已应用编辑的统一差异。 - `--out `:与 `--fix` 一起使用,将转换后的输出写入单独的文件(单输入模式)。 - `--backup` / `--no-backup`:控制就地编辑时 `.bak` 备份的创建。 - `--exclude `:跳过匹配的文件;可重复。 - `--compiler ""`:运行编译验证(在支持的地方进行 `baseline`/`after-fix`)。 - `--verbose`:打印每个文件的详细信息和/或完整建议。 - `--limit `:限制一次运行中处理的文件数量(在支持的地方)。 - `--resume`:从先前状态继续,用于工具式脚本(在支持的地方)。 - `--loop`, `--max-loop`:以有界重试重新运行工具循环(在支持的地方)。 ## 逐个工具介绍 ### 1) `xintent.py` 建议并可选地应用虚参上缺失的 intent 属性。 核心用例: - 在参数只读的地方添加 `intent(in)` - 使用 `--suggest-intent-out` 可选地添加 `intent(out)` - 使用 `--suggest-intent-inout` 可选地添加 `intent(in out)` - 使用 `--warn-missing-intent` 警告未解决的参数 典型命令: ``` python xintent.py python xintent.py --fix --iterate --compiler "gfortran -o foo.exe" python xintent.py --fix --infer-by-compile python xintent.py --fix --iterate --suggest-intent-out --warn-missing-intent --compiler "gfortran -o foo.exe" python xintent.py --fix --iterate --suggest-intent-inout --warn-missing-intent --compiler "gfortran -o foo.exe" ``` 注意: - 分析是保守的;歧义情况保持不变。 - `--infer-by-compile` 临时添加剩余的 `intent(in)` 候选,并仅保留能编译的编辑。 - `--infer-by-compile` 隐含 `--fix`;编译命令默认为 `gfortran -c {files}`,可以使用 `--compile-cmd`(或 `--compiler`)覆盖。 - 添加 intent 时处理多实体声明(例如 `integer :: i, j`)。 - 详细的推断规则记录在 [intent.md](intent.md) 中,`xintent.py` 转换模块的示例位于 [intent_example.md](intent_example.md)。 ### 2) `xpure.py` 建议并可选地将 `pure` 应用于当前未标记为 `pure`/`elemental` 的过程。 可选的 elemental 模式: - `--suggest-elemental` 建议/升级符合条件的 `pure` 过程为 `elemental`。 - `--suggest-impure-elemental` 建议可能标记为 `impure elemental` 的过程(无修复模式)。 典型命令: ``` python xpure.py python xpure.py --fix --iterate --compiler "gfortran -o foo.exe" python xpure.py --fix --iterate --suggest-elemental --compiler "gfortran -o foo.exe" python xpure.py --suggest-impure-elemental ``` 注意: - 使用保守的纯度检查(调用、赋值、I/O、控制语句等)。 - 内部 I/O 与外部 I/O 的处理方式不同。 - 修复后编译失败时,可以从备份回滚修改的文件。 - `--suggest-impure-elemental` 仅限建议,不能与 `--fix` 组合使用。 ### 3) `xprivate.py` 建议并可选地在模块内部应用 `private :: name`。 它考虑模块实体,包括过程和模块范围的声明(变量/常量/类型/过程)。 典型命令: ``` python xprivate.py python xprivate.py --fix --iterate --compiler "gfortran -o foo.exe" ``` 注意: - 建议模式在通配符导入方面是保守的。 - 修复模式经过编译验证,并恢复破坏编译的候选编辑。 ### 4) `xintent_pure.py` 以下流程的管道包装器: 1. `xintent.py` (`--fix --iterate`) 2. `xpure.py` (`--fix --iterate`) 3. 可选的 `xpure.py --suggest-elemental` 典型命令: ``` python xintent_pure.py --suggest-intent-out --suggest-elemental --compiler "gfortran -o foo.exe" ``` ### 5) `xprune.py` 编译验证的修剪工具,删除可能未使用的顶级过程。 默认情况下,它将源的工作副本写入 `pruned/` 并在那里应用修剪。 仅当您明确希望修改当前源代码树时才使用 `--in-place`。 典型命令: ``` python xprune.py --compiler "gfortran -o foo.exe" python xprune.py --compiler "gfortran -o foo.exe" --out-dir pruned_stats python xprune.py --compiler "gfortran -o foo.exe" --in-place ``` 注意: - 修剪是保守的并经过编译验证(`baseline`、`trial`、`final` 编译传递)。 - 该工具删除已接受的过程,并更新已删除名称的匹配 `public` 列表。 - 如果尝试性删除破坏编译,则会立即恢复。 ### 6) `ximplicit_none.py` 建议并可选地在以下位置插入 `implicit none`: - 每个 `program` - 每个 `module`(存在时插入在 `contains` 之前) - 模块外的外部过程 它故意不向模块内包含的过程添加 `implicit none`,因为模块级别的 `implicit none` 已经覆盖了它们。 典型命令: ``` python ximplicit_none.py python ximplicit_none.py --fix python ximplicit_none.py --fix --compiler "gfortran -o foo.exe" ``` ### 7) `xuse_only.py` 建议并可选地重写宽泛的导入,例如: - `use foo` 为显式导入,例如: - `use foo, only: func_a, sub_b` 典型命令: ``` python xuse_only.py python xuse_only.py --fix python xuse_only.py --fix --compiler "gfortran -o foo.exe" ``` 注意: - 使用发现的模块导出和标识符使用情况跨源文件进行保守分析。 - 在 `--fix` 模式下,可以使用编译检查(`baseline` 和 `after-fix`),失败时回滚。 - 重命名的导入 (`=>`) 会被保守处理并可能被跳过。 ### 8) `xintent_pure_private.py` 以下内容的完整管道包装器: 1. intent 2. pure 3. optional elemental 4. private 典型命令: ``` python xintent_pure_private.py --suggest-intent-out --suggest-elemental --compiler "gfortran -o foo.exe" ``` ### 9) `xunset.py` 针对过程/程序单元中可能的“先使用后设置”变量的建议性检查器。 典型命令: ``` python xunset.py python xunset.py stats.f90 --verbose ``` 注意: - 仅限建议(无 `--fix`)。 - 保守的静态分析;最好结合手动审查使用。 - 跟踪部分数组初始化,带有元素级别的诊断(当范围可推断时为 1-3 维)。 - 检查可分配使用状态(`allocate`/`deallocate`)并警告未分配时的使用。 - 将查询内部函数(例如 `size`、`lbound`、`ubound`、`shape`、`kind`、`rank`、`allocated`)视为非值读取。 ### 10) `xunused.py` 针对可能的未使用设置变量/常量的建议性检查器。 可选模式: - `--fix`:在安全时应用保守的声明/赋值移除 - `--warn-dead-store`:同时报告可能的死存储(读取前覆盖/最终未读写入) 典型命令: ``` python xunused.py python xunused.py --warn-dead-store --verbose python xunused.py --fix --backup ``` 注意: - `--fix` 设计上是保守的,并跳过不安全的编辑。 - 死存储警告是建议性的,并对 `if/else` 流程具有分支感知能力。 ### 11) `xparam.py` 针对可能转换为命名常量 (`parameter`) 的变量的建议性检查器。 可选模式: - `--fix`:针对单实体声明的保守自动修复 - `--annotate`:插入建议注释(或在使用 `--fix` 时标记更改的声明) - `--fix-all`:更激进的自动修复,可能会拆分多实体声明 - `--fix-alloc`:允许将符合条件的 `allocatable` 数组提升为 `parameter` - `--diff`:与修复模式一起使用,打印更改文件的统一差异 典型命令: ``` python xparam.py python xparam.py foo.f90 --verbose python xparam.py foo.f90 --fix python xparam.py foo.f90 --annotate python xparam.py foo.f90 --fix-all python xparam.py foo.f90 --fix-all --fix-alloc python xparam.py foo.f90 --fix --annotate --diff ``` 注意: - 修复模式在编辑前创建备份(`.bak`、`.bak1` 等)。 - `--fix` 和 `--fix-all` 默认递归运行(重新分析和重新应用),直到没有更多变量可以转换。 - 在修复期间,生成的 `parameter` 声明会根据需要重新排序,以便依赖项在使用前声明。 - 默认情况下,`allocatable` 声明被排除;使用 `--fix-alloc` 选择加入。 - 完整的规则细节记录在 [param.md](param.md) 中。 ### 12) `xrepeated_if.py` 警告测试相同 `if` 条件的连续代码行(可选地由注释分隔)。 可选模式: - `--fix`:将重复的单行 IF 对重写为一个 `if (...) then ... end if` 块 - `--diff`:与 `--fix` 一起使用,打印更改文件的统一差异 典型命令: ``` python xrepeated_if.py python xrepeated_if.py foo.f90 --verbose python xrepeated_if.py foo.f90 --fix python xrepeated_if.py foo.f90 --fix --diff ``` ### 13) `xfunc_print.py` 当函数包含外部输出语句(`print`、`write(*,...)`)时发出警告。 修复策略选项(互斥): - `--fix-msg` - `--fix-msg-error-stop` - `--fix-msg-error-stop-block` - `--fix-unit` - `--fix-unit-error-stop` - `--fix-suppress` - `--fix-error-stop` - `--diff`:打印更改文件的统一差异 典型命令: ``` python xfunc_print.py python xfunc_print.py foo.f90 --verbose python xfunc_print.py foo.f90 --fix-msg --diff python xfunc_print.py foo.f90 --fix-msg-error-stop-block --diff python xfunc_print.py foo.f90 --fix-unit-error-stop --diff python xfunc_print.py foo.f90 --fix-suppress --diff ``` 注意: - 修复策略是明确且互斥的。 - 详细的策略行为和注意事项记录在 [func_print.md](func_print.md) 中。 ### 14) `xnotrim.py` 警告字符串 `==`/`/=`(`.eq.`/`.ne.`)比较中可能不必要的 `trim(...)`。 可选模式: - `--fix`:在高置信度比较形式中移除不必要的 `trim(var)` 包装 - `--diff`:与 `--fix` 一起使用,打印更改文件的统一差异 典型命令: ``` python xnotrim.py python xnotrim.py foo.f90 --verbose python xnotrim.py foo.f90 --fix python xnotrim.py foo.f90 --fix --diff ``` ### 15) `xstrip.py` 用于测试准备工作的实用工具,通过剥离注释。 典型命令: ``` python xstrip.py --strip all python xstrip.py --strip intent --strip-value python xstrip.py --strip pure ``` 默认情况下摘要输出是关闭的;使用 `--summary` 启用。 ### 16) `xstrip_implicit_none.py` 用于移除 `implicit none` 语句以测试 `ximplicit_none.py` 的实用工具。 典型命令: ``` python xstrip_implicit_none.py --fix python xstrip_implicit_none.py foo.f90 --fix --diff ``` ### 17) `xstrip_use_only.py` 用于从 `use` 语句中移除 `only:` 子句以测试 `xuse_only.py` 的实用工具。 典型命令: ``` python xstrip_use_only.py --fix python xstrip_use_only.py foo.f90 --fix --diff ``` ### 18) `xdealloc.py` 针对可能安全提前释放的局部可分配变量的建议性检查器。 可选模式: - `--annotate`:从当前发现中插入建议。 - `--fix`:将现有的 `! deallocate (...) !! suggested by xdealloc.py` 注释转换为活动的 `deallocate (...)` 语句。 - `--annotate --fix`:直接从发现中插入活动的 `deallocate (...) !! suggested by xdealloc.py` 行。 典型命令: ``` python xdealloc.py python xdealloc.py foo.f90 --verbose python xdealloc.py foo.f90 --annotate python xdealloc.py foo.f90 --fix python xdealloc.py foo.f90 --annotate --fix ``` 注意: - 建议是保守的,并跳过常见的不安全情况(例如函数结果变量、循环局部最后使用、接近单元结束的仅结构尾部)。 - 编辑模式在修改文件前创建备份(`.bak`、`.bak1` 等)。 ### 19) `xformat.py` 针对 `print`/`write` 语句中可缩短的 Fortran 格式字面量的建议性检查器/修复器。 可选模式: - `--fix`:应用保守重写(例如 `(a,a,a,i0,a,i0,a)` -> `(3a,2(i0,a))`)。 - `--diff`:与 `--fix` 一起使用,打印更改文件的统一差异。 典型命令: ``` python xformat.py python xformat.py foo.f90 --verbose python xformat.py foo.f90 --fix python xformat.py foo.f90 --fix --diff ``` 注意: - 当前匹配是保守的,侧重于字符串字面量格式规范。 - 修复模式仅重写明确的匹配,并在编辑前创建备份。 ### 20) `xadvance.py` 针对执行每次迭代一次非推进 `write(..., advance="no")` 且可折叠的简单索引 `do` 循环的建议性检查器。 可选模式: - `--annotate`:在匹配循环后添加建议注释: `! write (...) ... !! suggested by xadvance.py` 典型命令: ``` python xadvance.py python xadvance.py foo.f90 --verbose python xadvance.py foo.f90 --annotate ``` 注意: - 当字面量格式可用时(例如 `"(*(1x,f12.6))"`),建议使用无限重复格式的单次写入形式。 - 尽可能建议数组切片输出;否则建议隐式 DO 输出。 - `--annotate` 在编辑前创建备份。 ### 21) `xset_array.py` 针对可由一个数组构造函数赋值替换的连续标量元素赋值序列的建议性检查器。 可选模式: - `--fix`:就地应用建议的重写。 - `--annotate`:在候选行后插入建议注释(或在使用 `--fix` 时标记更改的行)。 - `--diff`:与 `--fix` 一起使用,打印更改文件的统一差异。 - `--vector-subscript`:同样建议/修复使用向量下标的非连续元素赋值。 典型命令: ``` python xset_array.py python xset_array.py foo.f90 --verbose python xset_array.py foo.f90 --annotate python xset_array.py foo.f90 --vector-subscript --verbose python xset_array.py foo.f90 --fix --annotate --diff ``` 注意: - 默认情况下,建议使用显式切片 LHS(例如 `x(1:4) = [...]`)。 - 当明确覆盖完整边界时,建议使用整个数组 LHS(例如 `x = [...]`)。 - 检测可向量化形式(如f(a(i))`)并在安全时建议 `f(a)`/`f(a(lo:hi))`。 ### 22) `xarray.py` 针对可由数组操作替换的简单 `do` 循环的建议性检查器。 可选模式: - `--fix`:就地应用建议的重写。 - `--annotate`:插入标记的替换块和建议的数组操作行(或在使用 `--fix` 时标记更改的行)。 - `--diff`:与 `--fix` 一起使用,打印更改文件的统一差异。 典型命令: ``` python xarray.py python xarray.py foo.f90 --verbose python xarray.py foo.f90 --annotate python xarray.py foo.f90 --fix --annotate --diff ``` 注意: - 当前保守模式包括: - 逐元素循环 (`c(i)=...`), - `sum` 归约, - `product` 归约, - 掩码 `sum` 归约, - `count` 模式, - `minval` / `maxval` 归约, - `minloc` / `maxloc` 索引跟踪归约(严格 `<`/`>` 模式)。 - 在支持的归约模式中支持简单的步进循环 (`do i=lb,ub,step`)。 - 避免递归风格的误报(例如 `y(i)=y(i-1)+...`)。 - 编辑模式在编辑前创建备份。 ### `xto_loop.py` 将选定的数组表达式/内部函数重写回显式循环的建议性检查器/修复器。 可选模式: - `--fix`:应用循环化重写。 - `--out` / `--out-dir`:将转换后的源写入文件/目录。 - `--run`, `--run-both`, `--run-diff`:编译/运行转换后的代码并可选地比较输出。 - `--time-both`, `--time-reps`:对原始与转换后的可执行文件进行基准测试。 - `--no-annotate`:在生成的代码中禁止替换注释。 典型命令: ``` python xto_loop.py python xto_loop.py foo.f90 --out foo_loop.f90 --run-diff python xto_loop.py src\\*.f90 --out-dir loop_out --compile-both ``` 注意: - 旨在作为 `xarray.py` 的保守逆伙伴。 - 包括对循环化输出中禁止的数组操作形式的残留检查。 ### `xroundtrip.py` 用于数组风格与循环风格重写之间语义回归检查的往返工具。 可选模式: - `--direction array-loop|loop-array|both`:选择转换顺序。 - `--tee`, `--tee-all`:打印中间生成的源。 - `--keep`:保留生成的中间文件/目录。 典型命令: ``` python xroundtrip.py foo.f90 python xroundtrip.py foo.f90 --direction both --tee-all python xroundtrip.py src\\*.f90 --limit 20 ``` 注意: - 报告每个文件的通过/失败,包含不匹配详情和最终转换路径。 - 对于验证转换可逆性和捕获行为回归很有用。 ### `xinit.py` 插入显式初始化(例如 NaN/哨兵)以暴露未初始化变量行为的建议性检查器/修复器。 可选模式: - `--fix`:应用插入的初始化语句。 - `--uncertain`:仅初始化被静态分析标记为不确定的变量。 - `--out` / `--out-dir`:将转换后的文件写入目标路径。 - `--compiler`:编译基线和转换后的代码以进行验证。 典型命令: ``` python xinit.py foo.f90 --fix python xinit.py foo.f90 --out temp.f90 --uncertain --compiler "gfortran -c -Wfatal-errors {file}" python xinit.py src\\*.f90 --out-dir init_out --uncertain ``` 注意: - 整数/实数/逻辑/字符初始化值的默认值是可配置的。 - 专为调试来自未设置变量的未定义行为而设计。 ### `xproc_index.py` 扫描文件集并报告发现的过程名称、位置和重复项的过程索引/报告工具。 可选模式: - 文件 glob/目录作为输入(包括支持的递归选择), - 专注于重复项的报告和排序摘要。 典型命令: ``` python xproc_index.py python xproc_index.py burkardt\\*.f90 python xproc_index.py src --verbose ``` 注意: - 用于识别大型源集合中的重复辅助过程。 - 设计为重构/模块化工作流的轻量级清单工具。 ### `xsubroutine.py` 将标记的代码区域(或选定的循环)提升为生成的模块过程/函数的提取器。 可选模式: - 标记驱动的提取(`!! begin ...` / `!! end ...`),带有模块/过程命名, - 函数/子程序生成,带有参数/局部推断, - `--compiler-cmd`, `--run`, `--run-both` 验证工作流, - `--inline`, `--loop-lines` 自动化辅助工具。 典型命令: ``` python xsubroutine.py foo.f90 --out temp.f90 python xsubroutine.py foo.f90 --compiler-cmd "gfortran {file}" --run-both python xsubroutine.py foo.f90 --loop-lines 5 --fix ``` 注意: - 对标记放置和范围边界应用结构检查。 - 可以在安全的地方推断/插入 `pure` 并更新调用者/使用点。 ### 23) `xpower.py` 针对可重写为幂形式 (`x**2`) 的同一操作数的重复乘法(例如 `x*x`)的建议性检查器/修复器。 可选模式: - `--fix`:应用就地重写。 - `--annotate`:与 `--fix` 一起使用,在更改的行上追加 `!! changed by xpower.py`。 - `--diff`:与 `--fix` 一起使用,打印更改文件的统一差异。 典型命令: ``` python xpower.py python xpower.py foo.f90 --verbose python xpower.py foo.f90 --fix python xpower.py foo.f90 --fix --annotate --diff ``` ### 24) `xno_variable.py` 针对可内联的单次使用局部标量临时变量的建议性检查器/修复器。 可选模式: - `--fix`:内联安全的候选者并移除现在未使用的声明实体。 - `--annotate`:与 `--fix` 一起使用,添加声明注释,如 `!! x, y removed by xno_variable.py`。 典型命令: ``` python xno_variable.py python xno_variable.py foo.f90 --verbose python xno_variable.py foo.f90 --fix python xno_variable.py foo.f90 --fix --annotate --verbose ``` 注意: - 包含安全检查,当临时定义和使用之间的 RHS 依赖关系被重新分配时(例如交换模式),阻止无效的内联。 - 修复模式在编辑前创建备份。 ### 25) `xdealloc_tail.py` 针对程序单元结束附近的局部可分配变量上冗余的 `deallocate(...)` 语句的建议性检查器。 可选模式: - `--annotate`:追加内联注释,如 `!! xdealloc_tail.py suggests deleting this line`。 典型命令: ``` python xdealloc_tail.py python xdealloc_tail.py foo.f90 --verbose python xdealloc_tail.py foo.f90 --annotate ``` 注意: - 专注于局部可分配变量和没有有意义尾部工作的尾部位置释放。 - `--annotate` 在编辑前创建备份。 ### 26) `xnames.py` 针对与 Fortran 关键字或内部函数名称冲突的标识符的建议性检查器。 可选模式: - `--verbose`:打印完整的违规语句/上下文。 典型命令: ``` python xnames.py python xnames.py foo.f90 --verbose ``` 注意: - 仅限建议(无 `--fix`)。 ### 27) `xkind.py` 针对硬编码类别号的建议性检查器/修复器。 可选模式: - `--fix`:应用就地重写。 - `--annotate`:与 `--fix` 一起使用,在更改的行上追加 `!! changed by xkind.py`。 - `--diff`:与 `--fix` 一起使用,打印更改文件的统一差异。 典型命令: ``` python xkind.py python xkind.py foo.f90 --verbose python xkind.py foo.f90 --fix --annotate --diff ``` 注意: - 处理后缀类别(`0_8`、`1.0_8`)、选择器类别(`kind=8`、`real(8)`)和类别参数常量(例如 `dp = 8` 当用于类别选择器时)。 - 在模块范围内,修复模式可以引入模块级别的 `xkind_*` 命名类别常量,并重写字面量/选择器以使用它们。 ### 28) `xalloc_assign.py` 针对赋值驱动分配机会之前的冗余 `allocate(...)` 的建议性检查器/修复器。 可选模式: - `--fix`:注释掉冗余的分配行。 - `--annotate`:注释发现;与 `--fix` 一起使用,追加 `!! commented out by xalloc_assign.py`。 - `--diff`:与 `--fix` 一起使用,打印更改文件的统一差异。 典型命令: ``` python xalloc_assign.py python xalloc_assign.py foo.f90 --verbose python xalloc_assign.py foo.f90 --fix --annotate --diff ``` 注意: - 设计上是保守的(跳过不安全的模式)。 - 处理单对象和多对象 `allocate(...)` 语句,尽可能仅移除冗余对象。 - 可以将符合条件的连续切片构造函数赋值(例如 `a(1:n) = [...]`)重写为整个数组赋值,以便安全地进行分配即赋值转换。 - 当移除 `allocate(var(1))` 后形状会丢失时,修复模式可以将标量赋值重写为单例构造函数形式(例如 `var = [0.0_dp]`)。 ### `xc2f.py` 从受支持的 C 子集到可编译的自由格式 Fortran 的实用转换器,带有保守的清理传递。 用法: ``` python xc2f.py xfactors.c --out xfactors.f90 ``` C 目录包含 C 代码及其翻译的示例。 注意: - 使用 `pycparser` AST 降低并发出模块/程序 Fortran 结构。 - 应用后处理传递以提高生成的 Fortran 可读性和安全性(例如声明/分配合并、冗余语法清理、常量提升以及安全情况下的分配即赋值重写)。 - 支持在代表性示例(如 factors/matmul 风格的 C 源代码)上验证的生成模式。 ### `xc2f_batch_test.py` 用于评估 `xc2f.py` 可以转换多少 C 源文件并成功构建的批量工具。 典型命令: ``` python xc2f_batch_test.py --root c:\\c\\public_domain\\github\\jburkardt-c --limit 50 python xc2f_batch_test.py --limit 10 --sort-size --out-dir _xc2f_batch_smoke --verbose ``` 注意: - 可以按源大小排序,优先尝试较小/较容易的文件。 - 可以跳过基线 C 构建失败的情况。 - 生成每个文件的状态摘要和失败诊断。 ### `xf2c.py` 从受支持的自由格式 Fortran 子集到 C 的实用转换器,带有可选的构建/运行检查。 典型命令: ``` python xf2c.py foo.f90 --out foo.c python xf2c.py foo.f90 --run-both python xf2c.py src\\*.f90 --mode-each --compile-both --summary ``` 注意: - 支持单文件和多文件处理(`--mode each|combined`)。 - 包括仅编译和运行比较的选项(`--compile`, `--compile-c`, `--compile-both`, `--run-both`)。 - 在需要时为选定的 Fortran 内部函数/模式发出 C 辅助函数。 ### `xp2f.py` 从受支持的 Python 子集到自由格式 Fortran 的实用转换器。 典型命令: ``` python xp2f.py foo.py python xp2f.py foo.py python.f90 --compile python xp2f.py foo.py python.f90 --run-both --time-both ``` 注意: - 支持辅助模块输入(例如 `python.f90`)和可选的自动辅助解析。 - 包括编译/运行工作流和输出差异/计时模式以进行验证。 ### `xp2f_batch.py` 用于在许多 Python 文件/glob 上运行 `xp2f.py` 的批量工具。 典型命令: ``` python xp2f_batch.py "xfit_mix*.py" --helpers python.f90 --time-both python xp2f_batch.py src\\*.py --helpers python.f90 --verbose ``` 注意: - 扩展 glob,独立运行用例,并打印每个文件的 PASS/FAIL 摘要。 - 用于转换器覆盖范围的冒烟/回归扫描。 ### `xf2p.py` 从受支持的自由格式 Fortran 到 Python 的实用转换器。 典型命令: ``` python xf2p.py foo.f90 python xf2p.py foo.f90 --run-both python xf2p.py mod.f90 main.f90 --mode-program --run ``` 注意: - 支持单文件和多文件程序模式。 - 包括运行/编译比较工作流和计时/差异选项。 ### `xr2f.py` 从受支持的 R 子集到自由格式 Fortran 的实用转换器。 典型命令: ``` python xr2f.py foo.r python xr2f.py foo.r r.f90 --run-both python xr2f.py foo.r r.f90 --time-both ``` 注意: - 支持辅助模块输入(例如 `r.f90`)用于运行时/统计/RNG 辅助工具。 - 包括保守重写和运行/比较工作流。 ### `xoct2f.py` 从受支持的 Octave/MATLAB 类子集到自由格式 Fortran 的转换器。 典型命令: ``` python xoct2f.py foo.m python xoct2f.py foo.m --run-both ``` 注意: - 旨在用于实用的数值脚本子集;不支持的结构会被保守地报告。 ### `xlegal.py` 使用轻量级静态检查验证自由格式 Fortran 源合法性的验证器。 典型命令: ``` python xlegal.py foo.f90 python xlegal.py src\\*.f90 ``` 注意: - 报告无法识别的语句和基本的结构不匹配。 - 包括 implicit-none/声明健全性检查和重复定义/声明检测。 - 旨在作为转换/翻译工作流的快速预检门。 ### `xfix.py` 针对 Fortran 代码中检测到的常见结构/拼写问题的保守自动修复器。 典型命令: ``` python xfix.py foo.f90 --out fixed.f90 python xfix.py src\\*.f90 --fix ``` 注意: - 修复选定的结束语句名称不匹配和简单的明确括号问题。 - 可以移除重复的过程定义(保留最后一个)和重复的声明(保留第一个),并附带报告。 - 通过尽可能应用安全的自动纠正来补充 `xlegal.py`。 ### `xcombine_decl.py` 合并相邻的兼容声明和连续的 `public`/`private` 列表。 典型命令: ``` python xcombine_decl.py foo.f90 python xcombine_decl.py foo.f90 --fix python xcombine_decl.py src\\*.f90 --fix --max-len 80 ``` ### `xindent.py` 使用共享格式规则缩进 Fortran 源代码并换行长行。 典型命令: ``` python xindent.py foo.f90 --fix python xindent.py foo.f90 --fix --indent 3 --indent-proc --indent-module ``` 注意: - 支持过程/模块/程序/contains 部分的缩进切换。 ### `xnamed_arg.py` 重写过程调用以对字面量/可选虚参和靠后的位置参数使用命名参数。 典型命令: ``` python xnamed_arg.py foo.f90 python xnamed_arg.py foo.f90 --fix python xnamed_arg.py code1.f90 code2.f90 --fix --max-positional 3 ``` ### `xerror_loc.py` `error stop` 诊断的重写器: - 将源位置标签追加到字面量 `error stop "..."` 消息。 - 可选的 `--condition-values` 模式重写有效的 IF 守卫 error-stop 形式,以包含条件中的值。 - 位置标签可以包含作用域上下文(模块/过程)和行,例如 `file.f90::module m::function f::line 42`。 典型命令: ``` python xerror_loc.py foo.f90 python xerror_loc.py foo.f90 --fix python xerror_loc.py foo.f90 --condition-values --fix python xerror_loc.py foo.f90 --out transformed.f90 --run python xerror_loc.py foo.f90 --run-both --tee-both ``` 注意: - 使用共享的换行逻辑(`fortran_scan.py`)和 `--max-len`(默认 80)。 - 默认保守:跳过不支持/非字面量的 `error stop` 形式和可疑的无效 IF 模式。 - 通过 `run`, `--run-both`, `--tee`, 和 `--tee-both` 支持编译/运行和源预览流程。 ### 29) `xbounds.py` 针对可能的越界数组索引/切片模式的建议性检查器。 可选模式: - `--verbose`:打印语句和诊断详情。 典型命令: ``` python xbounds.py python xbounds.py foo.f90 --verbose ``` 注意: - 仅限建议(无 `--fix`)。 - 使用保守的守卫推断(例如 `size(...)` 检查、别名守卫、循环边界)。 ### 30) `xone_line_if.py` 针对可折叠为单行 IF 的三行 IF 块的建议性检查器/修复器,带有可选的反向扩展。 可选模式: - `--fix`:应用重写。 - `--annotate`:插入建议注释。 - `--diff`:有编辑时,打印统一差异。 - `--reverse`:反向操作(单行 IF -> 3 行块)。 典型命令: ``` python xone_line_if.py python xone_line_if.py foo.f90 --verbose python xone_line_if.py foo.f90 --fix --diff python xone_line_if.py foo.f90 --reverse --fix --diff ``` ### 31) `xlong_lines.py` 针对超过可配置最大值(默认 100)的行的建议性检查器/修复器。 可选模式: - `--max-len N`:设置长度阈值(默认 `100`)。 - `--fix`:在安全的地方用续行 (`&`) 换行长行。 - `--diff` / `-diff`:与 `--fix` 一起使用,打印统一差异。 - `--verbose`:打印完整的超长行。 典型命令: ``` python xlong_lines.py python xlong_lines.py foo.f90 --max-len 100 --verbose python xlong_lines.py foo.f90 --fix --diff ``` ### 32) `xoptval.py` 针对可由 `stdlib_optval` 中的 `optval(...)` 重写的可选默认值习语的建议性检查器/修复器。 可选模式: - `--fix`:应用就地重写并在需要的地方插入 `use stdlib_optval, only: optval`。 - `--annotate`:插入建议注释(或在使用 `--fix` 时在更改的行上添加 `!! changed by xoptval.py`)。 - `--diff`:与 `--fix` 一起使用,打印更改文件的统一差异。 - `--verbose`:打印带有源上下文的完整发现。 典型命令: ``` python xoptval.py python xoptval.py foo.f90 --verbose python xoptval.py foo.f90 --fix --diff python xoptval.py foo.f90 --fix --annotate --diff ``` 注意: - 处理常见模式,例如: - `x = default; if (present(arg)) x = arg` - `if (present(arg)) then; x = arg; else; x = default; end if` - 在修复模式下,所需的 `use stdlib_optval, only: optval` 导入保留在模块/规范部分(在 `implicit none` 之前)。 ### 33) `xmerge.py` 针对可由 `merge(...)` 替换的简单 `if/else` 赋值块的建议性检查器/修复器。 可选模式: - `--fix`:应用保守的就地重写。 - `--annotate`:插入建议注释(或在使用 `--fix` 时在更改的行上添加 `!! changed by xmerge.py`)。 - `--diff` / `-diff`:与 `--fix` 一起使用,打印更改文件的统一差异。 - `--verbose`:打印完整的建议。 典型命令: ``` python xmerge.py python xmerge.py foo.f90 --verbose python xmerge.py foo.f90 --annotate python xmerge.py foo.f90 --fix --annotate --diff ``` 注意: - 匹配故意严格:每行一条语句,连续的 5 行 `if/else/end if` 块,在两个分支中分配相同的 LHS。 - 已知不安全情况会跳过重写,包括: - 任一源表达式中引用了 `present(...)` 守卫的可选项, - 字符长度不相等的字符串字面量分支值, - 超出支持的简单源子集的复杂分支表达式。 ### 34) `xdecl.py` 针对省略 `::` 的声明语句的建议性检查器/修复器。 典型命令: ``` python xdecl.py python xdecl.py foo.f90 --verbose python xdecl.py foo.f90 --fix --diff ``` ### 35) `xend_name.py` 将普通 `end` 替换为命名形式(如 `end subroutine foo`、`end function bar`、`end module m`)的建议性检查器/修复器。 典型命令: ``` python xend_name.py python xend_name.py foo.f90 --verbose python xend_name.py foo.f90 --fix --diff ``` ### 36) `xspace.py` 针对间距/布局规范化规则(括号间距、空行规范化、过程分隔和相关格式清理)的建议性检查器/修复器。 典型命令: ``` python xspace.py python xspace.py foo.f90 --verbose python xspace.py foo.f90 --fix --diff python xspace.py foo.f90 --fix --disable 2,4 ``` ### 37) `xburkardt.py` 读取 Burkardt 风格的参数注释块,并将匹配的 `intent(in)`、`intent(out)` 或 `intent(in out)` 应用于声明。 典型命令: ``` python xburkardt.py python xburkardt.py starpac.f90 --verbose ``` ### 38) `xmodule.py` 信息性检查器:检测模块外的过程,将它们包装到 `temp.f90` 中的临时生成模块中,并编译检查包装后的文件。 典型命令: ``` python xmodule.py foo.f90 python xmodule.py --codes codes.txt --compile-cmd "gfortran -c {file}" python xmodule.py c:\fortran\**\*.f90 --verbose ``` ### 39) `xfree.py` 将固定格式 `.f` 源转换为同一目录中的自由格式 `.f90`,带有可选的编译回归检查。 典型命令: ``` python xfree.py foo.f python xfree.py c:\fortran\lapack --recursive --overwrite python xfree.py c:\fortran\lapack --recursive --overwrite --check --fail-fast ``` ### 40) `xtest.py` 转换工具:将源复制到 `temp.f90`,基线编译,运行转换命令,转换后编译,并在转换或后编译失败时停止/报告。 典型命令: ``` python xtest.py --transform-cmd "python xintent.py --fix" python xtest.py --transform-cmd "python xpure.py --fix" --compile-cmd "gfortran -c -w -fmax-errors=1 {file}" --codes codes.txt python xtest.py --transform-cmd "python xintent.py --fix" --resume --loop --max-loop 20 ``` ### 41) `xcompile.py` 用于文件列表/glob 的仅编译工具,带有恢复/循环控制和可选的快速失败模式。 典型命令: ``` python xcompile.py --codes codes.txt python xcompile.py --codes codes.txt --compile-cmd "gfortran -c -O0 -Wall {file}" python xcompile.py --codes codes.txt --resume --limit 500 python xcompile.py --codes codes.txt --fast-fail ``` ### 42) `xerror.py` 解析 `xcompile.py` 输出日志,并按文件计数、源行计数和总命中数汇总警告/错误类型。 典型命令: ``` python xerror.py python xerror.py burkardt_errors.txt ``` ### 43) `xsort_size.py` 按文件大小升序对换行分隔的源列表(例如 `codes.txt`)进行排序。 典型命令: ``` python xsort_size.py codes.txt python xsort_size.py codes.txt --output codes_size_sorted.txt ``` ### 44) `xoptions.py` 报告 `x*.py` 脚本的长选项清单(选项计数加名称)。 典型命令: ``` python xoptions.py python xoptions.py xintent.py xpure.py xarray.py ``` ### 45) `xrepeat.py` 针对直线块中重复 IF 条件和重复表达式的建议性查找器。 典型命令: ``` python xrepeat.py python xrepeat.py foo.f90 --verbose ``` ### 46) `xbuild.py` 用于源文件集的仅构建工具,其中 `--codes` 中的每一行是一个构建集(一个或多个源文件)。 它尝试为每个集构建一个可执行文件,并报告失败及恢复/静默控制。 典型命令: ``` python xbuild.py --codes codes.txt --compile-cmd "gfortran -w -Wfatal-errors {files}" python xbuild.py --codes c:\python\fortran\burkardt\codes.txt --code-dir c:\python\fortran\burkardt --silent --maxfail 10 --compile-cmd "gfortran -w -Wfatal-errors {files}" python xbuild.py --codes codes.txt --resume --silent --maxfail 0 ``` 注意: - `--compile-cmd` 支持 `{files}`、`{file}` 和 `{exe}` 占位符。 - 如果 `--compile-cmd` 省略 `{files}` 和 `{file}`,所有集文件将自动追加。 - 默认值:`--state-file xbuild_state.json`, `--fail-log xbuild_fail.log`, `--exe-dir build_exe`。 ## 推荐的转换顺序 如果应用所有转换,请使用此顺序: 1. `implicit none` (`ximplicit_none.py`) 2. `intent` (`xintent.py`) 3. `pure` (`xpure.py`) 4. `elemental` (`xpure.py --suggest-elemental`) 5. `private` (`xprivate.py`) 6. 可选的结构清理:收紧导入/修剪 (`xuse_only.py`, `xprune.py`) 7. 最终清理/审计:未使用的值/死存储 (`xunused.py`) `xintent_pure_private.py` 实现了此序列的 intent/pure/elemental/private 子集。 ## 安全模型 - **保守推断**:如果不确定,工具通常不会编辑。 - **编译检查**:使用 `--compiler` 以验证编辑。 - **备份**:除非请求 `--no-backup`,否则保留 `.bak` 文件。 - **回滚**:编辑后编译失败时,修复流程尝试恢复。 ## 局限性 这些是静态启发式方法,而不是完整的 Fortran 语义编译器。预计会有一些漏报(以及编译检查捕获的偶尔误报),特别是在以下方面: - 间接/全局状态影响 - 多态分派和过程指针 - 复杂的宿主关联和接口模式 - 单个编译器命令无法代表的项目特定构建系统 ## 实用工作流 ### 仅保守审计 ``` python xintent.py python xpure.py python xprivate.py python ximplicit_none.py ``` ### 修剪到单独的源代码树 ``` python xprune.py --compiler "gfortran -o foo.exe" ``` 这默认将修剪后的源写入 `pruned/`。 ### 激进的迭代编译验证现代化 ``` python xintent_pure_private.py --suggest-intent-out --suggest-elemental --compiler "gfortran -o foo.exe" ``` ### 构建命令提示 `--compiler` 接受: - 自动追加文件路径的命令,或 - 使用 `{files}` 占位符的模板。 示例: ``` --compiler "gfortran -o foo.exe" --compiler "gfortran -J build/mod -o foo.exe {files}" ``` ## Git 集成 对于修改源的工具,`--git` 可以使用信息性消息自动提交更改的文件。 仅当您的工作树状态准备好进行自动提交时才使用此选项。 ## 示例输出 `python xintent_pure_private.py --compiler "gfortran -o foo.exe" --suggest-intent-out --suggest-elemental` 在 `original` 目录中的源文件上生成了 `revised` 目录中的源代码和下面的终端输出。 ``` === Intent Phase === Command: c:\Programs\Python313\python.exe xintent.py kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 --fix --iterate --max-iter 10 --compiler gfortran -o foo.exe --backup --suggest-intent-out Processing order: kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 Compile (baseline): gfortran -o foo.exe kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 Compile (baseline): PASS Compile (after-fix): gfortran -o foo.exe kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 Compile (after-fix): PASS === Pure Phase === Command: c:\Programs\Python313\python.exe xpure.py kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 --fix --iterate --max-iter 10 --compiler gfortran -o foo.exe --backup Processing order: kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 Compile (baseline): gfortran -o foo.exe kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 Compile (baseline): PASS Backup written: util.f90.bak Applied PURE to 6 procedure declaration(s). Backup written: stats.f90.bak Applied PURE to 17 procedure declaration(s). Compile (after-fix): gfortran -o foo.exe kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 Compile (after-fix): PASS Processing order: kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 Backup written: stats.f90.bak Applied PURE to 2 procedure declaration(s). Compile (after-fix): gfortran -o foo.exe kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 Compile (after-fix): PASS Processing order: kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 Compile (after-fix): gfortran -o foo.exe kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 Compile (after-fix): PASS Summary of 12 functions and 1 subroutine marked pure in 2 source files: stats.f90 6 functions: arcoef loglik fit_lnorm fit_laplace hyperb_var hyperb_scale_from_sd stats.f90 1 subroutine: unpack_params util.f90 6 functions: arange grid replace rep_vec matrix reverse === Elemental Phase === Command: c:\Programs\Python313\python.exe xpure.py kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 --fix --iterate --max-iter 10 --compiler gfortran -o foo.exe --backup --suggest-elemental Processing order: kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 Compile (baseline): gfortran -o foo.exe kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 Compile (baseline): PASS Backup written: stats.f90.bak Applied ELEMENTAL to 18 procedure declaration(s). Backup written: interpret.f90.bak Applied ELEMENTAL to 1 procedure declaration(s). Compile (after-fix): gfortran -o foo.exe kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 Compile (after-fix): PASS Processing order: kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 Compile (after-fix): gfortran -o foo.exe kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 Compile (after-fix): PASS Summary of 19 functions and 0 subroutines marked elemental in 2 source files: interpret.f90 1 function: lower_str stats.f90 18 functions: hyperb_pdf_scalar hyperb_int inv_norm besseli0 besseli1 besselk0 besselk1 log1pexp log_beta hyperb_scale_from_sd hyperb_var tcdf betai chisq_cdf gammp gser gcf betacf === Private Phase === Command: c:\Programs\Python313\python.exe xprivate.py kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 --fix --iterate --max-iter 10 --compiler gfortran -o foo.exe --backup Processing order: kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 Compile (baseline): gfortran -o foo.exe kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 Compile (baseline): PASS Backup written: constants.f90.bak Backup written: gnuplot.f90.bak Backup written: interpret.f90.bak Backup written: kind.f90.bak Backup written: qsort.f90.bak Backup written: random.f90.bak Backup written: stats.f90.bak Backup written: util.f90.bak Compile (after-fix): gfortran -o foo.exe kind.f90 constants.f90 qsort.f90 util.f90 gnuplot.f90 random.f90 stats.f90 interpret.f90 xinterpret.f90 Compile (after-fix): PASS ```
标签:AST操作, C, Fortran, HPC, Legacy Code, Octave, Python, R, 云安全监控, 代码现代化, 代码转换, 代码重构, 威胁情报, 开发者工具, 无后门, 源码转换, 科学计算, 编译器优化, 脚本工具, 跨语言转换, 静态分析, 高性能计算