“是否有类似的实现?”;普通的;,来自Fortran的引用环境,使用其他语言?

“是否有类似的实现?”;普通的;,来自Fortran的引用环境,使用其他语言?,fortran,global-variables,Fortran,Global Variables,Fortran语言有一个称为COMMON的引用环境 正如在下面的网站中所定义的,COMMON语句定义了一块主存存储,这样不同的程序单元就可以在不使用参数的情况下共享相同的数据 示例实现如下所示: 我想知道在其他语言(如C、Python或Java)中是否有类似的此类环境实现,以及它与全局环境的区别。我试图将所有内容压缩在一条注释中。但这并不奏效。所以这里有一个更广泛的答案 公共块在现代Fortran中很少使用,它的用法早就被弃用了。至少在过去30年中,模块s一直是Fortran中数据共享的正式

Fortran语言有一个称为COMMON的引用环境

正如在下面的网站中所定义的,COMMON语句定义了一块主存存储,这样不同的程序单元就可以在不使用参数的情况下共享相同的数据

示例实现如下所示:


我想知道在其他语言(如C、Python或Java)中是否有类似的此类环境实现,以及它与全局环境的区别。

我试图将所有内容压缩在一条注释中。但这并不奏效。所以这里有一个更广泛的答案

公共块在现代Fortran中很少使用,它的用法早就被弃用了。至少在过去30年中,
模块
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
上述两个代码(一个带有
模块
,另一个带有
通用
)在功能上是等效的。但是
模块
样式比其他旧的F77不推荐的方法更受欢迎。如果您遵循Fortran模块样式,那么将其转换为Python模块应该相当容易,因为两种语言中的概念非常相似,尽管语法略有不同。我不认为C有什么可以与公共块相媲美的,当然也没有模块的概念。但是,C++ 20最近将模块的概念添加到C++中。
最后一件事:除了维护旧版F77代码外,Oracle F77手册太旧了,无法依赖。Intel、HP/Cray和IBM Fortran手册非常现代,它们的编译器支持现代Fortran(2018/2008/2003)的所有或大部分最新功能。GNU、NAG和NVIDIA Fortran编译器也是如此。

常见的只是全局内存,大多数计算机语言都有某种形式的全局内存。Fortran的通用性有点奇怪,因为它必须由每个想使用它的子例程声明,而且这些声明可能会有所不同。声明可以变化是很不寻常的,但您必须记住Fortran非常古老。在2021年看起来很奇怪的特征在40年前似乎是合理的

Fortran-66和Fortran-77程序是在64千字节的大内存时代编写的!每个字节都很重要,如果您可以将其中的一部分用于多种用途,那就更好了。共享具有不同内存布局的公共块是共享内存的好方法。它会带来问题吗:你肯定会!如果你不小心的话,像这样共享内存会导致各种各样的错误。这是达到目的的手段

还值得一提的是,Fortran还有另一种将内存映射到不同类型的方法,等价性:


在C或C++中,通过将不同类型的结构指向同一个位置,或者用一个联合来实现,很容易模拟。

<代码>通用< /Cor>块在现代FORTRAN中很少使用,并且它的用法早已被禁止。至少在过去30年里,
模块
s一直是官方数据共享的正确方式。Python和Fortran中模块的实用程序几乎相同。我明白了,也许这就是为什么我很少在互联网上看到类似的实现。我不知道其他语言,但请忘记您曾经学习过
COMMON
。使用
模块
规范部分中的实体比使用
公共
要好得多。其他语言也有创建全局变量存储的方法。外部变量是C最接近公共(或模块变量)的东西,更可取的是将子例程打印封装在模块中。最好是封装子例程,不要让任何数据从模块中可见。全局范围内的变量不好。当然,这只是为了说明。