注册 登录
新科学想法 返回首页

beimu1009的个人空间 https://www.xinkexue.com/?428 [收藏] [复制] [分享] [RSS]

日志

Matlab与Fortran的交互(Fortran语言)

热度 2已有 8500 次阅读 2011-11-5 22:15 |个人分类:MATLAB

MATLAB 名字由 MATrix LABoratory 两词的前三个字母组合而成。那是 20 世纪七十年代后期的事:时任美国新墨西哥大学计算机科学系主任的 Cleve Moler 教授出于减轻学生编程负担的动机,为学生设计了一组调用 LINPACK EISPACK 库程序的“通俗易用”的接口,此即用 FORTRAN 编写的萌芽状态的 MATLAB

经几年的校际流传,在 Little 的推动下,由 Little Moler Steve Bangert 合作,于 1984 年成立了 MathWorks 公司,并把 MATLAB 正式推向市场。从这时起, MATLAB 的内核采用 C 语言编写,而且除原有的数值计算能力外,还新增了数据图视功能。

无论是 1.2 版编译器,还是 2.0 版编译器,它们都不但可以把全 M 函数文件编译成独立应用程序,而且也可以把 C FORTRAN 程序与 M 文件混编成独立应用程序。这种程序的优点是:一,可以脱离 MATLAB 环境独立运行;二,运行速度快。

MATLAB 编译器相比, MATLAB API 应用程序接口问世得更晚,也更不成熟。 MATLAB API 由一系列接口指令组成。借助这些接口指令,用户就可在 C FORTRAN 中,或直接读写 MATLAB MAT 数据文件,或把 MATLAB 当作计算引擎使用。

 =====================================================

MATLAB
是矩阵实验室(Matrix Laboratory)之意。除具备卓越的数值计算能力外,它还提供了专业水平的符号计算,文字处理,可视化建模仿真和实时控制等功能。

MATLAB
的基本数据单位是矩阵,它的指令表达式与数学,工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完相同的事情简捷得多.在新的版本中也加入了对C,FORTRAN,c++ ,JAVA的支持.可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户可以直接进行下载就可以用,非常的方便。

 ======================================================

Matlab
Fortran的交互

如果需要进行Matlab环绕Fortran语言的交互,必须通过Matlab提供的应用编程接口(API)来实现与外部的接口,从而可以在Matlab环境中实现调用Fortran程序、输入或输出数据以及和其它软件程序间建立客户/服务器关系等功能。下面主要说一下在Matlab环境中如何实现调用Fortran程序(函数)。

  MEX文件

   
要在Matlab中调用Fortran代码,解决方法就是利用MEX文件。MEXMatlab Executable的缩写。MEX文件类似于M文件,是Matlab系统的外部程序地用接口,是一种能够在Matlab环境中可以被Matlab的解释器解释并执行的函数文件。MEX文件可以直接使用C语言或Fortran语言来编写,在相应的C语言或Fortran语言代码中,就可以调用已有的大量C语言或Fortran语言算法。利用MEX文件可以完成:

1
)在Matlab中使用已有的C语言或Fortran语言代码;

2
)解决M语言运行速度的瓶颈;

3
)隐藏算法的细节;

4
)扩展Matlab的能力。

    MEX
文件的使用极为方便,只需在Matlab命令提示符下键入MEX文件名即可,这与Matlab的内建函数的调用方式完全相同。Matlab系统规定,MEX文件的执行优先级高于M文件。

=============================================

mx-函数和mex-函数

   
Matlab外部程序接口函数库中,存在两种类型的库函数,分别以mxmex为前缀,并且完成不同的功能。

1
mx-函数库

mx-
函数库是Matlab外部程序接口函数库中提供的一系列函数,它们均以mx为前缀,主要功能是为用户提供了一种在c语言和Fortran语言中创建、访问、操作和删除mxArray结构体对象的方法。

需注意的是,Fortran语言的mx-函数与C语言的mx-函数无论是在定义还是在使用上都存在很大的不同。

相关C语言中所用mx-函数均在目录

<MATLAB
根目录>\EXTERN\INCLUDE

下的头文件MATRIX.H中得到声明。

2
mex 函数库

mex-
函数库也是Matlab外部程序接口函数库中提供的一系列函数,它们均以mex为前缀,主要功能是与Matlab环境进行交互,从Matlab环境中获取必要的阵列数据,并且返回一定的信息,包括文本提示,数据阵列等。

需注意的是,以mex为前缀的函数只能用于MEX文件中。

   
相关C语言中所用mex-函数均在目录

<MATLAB
根目录>\EXTERN\INCLUDE

下的头文件MEX.H中得到声明。

========================================================

MEX源文件的基本结构

    Fortran
语言MEX源文件是标准的Fortran语言源文件(在创建Fortran语言MEX源文件的时候可使用Fortran77Fortran90的语言标准)。下面看一个简单的例子。

c  
入口函数//入口子例行程序(gateway routine

    subroutine mexFunction(nlhs,plhs,nrhs,prhs)

c-----------------------------------------------

c  
参数声明

    integer plhs(*),prhs(*)

    integer nlhs,nrhs

   
这里mexFunction函数类似C语言源文件的main函数,它是MEX文件的入口函数。当在Matlab命令中执行MEX函数时,Matlab解释器将从此函数处开始执行。该入口函数的输入参数有四个,其意义分别是:

nlhs
:表示输入参数的个数

plhs
mxArray类型的指针数组,表示MEX函数的输入参数

nrhs
:表示输出参数的个数

prhs
mxArray类型的指针数组,表示MEX函数的输出参数

Matlab
的数据在Fortran语言中没有显性的定义该数据结构,在Fortran语言MEX文件中需要通过一种所谓的“指针”类型数据完成Fortran语言和Matlab之间的数据传递。

   
入口函数之后就是MEX源文件的程序主体部分了--计算子例行程序(computational routine),在这里需要完成Matlab数据的获取和内存的分配,调用相应的计算子程序或函数,完成MEX文件的计算工作,最后将必要的输出返回给Matlab。它是完全的Fortran语言编程,不涉及到任何的接口内容。

   
程序的结尾是Fortran语言的特别要求,必须有returnend关键字作为Fortran语言源程序的结束。

