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/