回 帖 发 新 帖 刷新版面

主题:想写一本fortran书

国内好像还没有人写过fortran95 OOP编程,想填补一下空白。[em8]
顺便介绍一下常用的库:lapack3.1/95,以及openmp/mpi上手;
但是又怕fortran太冷门了,写出来很可能要滞销。

回复列表 (共53个回复)

11 楼

楼上那位朋友说得对。

写本书这个想法就是给已经有一定基础的朋友一些编程建议。比如强制自己使用intent/optional属性和interface语句来保证子过程调用正确,使用指针来避免大数组拷贝,使用KIND种别参数保证精度一致,还有f90的动态数组等等。

最重要的,不管你是否喜欢OOP,OOP已经是大方向。这也体现在Fortran 2003/2008标准上。国内Fortran整体水平比人家落后一代啊。

我很喜欢openmp,现在已经是双核时代了,但是并行程序比例很小。已经建好了足球场却没有人来踢足球。openmp/mpi的书很多,无意增加一本,只是最小功能的一些例子介绍一下,能上手,要掌握肯定要看专门的书籍。

纸上谈兵,还一个字没有。我肯定要写的,但哪天写出来也要放到网上,让大家拍砖2年,也不一定就出版。全当娱乐也行啊。

网聚人的力量。论坛里解答了大量问题,一些网友已经积累了不少经验。希望有兴趣的朋友加入进来,增加一些主题并花足够心思把它做好。为提高国内Fortran水平做点事情,不论多少,不论事情做的好坏!

12 楼

1. Fortran 尽管定义了 Module, 但其没有 Constructor/Destructor, 没有 Dynamical Binding 等语法,何谈面向对象编程;充其量是基于对象编程而已。
OOP 并非 Fortran 特长,就目前来看,Fortran 要写出 STL 之类的程序,希望渺茫的很。数值计算需用过程式编程也挺好的。就我个人而言,若真是要用 OOP,我肯定会选择 C++。

2. 若真是想写点东西,不如先把 Fortran2003 的标准弄清楚,达到一定的“境界”,再写本类似于 C++ Primer 的书。hoho,估计国内还没有人能写出这样水平的书。彭国伦先生的书,我是经常翻阅,但个人感觉他的造诣还是到不了那老外的水准,毕竟人家是 C++ 标准化委员会的。

3. Fortran90/95 & Fortran2003 在并行计算方面有发展,这方面的书应该不多,可以多花一点笔墨。Gene H.Golub 的《矩阵计算》 已经写了一些了,可以参考一下。

4. 其实,很多人对数值计算根本就不了解,尽管他们经常编程。比如浮点数的存储,精度,误差理论;还一个问题,估计很多人不知道计算机是如何算 sqrt,sin 等函数的,不妨写一点。这些对了解数值计算还是很有好处的。

    个人意见,仅供参考。

13 楼

非常感谢楼上的。3,4是很好的建议。
彭的书就是国内最好的了,我也喜欢。但跟老外的一些顶尖著作还是稍逊一筹,这恐怕也没什么争议。
==============================================
构造器的问题能够解决,只不过没有Java那么优美。
比如你定义了一个名叫X的type结构,有三个整数成员,并且定义了一个变量X1,那么
X1=X(0,0,0) 这样就初始化了X1,f90称之为intrinsic constructor,即用类型名来初始化。
一个更有效的方法是自己写一个函数比如New_X作为构造器,其参数都有optional属性,即可选的参数,配合present内在函数,能解决初始化的问题,请想想看。这样能让你将类型元素都定义为private,只要New_X是public就行了,这是intrinsic constructor做不到的。
==============================================
f95面向对象是不完美。尤其是用USE来继承很不优美,f2003引入type extends才解决了继承。但很多国外f90/95书都把oop编程作为重要一部分,详细讲解定义类,继承,多态的技术,人家完全知道f90/95的缺点,但并没有因此而等待f2003。原因就是我上面说的,大量变量和子程序堆在一起的编程方式是过时的。我对OOP是情有独钟,非常期待fortran2003编译器出现。

14 楼

对Fortran2003标准不是很清楚。

但是95标准实现面向对象似乎还有一个困难的地方。

如果把模块与类相类比的话,Fortran的模块“类”只能产生一个“对象”。

拿彭国论先生的例子来说,银行内部数据保密,外部接口公开。

但是倘若要生成若干个银行,比如“建行”“交行”......实现起来就不如其他面向对象语言那么顺利了。

不知道Fortran2003标准是否解决了,如何解决的。

我也很期待Fortran2003的编译器,但是从经验上来看,Fortran编译器总是落后于语言规范若干年。

15 楼


对楼主计划出书的想法表示赞同,用了N久Fortran真的感觉需要一本书来系统的搞定一下.同时建议,楼主在介绍时以linux平台加没有版权问题的编译器为例才好,如此可在一定程度上解决我们所面临的盗版指控情况。

同时若楼主真有兴趣出书,在下可以介绍在下的一个朋友,他做一个专门的fortan的网站,可以借助他的网站来给新书的筹备和写作制造一定的声势。

站的地址是:http://www.fortranclub.cn
他的 Email 是: ding.xiaobin2004 $ gmail.com (Please replace $ to @ if you want to give him email.)

16 楼

[quote]对Fortran2003标准不是很清楚。

但是95标准实现面向对象似乎还有一个困难的地方。