需注意的是,在Fortran语言MEX文件中只支持两种类型的数据,即双精度类型和字符串类型,而在C语言MEX文件中则几乎支持所有的数据类型。

 

Fortran语言MEX文件的执行流程

   
当对一个Fortran语言MEX文件的源程序进行编译后,如果成功即可以得到与源程序名相同的DLL文件(建议将源程序的取名与程序中计算子例行程序的名字保持相同)。

Matlab的工作环境中,按照Matlab语言的语法

[a,b,b,...]=mexfile_name(x,y,z,...)

正确键入MEX文件名和MEX文件所需的参数,就可以运行MEX文件了。这时,参数plhs和参数prhs分别为包含所有输出和输入参数地址的整型数足,参数nlhsnrhs则分别包含了输出和输入参数的个数。

 

 

 

 

 

FORTRAN
语言

语言简介

  FORTRAN语言是世界上第一个被正式推广使用的高级语言。它是1954年被提出来的,1956年开始正式使用,至今已有五十多年的历史,但仍历久不衰,它始终是数值计算领域所使用的主要语言。   FORTRAN语言是Formula Translation的缩写,意为“公式翻译”。它是为科学、工程问题或企事业管理中的那些能够用数学公式表达的问题而设计的,其数值计算的功能较强。

历史版本

  FORTRAN语言问世以来,根据需要几经发展,先后推出了不同的版本,其中最流行的是1958年出现的FORTRANⅡ和1962年出现的FORTRANⅣ。1966年美国标准化协会(ANSI)公布了两个美国标准文本:   
标准FORTRANX3.9-1966)。大致相当于FORTRANⅣ。   标准基本FORTRANX3.10-1966)大致相当FORTRANⅡ。   1972年国际标准化组织(ISO)接受了美国标准,在稍加修改后公布了ISO FORTRAN标准,即《程序设计语言FORTRAN ISO 1539-1972》,它分为三级,即:    完全的(一级)FORTRAN,相当于FORTRANⅣ。    中间的(二级)FORTRAN,介于FORTRANⅡ和FORTRANⅣ之间。    基本的(三级)FORTRAN,相当于FORTRANⅡ。   FORTRAN(FORTRAN 66)流行了十几年,几乎统治了所有的数值计算领域,许多应用程序和程序库都是用FORTRANⅣ语言编写的。美国标准化协会(ANSN)1976年对ANSI FORTRAN(X3.9-1966)进行了修订,预定在1977年通过,为了区别于FORTRAN 66,新标准定名为FORTRAN 77。实际上到19784月才由ANSI正式公布作为新的美国国家标准。即FORTRAN(X3.9-1978)1980年,FORTRAN 77被接受为国际标准,即《程序设计语言FORTRAN ISO 1539-1980》,该标准分为全集和子集。   我国制订的FORTRAN标准,基本上采用了国际标准,于19835月公布执行,标准号为GB3057-82。   FORTRAN 77标准完成后,新版本的修订工作也在同一时间开始进行。这个版本进行了15年,最后在1992年正式由国际标准组织ISO公布,它就是FORTRAN 90FORTRAN 90对以往的FORTRAN语言标准作了大量的改动,使之成为一种功能强大、具有现代语言特征的计算机语言。其主要特色是加入了面向对象的概念及工具、提供了指针、加强了数组的功能、改良了旧式FORTRAN语法中的编写“版面”格式。   FORTRAN 95标准在1997年同样由ISO公布,它可以视为是FORTRAN 90的修正版,主要加强了FORTRAN在并行运算方面的支持。同时一些公司纷纷推出Visual Fortran,这为工程技术界进行科学计算和编写面向对象的工程实用软件的用户提供了极大的方便。熟悉VBVC的读者可以很容易地掌握Visual Fortran的使用,进一步开发出自己专业领域的Windows下的界面友好的工程应用软件。

发展现状

  目前正在酝酿国际新的FORTRAN标准,功能将有更大的扩充。在学习和掌握了FORTRAN 77的基础上进一步学习FORTRAN新标准不会是很困难的。

 

 

 

 

 

 

FORTRAN
,亦译为福传,是英文“FORmula TRANslator”的缩写,译为“公式翻译器”,它是世界上最早出现的计算机高级程序设计语言,广泛应用于科学和工程计算领域。FORTRAN语言以其特有的功能在数值、科学和工程计算领域发挥着重要作用。

 

