较新的实现和较旧的实现之间的区别

贾斯汀·卡瑞(Justin Carrey)

我是Fortran的新手。请看下面的代码:

c   main program
    call foo(2)
    print*, 2
    stop
    end
    subroutine foo(x)
        x = x + 1
        return
    end   
  • 在Fortran IV的某些实现中,上面的代码将显示3。这是为什么?你能提出一个解释吗?
  • 您如何看待更多最新的Fortran实施方案来解决此问题?

非常感谢您的帮助。谢谢你。

伊恩

该程序违反了语言规则-x子例程中的哑元参数通过line进行了修改x = x + 1,但它与某个表达式(简单常量)相关联。通常,不能修改由表达式产生的值。

该特定代码在语法上仍然对Fortran 2008有效。在Fortran 2008中仍然像在Fortran IV / 66中一样仍然存在编程错误。这不是编译器需要诊断的东西。有些可能带有附加调试选项,也许直到运行时才提供。

由于该程序违反了语言规则,因此在您运行该程序时可能会发生任何事情。究竟是什么取决于编译器生成的代码。编译器可能已经为表达式所产生的值预留了可修改的存储,以使它在内部看起来像一个变量(程序可能会打印三个并且程序会继续执行),而可修改的存储可能会在程序中共享给其他实例。常量2(突然2到处都是3的值!),常量值的存储可能会存储在不可修改的内存中(程序可能会崩溃),编译器可能会发出错误消息,程序可能会因此而烦躁不安在卧室,该程序可能会向邻国宣战-这是编程错误-发生的情况尚不确定。

从Fortran 90开始,该语言中引入了一些功能,以允许程序员编写代码,这些代码对于编译器检查诸如此类的错误非常实用(在某些情况下,如果编译器被视为标准错误,则要求编译器对其进行检查。符合)。

对于所示的代码,应将主程序和子例程视为单独编译的-主程序不了解子例程的详细信息,反之亦然(子例程可能在主程序之后很长时间就可以编译,在另一台机器上,两者的输出在以后的某个阶段链接在一起-没有花哨的链接时间行为或静态分析,因此无法解决此类错误。语言规则是这样的,即在编译主程序时,编译器必须仅基于引用子程序的方式隐式地假定子程序的接口的详细信息-在主程序内部,子程序具有隐式的接口

Fortran 90引入了显式接口的概念,其中以各种方式显式告知编译器子例程的接口,然后可以检查对子例程的任何引用均与该接口一致。如果过程是模块过程,内部过程或内部过程-该接口是自动实现的,或者对于外部子程序,过程指针等,程序员可以使用接口块显式描述该接口。

另外,Fortran 90引入了intent属性-过程的伪参数的特征,然后它又是过程接口的特征。自变量的意图向编译器指示该过程是否可以定义自变量(它也可能影响默认的初始化和组件分配状态),因此,表达式是否可以是有效的实际自变量。x在子例程中foo通常将声明为INTENT(INOUT)。

当使用具有基本实现质量的编译器时,这些新语言功能共同为此类编程错误提供了有力的防御。如果您是从语言开始的,那么建议您将这些新功能纳入您的标准方法中-即使用隐式无,所有过程通常应为模块过程或内部过程,仅在绝对需要时才使用外部过程,始终指定伪参数意图,使用自由格式源。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

较旧的Mac Mini和较新的Macbook之间的数值差异

较新的AP和较旧的PoE注入器

将较旧的Mecab库实现为现代iOS应用

使用较新的Mongo Shell版本和较旧的MongoDB版本是否安全?

删除较新的linux内核并保留较旧的linux内核

使用较旧的“ Web参考”引用较新的WCF项目

大量的DDR2和较旧的CPU,还是少量的DDR3和较新的CPU?

ArrayList 的通用实现与没有通用的旧实现之间的区别

较旧的官方图标和/或主题

为什么较新的glibc用vfork而不是fork实现posix_spawn?

类型断言与TypeScript中较新的`as`运算符之间有何区别?

具有较旧计算能力的设备在openCL中的非整数上实现atom_add函数

我希望迁移 adb2c,但较旧的广告使用由 userflow 实现的 mfa。如何获取 strongAuthenticationPhoneNumber?

我可以使用较新的gcc / clang定位较旧的linux吗?C ++

将较旧的桌面环境用于较新的发行版

如何在较新的Xcode上安装较旧的iOS运行时?

较新的JRE版本可以运行用较旧的JDK版本编译的Java程序吗?

如何使用较新的perf工具前端以及较旧的perf版本的记录

较旧的Debian发行版上的python3的较新的Debian版本?

DocumentDB-较新的会话令牌是否可以保证回读较旧的写入?

如何使用较新的包来满足较旧的依赖项?

较新的`btrfs-progs`版本可以与较旧的内核一起使用吗?

从较新的文本文件中减去较旧的文本文件

addDomHandler和实现处理程序之间的区别

在Chrome中清除旧的浏览数据,而不是较新的数据

在较新的Ubuntu上安装旧驱动程序?

在较旧的图表上方添加新的D3图表

安装了新台面,但glxinfo显示了较旧的台面

64位整数和较旧的C ++编译器