fortran - Fortran FORMAT 是在编译时还是执行时完成的?

标签 fortran runtime compile-time

FORTRAN 语法的一部分是 FORMAT,例如:

         WRITE(*,10)'this is a string', 'this is a second string', 'this is a third string'
10       FORMAT(1x,a10,1x,a10,1x,a20)

我想知道的是代码是什么时候格式化的,是编译时还是执行时?我该如何测试这个?检查装配中的差异?

最佳答案

格式字符串通常在运行时解释。 经过所有这些编辑,它毕竟不是那么典型,请参阅史蒂夫的回答。答案描述了 gfortran,它甚至可能不太典型,但很重要且广泛使用。特别是当格式字符串是字符变量(可以是任何内容)时,而且还有 FORMAT 语句。您经常仅在运行时收到格式不正确的错误消息。例如:

          WRITE(*,10) x
 10       FORMAT(i0)
          END

给出

> ./a.out
At line 8 of file format3.f90 (unit = 6, file = 'stdout')
Fortran runtime error: Expected INTEGER for item 1 in formatted transfer, got REAL
(i0)
 ^

就您而言:

 gfortran -O3 format3.f90 -fdump-tree-optimized

给出

  dt_parm.0.common.filename = &"format3.f90"[1]{lb: 1 sz: 1};
  dt_parm.0.common.line = 1;
  dt_parm.0.format = &"(1x,a10,1x,a10,1x,a20)"[1]{lb: 1 sz: 1};
  dt_parm.0.format_len = 22;
  dt_parm.0.common.flags = 4096;
  dt_parm.0.common.unit = 6;
  _gfortran_st_write (&dt_parm.0);
  _gfortran_transfer_character_write (&dt_parm.0, &"this is a string"[1]{lb: 1 sz: 1}, 16);
  _gfortran_transfer_character_write (&dt_parm.0, &"this is a second string"[1]{lb: 1 sz: 1}, 23);
  _gfortran_transfer_character_write (&dt_parm.0, &"this is a third string"[1]{lb: 1 sz: 1}, 22);
  _gfortran_st_write_done (&dt_parm.0);
  dt_parm.0 ={v} {CLOBBER};

_gfortran_st_write (&dt_parm.0); 设置写入模式并包含格式字符串。

您可以注意到该格式存储在字符变量中,并且可以在必要时在运行时进行解释,但它实际上并未在编译器生成的代码中使用。它可能在作为 libgfortran 运行时库一部分的 _gfortran_transfer_character_write 内部使用。

以上内容适用于 gfortran。人们可以想象很多东西实际上可以被优化和编译,但我不知道编译器会这样做。

如果你好奇的话,gfortran格式解释代码在 https://github.com/gcc-mirror/gcc/blob/trunk/libgfortran/io/format.c

关于fortran - Fortran FORMAT 是在编译时还是执行时完成的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43503089/

相关文章:

c++ - C 预处理器宏将 Fortran 程序的字符串转换为小写?

ios - 在整个 iOS 应用程序中更改颜色主题

Flutter:使构建时环境变量可用于代码

swift - 编译时检查 Swift 中除以 0

c++ - 编译时检查#pragma pack 的使用情况

r - Mac OS X R 错误 "ld: warning: directory not found for option"

c - C/C++之前的语言有指针吗?

c++ - 从 C++ 调用的 Fortran 代码中的 "Attempting to allocate already allocated variable "

mfc - 如何在运行时创建控件?

php - 如何在 mysql php 中构建动态运行时查询?