FORTRAN
开发历史  早在1951年,美国IBM公司约翰·贝克斯(John Backus)针对汇编语言的缺点着手研究开发FORTRAN语言,并于1954年在纽约正式对外发布。称约翰·贝克斯提出的FORTRAN语言为FORTRANⅠ,FORTRANⅠ虽然功能简单,但它的开创性工作,在社会上引起了极大的反响。到1957年第一个FORTRAN编译器在IBM704计算机上实现,并首次成功运行了FORTRAN程序。

  在1958年,对FORTRANⅠ进行了扩充和完善,引进了子函数等概念,推出了商业化的FORTRANⅡ版本。之后,FORTRAN语言发展迅速,多种版本相继在其它计算机上实现。

  在1962年,推出了FORTRAN Ⅳ。FORTRAN Ⅳ没有充分考虑兼容性,导致FORTRANⅡ程序不能在FORTRAN Ⅳ系统中运行,使其应用受到了很大限制,这时语言不兼容性问题和影响被突出表现出来。此前也出现过FORTRAN Ⅲ,但由于存在严重缺陷,没有在计算机上实现。

  随着FORTRAN语言版本的不断更新和变化,语言不兼容性问题日益突出,语言标准化工作被提上了日程。19625月,美国标准化协会(简称ANSI)成立相关机构着手进行FORTRAN语言标准化的研究工作,并于1966年正式公布了两个标准文本:美国国家标准FORTRAN(ANSI X3.9-1966)和美国国家标准基本FORTRAN(ANSI X3.10-1966),前者相当于FORTRAN Ⅳ,后者相当于FORTRANⅡ。基本FORTRAN是美国国家标准FORTRAN的一个子集,从而实现了语言的向下兼容,初步解决了语言的兼容性问题。通常称美国国家标准FORTRANFORTRAN 66FORTRAN 66的推出在国际上产生了广泛影响,1972年国际标准化组织(简称ISO)FORTRAN 66基础上制定了FORTRAN语言三级国际标准:基本级、中间级和完全级。

  20世纪60代末,结构化程序设计方法提出后,具有结构化特征的程序设计语言开始出现,如:ALGOLPASCALMODULAC等。如何将结构化特征引入FORTRAN 66引起计算机厂商和研究机构的高度重视,许多计算机厂商开始对FORTRAN 66进行不同程度的扩充,引入了结构化特征。针对这种情况,ANSI1976年对FORTRAN 66(ANSI X3.9-1966)进行了修订,吸收了计算机厂商所扩充的一些行之有效的功能,同时增加了许多新内容。ANSI19784月正式公布了新的美国国家标准(程序设计语言FORTRAN ANSI X3.9-1978),同时宣布撤消ANSI FORTRAN 3.9-1966,通常称新标准为FORTRAN 77(该版本原计划1977年公布)FORTRAN 77向下兼容FORTRAN 66。在1980年,FORTRAN 77ISO正式确定为国际标准ISO 1539-1980,该标准分全集和子集。FORTRAN 77推出后,由于具有结构化特征,在社会上得到了广泛应用,同时由于扩充了字符处理功能,在非数值处理领域也能大显身手。

  20世纪80年代末,FORTRAN 77结构化和现代化的研究开始兴起,到19915月,ANSI公布了新的美国国家标准FORTRAN(ANSI 3.198-1991)。之后,ISO采纳该标准,并确定为国际标准ISO/IEC 1539-11991,新国际标准还采纳了我国计算机和信息处理标准化技术委员会程序设计分会提出的多字节字符集数据类型及相应的内部函数,为非英语国家使用计算机提供了极大的方便。通常称新标准为FORTRAN 90FORTRAN 90向下兼容FORTRAN 77。之后不久又出现了FORTRAN 95

  FORTRAN 90的推出,使传统FORTRAN语言具有了现代气息。Fortran 2003 的规则已经由ISO组织制定发布。

  Windows平台下,微软公司将FORTRAN 90无缝集成在Developer Studio集成开发环境之中,推出了Microsoft FORTRAN PowerStation 4.0,使FORTRAN 90真正实现了可视化编程,彻底告别了传统DOS环境(字符界面),转到了现代Windows环境(视窗界面),共享微软公司Windows平台的丰富资源。

  在19973月,微软公司和数据设备公司(Digital Equipment Corp,简称DEC)强强联合,合作研究、开发和推出了功能更强的FORTRAN语言新版本: 

  Digital Visual FORTRAN 5.0,它是Microsoft FORTRAN PowerStation 4.0的升级换代产品。DEC公司在高性能科学和工程计算方面拥有世界领先技术,其高质量的FORTRAN编译器遍及全球。19981月,DECCompag公司合并,DEC成为Compag公司的全资子公司,于是Digital Visual FORTRAN更名为Compaq Visual FORTRAN,其最新版本为Compag Visual FORTRAN 6.6CompaqHP合并之后,CompaqFortran小组和IntelFortran开发小组合并,开发出来Intel Fotran编译器9,有linuxwindows2个版本,其windows版本为Intel Visual Fortran,可以和微软的Visual Studio.net集成。Windows平台下还有PGIAbsoftIntel等多个商业公司的Fortran编译器,还有大量小公司的免费Fortran编译器。

  openMPI使Fortran等语言可以容易且免费的实现并行计算。

  Linux平台下,其gcc编译器默认支持fortran,另外有IntelSun StudioopenMPIPhotran等共享编译器和PGIAbsoftlachy IBMSGIHP等多个版本的商业编译器。

  支持Fortran 2003标准的编译器行将推出,新版本的Sun Studio 编译器已经支持部分 Fortran 2003 语法。

Fortran
语法的版本

