"COMMON"(Fortran 的引用环境)是否有其他语言的类似实现?
Are there similar implementations of "COMMON", a referencing environment from Fortran, in other languages?
Fortran 语言有一个称为 COMMON 的引用环境。
如以下网站所定义,COMMON 语句定义了一个主内存存储块,以便不同的程序单元可以在不使用参数的情况下共享相同的数据。
https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vn7v/index.html
示例实现如下所示:
我想知道在 C、Python 或 Java 等其他语言中是否有类似的这种环境的实现,以及它与全局环境有何不同。
我试图在评论中压缩所有内容。但这没有用。所以这里有一个更广泛的答案。
公共块在现代 Fortran 中很少使用,它的用法早已被弃用。至少在过去的 3 年里,module
s 一直是 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 before = ", exampleModuleVariable
exampleModuleVariable = 1.
write(*,*) "exampleModuleVariable after = ", 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 有点奇怪的是,它必须由每个想要使用它的子例程声明 and 这些声明可能会有所不同。声明可以变化是很不寻常的,但您要记住 Fortran 非常 古老。在 2021 年看起来很奇怪的功能在四十年前可能看起来很合理。
Fortran-66 和 Fortran-77 程序是在 64 KB 内存很大的年代写回来的!每个字节都很重要,如果您可以将其中的一些字节用于多种用途,那就更好了。共享具有不同内存布局的公共块是共享内存的好方法。它是否存在问题:你敢打赌它确实存在!如果您不小心,像这样共享内存可能会导致各种错误。这是达到目的的手段。
还值得一提的是,Fortran 还有另一种将内存映射到不同类型的方法,EQUIVALENCE: https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vn9b/index.html.
通过让不同类型的结构指向同一位置,可以很容易地在 C 或 C++ 中进行模拟 - 或者您可以使用联合来完成。
Fortran 语言有一个称为 COMMON 的引用环境。
如以下网站所定义,COMMON 语句定义了一个主内存存储块,以便不同的程序单元可以在不使用参数的情况下共享相同的数据。
https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vn7v/index.html
示例实现如下所示:
我想知道在 C、Python 或 Java 等其他语言中是否有类似的这种环境的实现,以及它与全局环境有何不同。
我试图在评论中压缩所有内容。但这没有用。所以这里有一个更广泛的答案。
公共块在现代 Fortran 中很少使用,它的用法早已被弃用。至少在过去的 3 年里,module
s 一直是 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 before = ", exampleModuleVariable
exampleModuleVariable = 1.
write(*,*) "exampleModuleVariable after = ", 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 有点奇怪的是,它必须由每个想要使用它的子例程声明 and 这些声明可能会有所不同。声明可以变化是很不寻常的,但您要记住 Fortran 非常 古老。在 2021 年看起来很奇怪的功能在四十年前可能看起来很合理。
Fortran-66 和 Fortran-77 程序是在 64 KB 内存很大的年代写回来的!每个字节都很重要,如果您可以将其中的一些字节用于多种用途,那就更好了。共享具有不同内存布局的公共块是共享内存的好方法。它是否存在问题:你敢打赌它确实存在!如果您不小心,像这样共享内存可能会导致各种错误。这是达到目的的手段。
还值得一提的是,Fortran 还有另一种将内存映射到不同类型的方法,EQUIVALENCE: https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vn9b/index.html.
通过让不同类型的结构指向同一位置,可以很容易地在 C 或 C++ 中进行模拟 - 或者您可以使用联合来完成。