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

时间:2017-04-19 18:06:52

标签: 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)

我想知道的是代码的格式化,是编译时还是执行时?我该怎么测试呢?检查装配中的差异?

2 个答案:

答案 0 :(得分:3)

格式字符串通常在运行时解释。 在完成所有这些编辑后,它毕竟不是典型的,请参阅史蒂夫的回答。答案描述了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);设置写入模式,包括格式字符串。

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

以上是gfortran。可以想象很多东西可以实际优化并编译,但我不知道编译器会这样做。

如果您感到好奇,gfortran格式解释代码位于https://github.com/gcc-mirror/gcc/blob/trunk/libgfortran/io/format.c

答案 1 :(得分:3)

我编写的编译器总是在编译时将格式转换为内部表示,而不是存储在字符变量中的格式。运行时系统仍然必须能够在运行时“编译”格式,但编译器可以检查错误。输出的实际格式总是在运行时发生。