FORTRAN I

  最早的FORTRAN版本应用于IBM 704系统上,包含了32种语句,包括:

  DIMENSIONEQUIVALENCE语句赋值语句三态算术IF语句。以 IF 这个陈述式检查例外情况(ACCUMULATOR OVERFLOW, QUOTIENT OVERFLOWDIVIDE CHECK);IF语句以处理判断开关和判断指示灯GOTO,计算的GOTOASSIGN,和赋值GOTODO循环格式化的输入与输出(Formatted I/O: FORMAT, READ, READ INPUT TAPE, WRITE, WRITE OUTPUT TAPE, PRINTPUNCH非格式化的输入与输出(Unformatted I/O: READ TAPE, READ DRUM, WRITE TAPEWRITE DRUM其他的输入与输出:END FILE, REWIND,和BACKSPACEPAUSE, STOP,和CONTINUEFREQUENCY语句(为编译器提供优化帮助)

  

FORTRAN II

  1958IBM又推出 FORTRAN II. 支援使用者撰写副编程(subroutines)以及函数(functions)。有六个新陈述如下:

  SUBROUTINE, FUNCTION,和ENDCALLRETURNCOMMON接下来的几年内,FORTRAN II 继续又支援 DOUBLE PRECISION COMPLEX 等资料型态(data types)。

FORTRAN III

  IBM 继续开发 FORTRAN III 1958年时已可以内建组合语言码并新增其它功能;然而这个版本却从未推出。有如704 FORTRAN FORTRAN IIFORTRAN III等的开发过程包含了过多的机器相依性(machine-dependent),造成编程码不易移植到其他机器上的问题。早期提供FORTRAN版本的厂商经常为此所苦

FORTRAN IV

  自1961年开始,由于客户的强烈要求,IBM 开始发展FORTRAN IV,目的在于移除一些FORTRAN II 中过于依赖机器本身的编程码(例如:READ INPUT TAPE)同时新增一些新的功能,如 LOGICAL 资料型别。布尔类型(TRUE或者FALSE)与 逻辑IF语句 则取代了 算术IF语句。FORTRAN IV 1962年推出,最早应用于IBM 7030"Stretch")计算机之上,以及其接续的IBM 7090IBM 7094版本。

  

FORTRAN 66

  

  早期的FORTRAN语言发展史上最重要的一件大事也许是美国标准协会(American Standards Association,即今日的 ANSI)的委员们开始为FORTRAN制定标准规格,名为"American Standard Fortran." 1966年委员会推出两套FORTRAN标准版本,分别定义成 FORTRAN(基于FORTRAN IV,用来应付 de facto 标准)和 Basic FORTRAN(基于FORTRAN II,并且移除其平台依赖性)。FORTRAN 第一套标准后来被称为 FORTRAN 66(大家仍习惯称之为 FORTRAN IV)。FORTRAN 66 有效的成功第一套工业标准版的FORTRAN。其功能如下:

  主程序,SUBROUTINEFUNCTIONBLOCK DATA程序单元INTEGER, REAL, DOUBLE PRECISION, COMPLEXLOGICAL数据类型COMMON, DIMENSIONEQUIVALENCE语句DATA语句用以指定初始值内部和EXTERNAL(例如库)函数赋值语句GOTO,赋值GOTO和计算GOTO语句逻辑IF和算术(三态)IF语句DO循环READ, WRITE, BACKSPACE, REWINDENDFILE语句以处理顺序读写FORMAT语句CALL, RETURN, PAUSESTOP语句DATAFORMAT语句中的霍尔瑞斯常数,作为子程序的实际参数最长六个字母的标识符注释行

FORTRAN 77

  在FORTRAN 66 标准推出之后,各家编译器厂商不断推出更具扩充性的标准FOTRAN"StandardFortran"),这使得ANSI1969年开始着手于1966标准版本的修正工作。最后定稿于1977年,1978年四月正式推出FORTRAN。新的标准规格也就是著名的 FORTRAN 77,这个版本是基于FORTRAN 66之上新增许多功能,弥补过去的缺点:

  CHARACTER数据类型,极大地扩展了的字符输入和输出以及对基于字符的数据进行处理的工具IMPLICIT语句IF语句块,以及可选的ELSEELSE IF从句,提供改进了的对结构化编程的语言支持。OPENCLOSEINQUIRE语句以改进I/O能力直接访问文件I/OPARAMETER语句以指定常数SAVE语句以保存本地变量内部函数的通用名称1978年推出了一个重要的版本 FORTRAN 77 是为MIL-STD-1753Release版。这个规格由美国国防部制定,这个标准化的FORTRAN 77 编译器并未引入ANSI FORTRAN 77标准。一些新功能最终合并到Fortran 90 标准版。

  DO WHILEEND DO语句INCLUDE语句IMPLICIT NONE变量,用于IMPLICIT语句位处理内部函数,基于类似的包含在工业实时FortranANSI/ISA S61.1 (1976))中的函数1991年推出IEEE 1003.9 POSIX标准版,为Fortran-77 的编程人员提供了 POSIX system上的呼叫。有超过一百种功能呼叫被定义在文件上。允许存取POSIX-相容的行程控制(process control)、信号取得(signalhandling)、档案系统控制(file system control)、装置控制(devicecontrol)、程序指定(procedure pointing),以及资料流的输入与输出(stream I/O)。

  由于成功的修正了 FORTRAN 77 发展流程,使得原本过于缓慢重复的编程设计可以顺利的应付计算机领域迅速的变化。同时,作为将近15年的“标准FORTRAN”,FORTRAN 77成为历史上最重要的一套电脑语言。

FORTRAN 90

  FORTRAN 77的被严重推迟的后续版本,非正式的名称是Fortran 90,最终于1992年作为ANSI标准被发表。这一大版本添加了许多新特性以反映自1978年标准以来发展的在编程方面显著的变化:

  自由格式源代码输入,以及小写的Fortran关键字模块,将有关联的过程和数据组合在一起,使它们可以被其它程序单元调用,包括允许限制一些模块的特定部分访问。RECURSIVE过程极大地改善了参数传递机制,允许在编译时检查接口通用过程的用户自定义接口操作符重载派生/抽象数据类型新的数据类型定义语法,以指定数据类型和变量的其它属性可以在表达式和赋值语句中按整体操作数组(或数组节),由此极大地简化了数学和工程计算。这些特性包括整体、部分和通配的数组赋值(比如用WHERE语句作选择性赋值),数组常数和表达式,用户定义的数组函数和数组构造。动态内存分配通过ALLOCATABLE属性和ALLOCATEDEALLOCATE语句POINTER属性,指针赋值和NULLIFY语句以便于创建和操作动态数据结构CASE结构以用于多路选择EXITCYCLE语句以用于在按顺序地"跳出"正常的DO循环重复最长31个字符的标识符行内注释用户可控制的可定义的数字精度新的和增强的内部过程

FORTRAN 95

  Fortran 95 仅是一个小改版,大部份修正了Fortran 90 standard一些较为显著的问题。虽然如此,Fortran 95 仍有不少的扩充,尤其是在 High Performance Fortran 的规格:

  FOR ALL和嵌套的WHERE结构以帮助向量化用户定义的PUREELEMENTAL过程Fortran 95的一个重要补充是ISO技术报告 TR-15581:增强的数据类型工具,非正式名称是可分配的TR。这一标准定义了ALLOCATABLE数组的增强的应用,先于与完全的Fortran 2003兼容的Fortran编译器,以供使用。这些使用包括在过程伪参数列表中以及将函数返回值使用ALLOCATABLE数组作为派生的类型组件。(ALLOCATABLE数组比基于POINTER的数组更受欢迎,因为ALLOCATABLE数组是由Fortran 95保证的,当它们退出范围时会被自动释放掉,避免了内存溢出的可能性。另外,别名也不再是优化数组引用时的一个问题,可以使编译器生成比用指针时更快的代码。)

  Fortran 95的第二个补充是ISO技术报告 TR-15580:浮点异常处理,非正式名称是IEEE TR。这一标准定义了对IEEE浮点算术和浮点异常处理的支持。

