如何解决其他语言中是否有类似的“COMMON”实现,Fortran 的引用环境?
Fortran 语言有一个称为 COMMON 的引用环境。
如以下网站所定义,COMMON 语句定义了一块主内存存储,以便不同的程序单元可以共享相同的数据,而无需使用参数。
https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vn7v/index.html
示例实现如下所示:
我想知道在其他语言(如 C、Python 或 Java)中是否有此类环境的类似实现,以及它与全局环境有何不同。
解决方法
我试图在评论中压缩所有内容。但这没有用。所以这里有一个更广泛的答案。
公共块在现代 Fortran 中很少使用,它的使用早已被弃用。至少在过去的 3 年里,module
一直是 Fortran 中数据共享的官方正确方式。 Python 和 Fortran 中模块的实用程序几乎相同(尽管 Python 模块作为文件夹层次结构的组织方式比 Fortran 中的要灵活一些)。这是一个例子
module dataSharing
real :: exampleModuleVariable = 0.
end module dataSharing
program main
call print()
end program main
subroutine print()
use dataSharing,only: exampleModuleVariable
write(*,*) "exampleModuleVariable before = ",exampleModuleVariable
exampleModuleVariable = 1.
write(*,*) "exampleModuleVariable after = ",exampleModuleVariable
end subroutine print
但在 Fortran 模块之前,特别是在 FORTRAN77 中,数据共享的主要方法是通过称为公共块的存储区域。可以通过以下语法定义公共存储区域(可以命名或未命名):
program main
real :: exampleModuleVariable = 0.
common / dataSharing / exampleModuleVariable
call print()
end program main
subroutine print()
common / dataSharing / exampleModuleVariable
write(*,exampleModuleVariable
end subroutine print
以上两个代码(一个带有 module
,另一个带有 common
)在功能上是等效的。但是 module
样式比其他较旧的 F77 已弃用方法更受欢迎。如果您遵循 Fortran 模块风格,则将其转换为 Python 模块应该相当容易,因为这两种语言的概念非常相似,尽管语法略有不同。我不认为 C 是否有任何可与公共块相媲美的东西,当然也没有模块的概念。但是,C++20 最近在 C++ 中添加了模块的概念。
最后一件事:Oracle F77 手册太旧了,不能依赖,除了维护旧的 F77 代码。 Intel、HP/Cray 和 IBM Fortran 手册非常现代,它们的编译器支持现代 Fortran (2018/2008/2003) 的全部或大部分最新功能。 GNU、NAG 和 NVIDIA Fortran 编译器也是如此。
,COMMON 只是全局内存,大多数计算机语言都有某种形式的全局内存。让 Fortran 的 COMMON 有点奇怪的是,每个想要使用它的子程序都必须声明它并且这些声明可能会有所不同。声明可以变化是很不寻常的,但您要记住 Fortran 非常 很老。在 2021 年看起来很奇怪的功能在 40 年前可能看起来很合理。
Fortran-66 和 Fortran-77 程序是在 64 KB 是很多内存的时代写回来的!每个字节都很重要,如果您可以将其中的一些用于多种用途,那就更好了。共享具有不同内存布局的公共块是共享内存的好方法。它是否存在问题:你打赌它确实存在!如果您不小心,像这样共享内存可能会导致各种错误。这是达到目的的手段。
还值得一提的是,Fortran 有另一种将内存映射到不同类型的方法,EQUIVALENCE:https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vn9b/index.html。
通过让不同类型的结构指向同一位置,可以很容易地在 C 或 C++ 中进行模拟 - 或者您可以使用联合来进行模拟。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。