如果把模块与类相类比的话,[b][color=FF00FF]Fortran的模块“类”只能产生一个“对象”。[/color][/b]

拿彭国论先生的例子来说,银行内部数据保密,外部接口公开。

但是倘若要生成若干个银行,比如“建行”“交行”......实现起来就不如其他面向对象语言那么顺利了。

[b][color=FF0000][color=C0C0C0][color=FF0000]不知道Fortran2003标准是否解决了[/color][/color][/color][/b],如何解决的。

我也很期待Fortran2003的编译器,但是从经验上来看,Fortran编译器总是落后于语言规范若干年。[/quote]

非常想知道这个问题是否解决了?IVF 9.1 是不是支持?

17 楼

Fortran确实挺冷门的,是第一个高级程序语言;
想当初,我去上海书店,找Fortran方面的书,只找到了彭国伦的《Fortran 95程序设计》,着实吃了一惊。
现在毕业设计用vc做光弹方面软件,同时用fortran实现有限单元法的各种主要运算。
Fortran能参考的资料少之又少
支持楼主填补Fortran空白的勇气,不过我觉得Fortran的特长就在于数值计算方面,实在不太支持oop,及可视化。应该多详细介绍些Fortran的特长方面的领域。


18 楼

我是学土木工程的,在这个过程中会遇到很多计算。为了将其程序化,一般都采用fortran进行编程。而我们在学习专业知识之余,基本上没有把精力放在学习编程语言上,而且我们如果长时间不用,又基本上忘记的差不多了。所以手上如果能有一本好的fortran教程的话,那就相当满意了。目前据我了解,工程计算程序基本上90%以上都采用fortran。所以,楼主的想法我还是力挺的!!!希望早日看到楼主的专著。到时候我一定要买一本。希望里面能单独开辟一章介绍各种算法子程序。

19 楼

14楼的雪球兄,16楼的网友:你们的担心是不必要的,
f95所谓的类就是自定义类型,声明对象就是定义一个该类型的变量,当然可以定义任意数目个。跟我们平时编程不同的是:这种自定义类型是在模块中定义,而且内部元素全部是private。所以主程序不能直接操作这些自定义类型的组件,怎么才能够呢?正如你想像的,只有模块里的我们编写的子程序才能。

15楼的网友:我跟您有同感,linux/unix才是科学计算的主要平台,因为linux特别适合并行计算。论坛里好像大多数是在windows下编程,编译出来的是dos程序,在windows的dos窗口里跑,这有限制。在windows下Fortran编程,我觉得更该是生产dll让别人在matlab里调用。至于编译器,linux下主要是intel/pgi/nag/gfortran/g95等等,虽然开源的没有费用,但是还有其他限制:库。如果你需要的库比如imsl对gfortran/g95兼容差,就很为难。

17/18楼的两位:
很典型、代表了很多人的观点。觉得弄那么多花样如oop干什么,我只要能帮我计算帮我模拟,最终能出paper就行,我们的目标不是程序员,呵呵。
怎么才能让你更好地“数值计算”?(除了你自己的理论/算法这个因素外,)依我看最重要的是要掌握相关的库,要在这方面下功夫。
除了库的因素还有其他因素。
从f90到筹划中的f2008,J3委员会花了20多年时间出了4个标准提高Fortran各方面的能力。一个方向是提供更好的计算设施如动态数组之类。这些F77之后的“新特性”对帮助我们更好地数值计算绝对是有帮助的。因此一本集中解释新标准难点的书肯定收到欢迎。不仅应该向F77程序员解释这些新设施的使用方法,还要解释为什么需要它们、它们能起什么作用、用在什么场合。
另一个方向是oop。oop是f2003/f2008的主要任务。引入oop的主要原因跟其他语言相同,当程序很大的时候,过程编程越来越不适合,人的智力是有限的,数以百计的子程序、变量累积如山,这将耗尽人的脑力。大型项目编程和维护的时间是2:8,后期维护比编程还难。引入oop是为了让大家使用Fortran能编出更庞大、更优美、更可靠的程序,提高代码重复使用度,减少重复劳动,积累更多Fortran库,最终还是更好地“数值计算”。看看现在的java,像胶水,几乎无所不能,oop是起了作用的。

20 楼

[quote]14楼的雪球兄,16楼的网友:你们的担心是不必要的,
f95所谓的类就是自定义类型,声明对象就是定义一个该类型的变量,当然可以定义任意数目个。跟我们平时编程不同的是:这种自定义类型是在模块中定义,而且内部元素全部是private。所以主程序不能直接操作这些自定义类型的组件,怎么才能够呢?正如你想像的,只有模块里的我们编写的子程序才能。
[/quote]

自定义类型自然可以产生任意数目的变量。
可是只能是变量,却不能操作。也就是说,这样的“类”没有“方法”

“方法”可以映射到我们在 Module 中 Contains 的子程序。
但是这样的方法又依赖于 Module 。
Module 被 Use 只能是一次。

还是举彭国伦先生银行的例子。
设置了一个 Module ,代表一个银行。
Module 中包含了一个Real变量,代表银行中的总金钱数目。
Contains 几个函数用来从银行中存款和提款。并操作 Module 的Real变量。

那么,要描述两个银行怎么办呢?
比如从“交通银行”中取出 100 元,并存入“建设银行”。
用自定义类型能做到吗??

我来回复

您尚未登录,请登录后再回复。点此登录或注册