FORTRAN 2003

  最新的版本,Fortran 2003,有着更大幅度的改版。ISO Fortran Working Group (WG5)的官方网站有关于Fortran 2003新特性的详细总结,并有PDF文件PDF或者压缩PostScript文件可供直接下载。

  据该文所述,本版本的主要改进包括:

  增强了衍生类型:带参数的衍生类型,改善了控制的可操作性,改善了结构化的创建和释放。支持面向对象编程:扩展类型和继承,多态,动态类型分配,以及类型绑定过程。改善了数据操作:可分配的组件(编入IEEE TR 15581),延期的类型参数,VOLATILE属性,在数组构造和分配语句中显式定义类型,增强的指针,扩展的初始化表达式,增强的内部过程。增强的输入/输出:异步传输,流访问,用户指定衍生类型的传输操作,用户在格式转换时指定舍入控制,为连接前单元指定常数,FLUSH语句,关键字的规范,访问错误信息。过程指针。支持IEEE浮点算法和浮点异常处理(编入IEEE TR 15580)。与C语言的交互性支持国际化:访问ISO 106464字节字符和在格式化的数字输入/输出中选择数字或者逗号。与宿主操作系统增强的集成:访问命令行参数,环境变量和处理器错误信息。

FORTRAN 2008

  Fortran 2003之后的下一个版本是Fortran 2008. 一如 Fortran 95, 这只是一个小改版,略微更正了 Fortran 2003 的一些问题, 并且合并了 TR-19767的语言功能。

  如同 February 2007, 新的功能包括了

  Co-array Fortran – 平行处理模式BIT 资料型态20078月,资料型态 BIT 被删除了。20082月,Coarrays 的计划已缩小,仅有 Parallel I/O,而研发团队也被裁员了。

Fortran
的特性

  Fortran语言的最大特性是接近数学公式的自然描述,在计算机里具有很高的执行效率。

  易学,语法严谨。

  可以直接对矩阵和复数进行运算,这一点类似matlab

  自诞生以来广泛地应用于数值计算领域,积累了大量高效而可靠的源程序。

  很多专用的大型数值运算计算机针对Fortran做了优化。

  广泛地应用于并行计算和高性能计算领域。

  Fortran90Fortran95Fortran2003的相继推出使Fortran语言具备了现代高级编程语言的一些特性。

Fortran
语言的Hello World程序

  下面是一个在标准输出设备上使用Fortran90输出Hello World的简单程序,这种程序通常作为开始学习编程语言时的第一个程序:

  program main

  print *,'hello world'

  end

Fortran
编译器

  Windows操作系统下:

  Fortran Power Station 4.0 (FPS 4.0),微软公司开发的Fortran编译器。19973月转让给DEC公司。

  Digital Visual Fortran (DVF)Fortran Power StationDEC公司版本。

  Compaq Visual Fortran (CVF)19981月,DEC公司被康柏公司收购,Digital Visual Fortran更名为Compaq Visual Fortran。一个著名的版本是Compaq Visual Fortran 6.5。目前康柏公司已并入惠普公司。Compaq Visual Fortran的最新版是6.6

  Intel Fortran,英特尔公司的开发的Fortran编译器。

  Lahey Fortran

  Absoft Fortran

  OpenWatcom

  Linux操作系统下:

  PGI Fortran

  G77GNUFortran77编译器,集成在GCC中。

  GFORTRANGNU的最新的Fortran编译器,集成在GCC 4.0中,目的是支持Fortran95和一部分Fortran2003的功能,以替代G77

  g95,跟GFORTRAN同为开放源代码的Fortran95编译器。

Fortran
程序包

  几个著名的Fortran程序包:

  IMSL--国际数学和统计链接库

  BLAS--Basic Linear Algebra Subroutines

  LAPACK--Linear Algebra PACKage

  FORTRAN90ISO(国际标准化组织)1991年推出的最新标准,我国国家标准是GB/T 3057-1996.除了保持FORTRAN77的全部优点之外,又增加了许多具有现代特性的功能,使他成为具有良好的结构特性,鲜明的时代特性的程序设计语言.程序设计是计算机基础教育的基础与重点,高级语言程序设计课是继微机应用基础之后的一门必修的基础课,目的是向学生介绍程序设计的基础知识,使学生掌握高级语言程序设计的基本方法,具有应用计算机的初步能力,并培养学生掌握用计算机处理问题的思维方法。通过该课程的学习,要求学生了解FORTRAN语言的特点,基本成份及使用方法,具有阅读程序和初步编程的能力。进行算法的初步训练,掌握最基本算法的设计和实现方法。掌握结构化程序设计方法,能设计出良好风格的程序。具有调试程序的基本能力。

Fortran
的将来

  Fortran语言是一种极具发展潜力的语言,在全球范围内流行过程中,Fortran语言的标准化不断吸收现代化编程语言的新特性,并且在工程计算领域仍然占有重要地位。

  不可否认,Fortran语言与目前流行的JAVA,C#等高级语言相比,它缺乏创造力。但是,工科学生必须注意到,由于Fortran在工程计算领域长期处于统治地位,很多优秀的工程计算软件都是运用fortran语言编写,例如ANSYS,Marc,为了能够使用这些商业软件的高级功能,必须先学会fortran语言,才能编写应用程序接口。

  在数值计算中,Fortran语言仍然不可替代。Fortran90标准引入了数组计算等非常利于矩阵运算的功能。在数组运算时,Fortran能够自动进行并行运算,这是很多编程语言不具备的。运用fortran语言,你能够运用很多现成的函数软件包,所以非常便利。(目前流行的Matlab的早期版本,主要就是为两个著名的Fortran函数包提供程序接口)

 

 

 

 

 

Fortran
,亦译为福传,是由Formula Translation两个字所组合而成,意思是“公式翻译”。它是世界上第一个被正式采用并流传至今的高级编程语言。

历史

 

古老的IBM 704大型主机。本图由Lawrence Livermore National LaboratoryLLNL)提供

 

FORTRAN
发明的年代还没有键盘与屏幕,代码必须使用打卡机打在打孔卡(punch card)上。图中显卡片上的1-5行、第6行与73-80行被使用过。

 

Fortran
语言最初是由数值计算方面的需要而发展起来的。195312月,IBM公司编程员约翰·巴科斯(J. Backus)深深体会到编写程序的困难性,他写了一份备忘录给董事长斯伯特·赫德(Cuthbert Hurd),建议为IBM704系统设计一套全新的电脑语言,从根本上提高编程效率。当时IBM公司顾问冯·诺伊曼强烈反对这项建议,他认为巴克斯的建议是没有必要的,而且不切实际。但赫德批准了这项计划。1957年,IBM公司开发出第一套FORTRAN语言,运行在IBM704计算机上。历史上第一支FORTRAN编程在马里兰州的西屋贝地斯核电厂试验。1957420日星期五的下午,一位IBM编程员决定在电厂内编译第一支FORTRAN编程,当代码输入后,经过编译,打印机列出一道消息:“源程序错误……右侧括号后面没有逗号”,现场人员都感到讶异,这个错误经过修正之后,编程编译器再度运行,二十二分钟后,打印机输出正确结果。西屋电气公司意外地成为FORTRAN的第一个商业用户。1958年推出FORTRAN Ⅱ,几年后又推出FORTRAN Ⅲ,1962年推出FORTRAN Ⅳ,开始广泛被使用。

1966
年,美国标准化协会制定了Fortranx3.9-1966,也就是Fortran 66)和Fortranx3.10-1966)标准。这时Fortran语言还不是结构化的程序设计语言。

1976
年,美国标准化协会重新对Fortranx3.9-1966)进行了评估,公布了新的Fortran标准,也就是Fortran 77Fortran 77是具有结构化特性的编程语言。Fortran77在短时间内取得了巨大的成功,广泛地应用于科学和工程计算,几乎统治了数值计算领域。

1980
年,Fortran 77ISO接纳为国际标准。

1991
年发布的Fortran 90大幅改进了旧版Fortran的型式,加入了对象导向的观念与提供指针,并同时加强数组的功能。

Fortran
后来又陆续推出Fortran 95Fortran 2003等更新版本。

FORTRAN

最早的FORTRAN版本应用于IBM 704系统上,包含了32种语句,包括:

DIMENSION
EQUIVALENCE语句

赋值语句

三态算术IF语句。[1]

IF 这个陈述式检查例外情况(ACCUMULATOR OVERFLOW, QUOTIENT OVERFLOWDIVIDE CHECK);IF语句以处理判断开关和判断指示灯

GOTO
,计算的GOTOASSIGN,和赋值GOTO

DO
循环

格式化的输入与输出(Formatted I/O: FORMAT, READ, READ INPUT TAPE, WRITE, WRITE OUTPUT TAPE, PRINTPUNCH

非格式化的输入与输出(Unformatted I/O: READ TAPE, READ DRUM, WRITE TAPEWRITE DRUM

其他的输入与输出:END FILE, REWIND,和BACKSPACE

PAUSE, STOP
,和CONTINUE

FREQUENCY
语句(为编译器提供优化帮助)[2]

FORTRAN II

1958
IBM又推出 FORTRAN II. 支持用户撰写副编程(subroutines)以及函数(functions)。有六个新陈述如下:

SUBROUTINE, FUNCTION
,和END

CALL
RETURN

COMMON

接下来的几年内,FORTRAN II 继续又支持 DOUBLE PRECISION COMPLEX 等数据型态(data types)。

FORTRAN III

IBM
继续开发 FORTRAN III 1958年时已可以自带汇编语言码并新增其它功能;然而这个版本却从未推出。有如704 FORTRAN FORTRAN IIFORTRAN III 等的开发过程包含了过多的机器相依性(machine-dependent),造成代码不易移植到其他机器上的问题。早期提供FORTRAN 版本的厂商经常为此所苦

 

FORTRAN IV

1961年开始,由于客户的强烈要求,IBM 开始发展FORTRAN IV,目的在于移除一些FORTRAN II 中过于依赖机器本身的代码(例如:READ INPUT TAPE)同时新增一些新的功能,如 LOGICAL 数据类型。布尔类型(TRUE或者FALSE)与 逻辑IF语句 则取代了 算术IF语句。FORTRAN IV 1962年推出,最早应用于IBM 7030"Stretch")计算机之上,以及其接续的IBM 7090IBM 7094版本。

FORTRAN 66

早期的FORTRAN语言发展史上最重要的一件大事也许是美国标准协会(American Standards Association,即今日的 ANSI)的委员们开始为FORTRAN制定标准规格,名为"American Standard Fortran." 1966年委员会推出两套FORTRAN标准版本,分别定义成 FORTRAN(基于FORTRAN IV,用来应付 de facto 标准)和 Basic FORTRAN(基于FORTRAN II,并且移除其平台依赖性)。FORTRAN 第一套标准后来被称为 FORTRAN 66(大家仍习惯称之为 FORTRAN IV)。FORTRAN 66 有效的成功第一套工业标准版的FORTRAN。其功能如下:

主程序,SUBROUTINEFUNCTIONBLOCK DATA程序单元

INTEGER, REAL, DOUBLE PRECISION, COMPLEX
LOGICAL数据类型

COMMON, DIMENSION
EQUIVALENCE语句

DATA
语句用以指定初始值

内部和EXTERNAL(例如库)函数

赋值语句

GOTO
,赋值GOTO和计算GOTO语句

逻辑IF和算术(三态)IF语句

DO
循环

READ, WRITE, BACKSPACE, REWIND
ENDFILE语句以处理顺序读写

FORMAT
语句

CALL, RETURN, PAUSE
STOP语句

DATA
FORMAT语句中的霍尔瑞斯常数,作为子程序的实际参数

最长六个字母的标识符

注释行

FORTRAN 77

FORTRAN 66 标准推出之后,各家编译器厂商不断推出更具扩充性的标准FORTRAN"Standard Fortran"),这使得ANSI1969年开始着手于1966标准版本的修正工作。最后定稿于1977年,1978年四月正式推出FORTRAN。新的标准规格也就是著名的 FORTRAN 77,这个版本是基于FORTRAN 66之上新增许多功能,弥补过去的缺点:

CHARACTER
数据类型,极大地扩展了的字符输入和输出以及对基于字符的数据进行处理的工具

IMPLICIT
语句

IF
语句块,以及可选的ELSEELSE IF从句,提供改进了的对结构化编程的语言支持。

OPEN
CLOSEINQUIRE语句以改进I/O能力

直接访问文件I/O

PARAMETER
语句以指定常数

SAVE
语句以保存本地变量

内部函数的通用名称

1978
年推出了一个重要的版本 FORTRAN 77 是为MIL-STD-1753 Release版。这个规格由美国国防部制定,这个标准化的FORTRAN 77 编译器并未引入ANSI FORTRAN 77 标准。一些新功能最终合并到Fortran 90 标准版。

DO WHILE
END DO语句

INCLUDE
语句

IMPLICIT NONE
变量,用于IMPLICIT语句

位处理内部函数,基于类似的包含在工业实时FortranANSI/ISA S61.1 (1976))中的函数

1991
年推出IEEE 1003.9 POSIX 标准版,为Fortran-77 的编程人员提供了 POSIX system 上的调用。有超过一百种功能调用被定义在文件上。允许访问POSIX-兼容的进程控制(process control)、信号取得(signal handling)、文件系统控制(file system control)、设备控制(device control)、程序指定(procedure pointing),以及数据流的输入与输出(stream I/O)。

由于成功的修正了 FORTRAN 77 发展流程,使得原本过于缓慢重复的编程设计可以顺利的应付计算机领域迅速的变化。同时,作为将近15年的“标准FORTRAN”,FORTRAN 77成为历史上最重要的一套电脑语言。

Fortran 90

FORTRAN 77
的被严重推迟的后续版本,非正式名称是Fortran 90,最终于1992年作为ANSI标准发表。这一大版本添加了许多新特性以反映自1978年标准以来发展的在编程方面显著的变化:

自由格式源代码输入,以及小写的Fortran关键字

模块,将有关联的过程和数据组合在一起,使它们可以被其它程序单元调用,包括允许限制一些模块的特定部分访问。

RECURSIVE
过程

极大地改善了参数传递机制,允许在编译时检查接口

通用过程的用户自定义接口

操作符重载

派生/抽象数据类型

新的数据类型定义语法,以指定数据类型和变量的其它属性

可以在表达式和赋值语句中按整体操作数组(或数组节),由此极大地简化了数学和工程计算。这些特性包括整体、部分和通配的数组赋值(比如用WHERE语句作选择性赋值),数组常数和表达式,用户定义的数组函数和数组构造。

动态内存分配通过ALLOCATABLE属性和ALLOCATEDEALLOCATE语句

POINTER
属性,指针赋值和NULLIFY语句以便于创建和操作动态数据结构

CASE
结构以用于多路选择

EXIT
CYCLE语句以用于在按顺序地"跳出"正常的DO循环重复

最长31个字符的标识符

行内注释

用户可控制的可定义的数字精度

新的和增强的内部过程

Fortran 95

Fortran 95
仅是一个小改版,大部份修正了Fortran 90 standard一些较为显著的问题。虽然如此,Fortran 95 仍有不少的扩充,尤其是在 High Performance Fortran 的规格:

FOR ALL
和嵌套的WHERE结构以帮助矢量化

用户定义的PUREELEMENTAL过程

Fortran 95
的一个重要补充是ISO技术报告 TR-15581:增强的数据类型工具,非正式名称是可分配的TR。这一标准定义了ALLOCATABLE数组的增强的应用,先于与完全的Fortran 2003兼容的Fortran编译器,以供使用。这些使用包括在过程伪参数列表中以及将函数返回值使用ALLOCATABLE数组作为派生的类型组件。(ALLOCATABLE数组比基于POINTER的数组更受欢迎,因为ALLOCATABLE数组是由Fortran 95保证的,当它们退出范围时会被自动释放掉,避免了内存溢出的可能性。另外,别名也不再是优化数组引用时的一个问题,可以使编译器生成比用指针时更快的代码。)

Fortran 95
的第二个补充是ISO技术报告 TR-15580:浮点异常处理,非正式名称是IEEE TR。这一标准定义了对IEEE浮点算术和浮点异常处理的支持。

Fortran 2003

最新的版本,Fortran 2003,有着更大幅度的改版。ISO Fortran Working Group (WG5)的官方网站有关于Fortran 2003新特性的详细总结,并有PDF文件PDF或者压缩PostScript文件可供直接下载。

据该文所述,本版本的主要改进包括:

增强了派生类型:带参数的派生类型,改善了控制的可操作性,改善了结构化的创建和释放。

支持面向对象编程:扩展类型和继承,多态,动态类型分配,以及类型绑定过程。

改善了数据操作:可分配的组件(编入IEEE TR 15581),延期的类型参数,VOLATILE属性,在数组构造和分配语句中显式定义类型,增强的指针,扩展的初始化表达式,增强的内部过程。

增强的输入/输出:异步传输,流访问,用户指定派生类型的传输操作,用户在格式转换时指定舍入控制,为连接前单元指定常数,FLUSH语句,关键字的规范,访问错误信息。

过程指针。

支持IEEE浮点算法和浮点异常处理(编入IEEE TR 15580)。

C语言的交互性

支持国际化:访问ISO 106464字节字符和在格式化的数字输入/输出中选择数字或者逗号。

与宿主操作系统增强的集成:访问命令行参数,环境变量和处理器错误信息。

Fortran 2008

Fortran 2003
之后的下一个版本是Fortran 2008. 一如 Fortran 95, 这只是一个小改版,略微更正了 Fortran 2003 的一些问题, 并且合并了 TR-19767的语言功能。

如同 February 2007, 新的功能包括了[3]

Co-array Fortran
– 平行处理模式

BIT
数据型态

2007
8月,数据型态 BIT 被删除了。20082月,Coarrays 的计划已缩小,仅有 Parallel I/O,而研发团队也被裁员了。

FORTRAN
的特性

Fortran
语言的最大特性是接近数学公式的自然描述,在计算机里具有很高的执行效率。

易学,语法严谨。

可以直接对矩阵和复数进行运算,这点Matlab有继承。

自诞生以来广泛地应用于数值计算领域,积累了大量高效而可靠的源程序。

很多专用的大型数值运算计算机针对Fortran做了优化。

广泛地应用于并行计算和高性能计算领域。

Fortran 90
Fortran 95Fortran 2003的相继推出使Fortran语言具备了现代高级编程语言的一些特性。

其矩阵元素在记忆空间存储顺序是采用列优先(Column first),Matlab也承袭这点,目前最多使用的C语言则采用行优先(Row first)。

FORTRAN
Hello World编程

下面是一个在标准输出设备上输出Hello World的简单程序,这种程序通常作为开始学习编程语言时的第一个程序:

Fortran 90/95 自由格式的写法为例

!
驚嘆號之後是註解 program main ! 這行可以省略,但是寫大程式的時候會發生混亂 write(*,*) "hello, world!" ! 第一個 * 表示輸出縮排使用內定值, 第二個 * 表示不指定輸出格式write (unit = *, fmt = * ) "hello, world!" ! 作一樣的事 stop ! 這行代表程式結束,可以省略 end program main ! end 之後的 program main 也可以省略,但寫上是比較嚴謹的

FORTRAN
编译器

Windows
操作系统下:

Visual Fortran
系列

Fortran Power Station 4.0 (FPS 4.0)
,微软公司开发的Fortran编译器。19973月转让给DEC公司。

Digital Visual Fortran (DVF)
Fortran Power StationDEC公司版本,版本号为 5.0.x ~ 6.0.x 19981月,DEC公司被康柏公司收购,Digital Visual Fortran更名为Compaq Visual Fortran

Compaq Visual Fortran (CVF)
,上述 DVF 的进一步发展,版本号 6.5.x ~ 6.6.B20025月康柏公司已并入惠普公司,但仍然称为Compaq Visual Fortran,版本号升级到 6.6.C

Intel Fortran
,英特尔公司开发的Fortran编译器。事实上,惠普购买了 Compaq Fortran编译器技术之后不久,便留下了用于 LinuxUNIX 系统的相关技术,而将Windows 平台上的 Fortran 编译器相关权利全部转售给 Intel。因此从 CVF 6.6.C 之后,Windows 平台下的 Visual Fortran 编译器就改由 Intel 生产和销售了,(需要微软 Visual Studio 外壳的支持才能实现 Visual IDE功能,Intel 只提供命令行界面的编译器内核)。

Lahey Fortran

Absoft Fortran

OpenWatcom

Linux
操作系统下:

PGI Fortran

g77
GNUFortran 77编译器,集成在GCC中。

gfortran
GNU的最新的Fortran编译器,集成在GCC 4.x中,目的是支持Fortran 95和一部分Fortran 2003的功能,以替代G77

Intel Fortran

Absoft Fortran

g95
,跟GFORTRAN同为开放源代码的Fortran 95编译器。

Sun Studio

Open64
编译器

FORTRAN
的包

几个著名的Fortran Package

IMSL--
国际数学和统计链接库

MKL--Intel
数学核心库

BLAS--Basic Linear Algebra Subroutines

LAPACK--Linear Algebra PACKage

注释

^
注意:通常人们会认为这一语句对应于IBM 704上的一个三态分支指令。但事实并非如此,704的分支指令只包含了一个目标地址(例如,TZE - 转换AC为零,TNZ - 转换AC为非零,TPL - 转换AC为加,TMI - 转换AC为减)。机器(以及它的后继者如700/7000系列)确实有一个三态跳转指令(CAS - 比较AC与存储),那可能是这一说法的最初起源,但是用这一指令来执行IF的话,会消耗4个指令词,需要把常数零放入存储中,然后执行三个机器循环,而如果使用转换指令来实现IF的话,只需要13个指令词就够了,不需要将常数存入存储,只需要13个机器循环来执行。一个优化的编译器如FORTRAN最有可能采用的是更精简的和通常来说更快的转换指令,而不是比较指令(使用指换指令同时也允许FREQUENCY语句来优化IF,而如果使用比较指令的话则无法实现)。同时,比较指令还将-0+0认为是不同的值,而转换零和转换非零语句将它们视为相同的值。

^ FORTRAN
中的FREQUENCY最初是被用来给算术IF语句的三种分支状态给出可能性的,以供选择代码生成的方式以及生成的代码的基本块的顺序,在全局优化时,会在内存中安排以便于优化。第一个FORTRAN编译器使用这一权重法来在编译时作运行时生成代码的蒙特卡洛模拟。在当时来说是非常复杂的。这一技术最初记载于1957年的一篇关于第一个FORTRAN编译器实现的文章中,作者是J. Backus等人。许多年之后,FREQUENCY语句对代码已经没有作用了,就被作为注释语句对待了,因为编译器不再作这种编译时模拟了。以下摘自1957的论文:"FORTRAN自动编码系统",作者:Backus等人,FREQUENCY语句和它在编译时蒙特卡洛模拟运行时的用法,以优化生成的代码。




鸡蛋
2

鲜花

握手

雷人

路过

刚表态过的朋友 (2 人)

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

Copyright;  © 新科学想法 2016-2017   浙公网安备 33010202000686号   ( 浙ICP备09035230号-1 )