Fortran FAQ
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.1 FAQ之常见错误
本文从编译错误,链接错误,运行时错误,计算结果错误等四个方面介绍了常见的错误及解决思路。
适合初学者阅读。
首先应该明确:错误有哪几种?我们当前遇到的是何种错误?
阐述这些问题前,我们先讨论一下常规的应用程序开发的过程:
1>>编写代码,使用一个或多个源代码文件。
2>>对第一步的每一个源代码文件执行编译操作。
得到一个或若干个目标代码。
3>>将目标代码,运行时库(Run-time Library)和其他使用到的函数库链接起来。
得到一个可执行文件(EXE 或其他)
4>>编写程序的说明书,必要的(输入)数据文件
5>>将上述得到的结果发布给用户。
(发布的方式可以是刻录成光盘,销售,放在网站上供别人下载,或者其他)
6>>用户得到程序后,运行,输入数据,得到计算结果。
对于很多Fortran 程序员来说,可能用户就是自己,也可能仅仅是自己教研室的同事同学。
所以第4,5,6步骤很多时候不明显。
而如果使用集成开发环境(IDE)进行开发,第1,2,3步骤又可以一键完成。
因此,很多初学者就认为,写程序就是:输入代码,运行,得到结果。
这样的理解太狭义。
不管我们面对什么使用者来写代码,程序开发应该是上述的过程。
我们的编译器,编译环境,也是为这个过程而设计的。
于是,我们将错误分为四种:
一. 编译错误(发生在第2步)
编译错误,一般是源代码书写格式不正确,不符合语法要求。
二. 链接错误(发生在第3步)
链接错误,一般是源代码结构不完整,运行时库或函数库使用不合理。
三. 运行时错误(发生在第6步)
运行时错误,一般是执行代码时,遇到了事先未料及的错误。
比如内存不足了,磁盘空间不够了,输入文件格式不对了,输出文件写入失败了等等。
四. 计算结果不符合预期(程序代码不规范,或不符合你的设想)
计算结果不符合预期,可能性就很多了。
语法与你的想法不一致,超出函数库的适用范围,执行流程控制不当等等。
这四种错误,其排查难度依次增大。
也就是,编译错误最容易排查和修改,而计算结果不正确,最让人头疼。
不管是阅读本文,还是在网络上求助,抑或是与其他程序员交流。
首先一定要弄清楚,自己遇到的,是哪一种错误。
如你使用的是 IDE 方式开发,具体不知道是第一种还是第二种错误,应该尝试手动编译代码,手动链接程序,看错误发生在哪一步。
使用一键 Build 可能会让初学者搞不清楚。
对于前三种错误,一定要找到错误提示,这对于你解决问题至关重要!
另外需要说明的是,对于同样的错误,不同的编译器给出的提示可能也是不一样的。
下面都以Compaq Visual Fortran 和 Intel Visual Fortran 举例。
其他编译器提示应该类似。
一. 编译错误
编译错误经常让初学者感到恐怖,因为动辄几十几百乃至上千个错误。
然而实际上,错误可能并没有那么多。
这是因为编译器对代码进行构析,遇到错误后,会严重影响接下来的分析,导致将本来正确的写法认为是错误。
所以,对于编译错误,一定先解决第一个。
然后重新编译,然后再解决新的第一个。
直到顺利编译为止。
编译错误,在 IDE 环境下一般可通过双击切换到错误所在行。
在命令行下也会显示错误所在的行数。
Q0001:【CVF】Severe: Invalid argument , Error executing df.exe
编译错误提示类似于:
f90: Severe: Invalid argument
... file is 'C:\?D??\fcode.f90'
Error executing df.exe
原因:这是由于 Compaq Visual Fortran 不支持中文路径下的源代码文件。
源代码文件名作为参数(argument)传递给编译器(df.exe)被认为是非法的(Invalid 因为含有中文)。
解决:将源代码文件放入英文路径下重新编译。
Q0002:【CVF / IVF 】Error spawning df.exe 或The Fortran compiler (ifort.exe) cannot be found.原因:这多半是由于编译器安装不合适造成的,或者安装时未设置合理的环境变量。
执行编译器( df.exe 或ifort.exe ) 失败或根本找不到。
解决:重新安装编译器(win7/win8 下请不要使用CVF),注意安装时如选择是否设置环境变量,选Yes。
Q0003:【CVF / IVF 】Unrecognized token '?' skipped
原因:代码中出现了编译器无法识别的字符。
解决:首先检查自己的源代码文件是否为 ANSI 编码,而不是Unicode编码或其他。
然后检查错误行,是否存在特殊字符?包括除字符串常量和注释行之外的中文。
尤其注意括号,逗号,冒号是否是半角?
Q0004:【CVF / IVF 】Syntax error
原因:语法错误
解决:语法错误的可能性很多,但凡违反语法规定的写法,都可能出这个错误。
认真检查错误行,某些编译器可能会给出更详细的错误提示,翻译一下会更便于查找错误。
Q0005:【CVF / IVF 】Unbalanced parentheses
原因:括号不成对出现,例如a(3))
解决:检查错误行的括号,确保成对出现。
Q0006:【CVF / IVF 】An unterminated block exists.
原因:If 或 Do 等区块没有结束。
解决:检查 If 是否有 EndIf 对应,Do 是否有 End Do 对应
Q0007:【CVF / IVF 】A specification statement cannot appear in the executable section.
原因:声明语句出现在了执行语句中
解决:所有声明语句必须在所有执行语句前面,即先声明所有变量,然后才有执行语句。
调整这些语句的顺序既可。
Q0008:【CVF / IVF 】The type of the actual argument differs from the type of the dummy argument. [SOME].
原因:SOME作为实参,它的的类型与对应的虚参不一致
解决:我们建议所有实参与对应的虚参具有相同的类型,精度,大小和数组上下限。
检查一下被提示的变量,其类型精度是否与虚参一致?尤其是没有使用 Implicit None 的程序单元,默认 IN 规则情况下,容易发生类型不一致。
Q0009:【CVF / IVF 】Cannot open include file '文件名.inc'
原因:文件名.inc 做为被包含文件,无法打开
解决:
1.检查是否存在文件名.inc;
2.检查文件名.inc 是否在你的工程目录(文件夹);
3.检查该文件是否被隐藏了扩展名,有时候我们看起来是文件名.inc ,其实是文件名.inc.txt,我建议取消隐藏扩展名设置。
方法是打开我的电脑,工具,文件夹选项,查看,取消“隐藏已知文件扩展名”;
4.检查该文件是否是ANSI 编码,用记事本打开,文件另存为时既可查看编码,请确保是ANSI 的,而不是unicode,utf-8 等;
Q0010:【CVF / IVF 】Recommended relationship between field width 'W' and the number of fractional digits 'D' in this edit descriptor is 'W>=D+3'
原因:浮点数格式输出符中,W < D+3。
解决:由于浮点数输出时,需输出至少一位整数,一个小数点,(可能的)一个负号。
所以,建议宽度W 大于小数点后的D + 3。
比如3.1415,格式为F6.4,6只比4大2,如果遇到负数,就会无法输出负号。
造成****** 出现。
注意,这只是一个警告,如果你确定不会有负数,则可以无需干涉。
同理,对于科学计数法,会有W>=D+7 的要求。
比如 3.1415E+35,格式为ES10.4,10只比4大6,遇到负号无法输出。
Q0011:【CVF / IVF 】The statement label ?? is referenced but not defined in this scope.
原因:某语句标号的语句被使用了,但没有定义。
比如goto 100,但没有100 这句标号的语句。
解决:补齐语句标号语句,或者取消对该标号语句的使用。
二. 链接错误
Q1001: unresolved external symbol _SOME / 无法解析的外部符号_SOME,该符号在函数_MAIN__ 中被引用
原因:找不到某些函数或子程序。
如果这些函数或子程序在函数库中,没有正确被使用。
如果 SOME 是数组,可能没有定义为数组,而被编译器误认为是函数。
解决:找到这个函数并添加到工程内,或正确设置函数库并使用,或定义该数组。
Q1002: unresolved external symbol _MAIN__ / 无法解析的外部符号_MAIN__,该符号在函数_main 中被引用
原因:找不到主程序。
解决:补充主程序。
Q1003:unresolved external symbol _WinMain@16 / 无法解析的外部符号_WinMain@16__,该符号在函数_main 中被引用
原因:找不到 WinMain 主程序。
WinMain 是 WinGUI 界面工程所需的函数。
解决:如果你不是刻意的开发windows界面程序,请重新选择 console 工程类型。
否则,请补充 WinMain 函数。
Q1004: _MAIN__ already defined in main.obj / _MAIN__ 已经在main.obj 中定义
原因:MAIN 函数已经在main.obj 文件中定义过。
即,有多个文件中书写了相同名称的函数或主函数。
解决:删除多余的同名函数,或者检查是否重复添加了相同的文件在工程中。
三. 运行时错误
请注意,某些编译器编译后的程序,在发生运行时错误时,会弹出VC++ Runtime Library 的警告框。
这是因为这些编译器的 Runtime Library 部分使用了 VC++ 的运行时库。
对于这个警告框,基本上得不到有用的信息。
我们应该查看黑色 console 窗口上的错误提示。
另外,几乎没有程序员可以保证自己的程序一定没有运行时错误。
因为运行时错误可能发生在某些特定的情况之下,而不一定是每次都会发生的。
例如:一个程序大多数时候跑得没有问题,突然有一天遇到内存占用很大,一块数组申请失败;或者忽然有一天,用户的磁盘满了;再或者,用户把一个具有只读属性的文件指定为输出文件;还有杀毒软件的一些拦截行为也可能导致某些操作意外失败。
就计算程序来看,程序可能认为某个曲线是单调的,或者光滑可导的,某个数组的数据一点是大于0 的,某个方程一定是有解的,但实际上用户输入的算例并不一定满足这些条件。
因为用户运行程序,是在未知的计算机环境,未知的算例进行的。
因此,很多意外的运行时错误我们很难预料。
即便是非常商业化的程序,如 QQ,迅雷,Internet Explorer,Visual Studio,甚至我们使用的编译器自身,出现运行时错误意外终止都不是新鲜事。
我们需要做的,恐怕只是尽量的避免运行时错误,使程序在绝大多数情况下可以正常运行计算出结果。
此外,不是所有的运行时错误都需要修改代码,有些还需要调整输入文件,或者改变其他运行环境。
(当然了,改变代码使得程序能更宽泛的适应多种特殊情况更好)
Q2001: floating invalid / math error / DOMAIN error / Integer divide by zero
原因:这是计算时最容易发生的错误,他表示浮点数错误,数学函数错误(如超出数学函数的定义域,负数开方,分母为零等等)。
解决:对数据进行合理控制,判断是否在定义域内,如每个算例均出现,应进行Debug 调试。
Q2002: Program Exception - array bounds exceeded / Subscript #1 of the array A has value 101 which is greater than the upper bound of 100
原因:这是数组越界,即,数组引用的元素超出了定义它的范围。
比如定义a(50:100),如引用a(49) 或a(101) 则会越界。
很多时候,这是循环对数组操作时,没控制好,比如Do i = 50 , 100 然后引用了a(i+1),当i=100时,i+1=101,就会越界。
Intel Fortran 的数组越界会给出很详细的错误提示,包括具体越界的数组名,定义范围和引用角标。
解决:检查越界数组,根据情况修改代码。
Q2003: End-of-file during read
原因:这是读取文件时遇到了文件的结束。
例如,代码要求数据有3行数据,而实际输入文件只有2行。
在某些时候,甚至输入文件根本不存在或是空白文件。
此外,数据文件缺失某些行某些列也是较大的可能。
当然,也可能是循环读取文件时没控制住。
比如想读100行,结果写错了,读了1000行。
有时候,可能是文件路径错误,导致实际读取了另一个空白的文件。
或者文件扩展名被隐藏了,比如读取 a.txt,但实际的文件名却是a.txt.txt
解决:补足数据文件,或者修改代码使得读取的数据与实际数据文件一致。
Q2004: File not found
原因:这个就简单了,文件找不到。
最大的可能是文件名写错了,路径(文件夹)放置不正确。
解决:增加应有的文件,或放置到合适的路径下。
Q2005: Attempt to access non-existent record
原因:一般针对直接读取文件,意思是读写了一个不存在的记录。
例如文件只有2个记录,却视图读取第3个。
也可能是记录长度的字节数设置不正确,使得应该在第2记录的字节超出了文件的字节。
解决:修改代码或修改文件,使得记录长度与个数相匹配。
Q2006: Insufficient virtual memory
原因:程序试图访问一个受保护或不存在的内存地址。
多数为可分配数组,指针等动态内存引发的错误。
解决:确保数组已经经过分配后才访问,确保指针指向可用的内容。
Q2007: Format syntax error at or near x x
原因:在x x 位置或附近的格式符x 错误。
因为使用了错误的输入输出格式符。
解决:修改源代码中对应的格式符,或输入正确的可识别的格式符。
Q2008: List-directed I/O syntax error
原因:输入数据不正确。
例如从文件或字符串中读取整型或浮点数数据,而遇到非数字的符号,比如“abc”
解决:这个问题多数需要修改输入文件。
Q2009: Stack overflow
原因:堆栈溢出。
可能性较多:堆栈不够;程序内局部变量太大或太多;递归调用终止失控。
解决:首先尝试改大堆栈,在不同编译器上具体操作不同。
VS 下可设置工程属性,如图:
命令行下增加链接开关/STACK:1000000000,1000000000
如果还是不足,可将大的局部数组改为可分配数组。
如有递归调用函数,检查其终止条件是否设置合理。
Q2010: Program Exception - access violation
原因:这个问题可能性很多,属于比较麻烦的运行时错误。
表示程序尝试读写一个非法的内存地址。
常见于可分配数组尚未分配就传入子程序使用,子程序中修改了虚参但对应的实参为常数。
等等。
解决:Debug 调试,检查错误所在位置。
Q2011:Formatted I/O to unit open for unformatted transfers / Unformatted I/O to unit open for formatted transfers原因:使用无格式打开的文件,但使用了有格式的输入输出。
或反之。
解决:使用匹配的格式打开和输入输出。
Q2012:Sequential-access I/O to unit open for direct access
原因:使用直接读写方式打开的文件,但使用了顺序读取的输入输出。
解决:使用匹配的读写方式打开和输入输出。
Q2013:Input conversion error
原因:输入时,遇到了异常的转换错误。
可能是输入中包含非法的字符(比如输入一个整数,
遇到了1.7a3),或者输入数据超过了转换数据的范围(比如输入一个32位整数,但输入值超过了2147483648)。
解决:修改文件,去除非法字符。
或使用更长的变量类型容纳大数据。
IVF 的运行时错误官方有专门的文档,大约有700多个。
这里无法一一列举。
如果你遇到运行时错误,请先尝试翻译它。
然后尝试去解决。
CVF和其他编译器的运行时错误与这些类似但不完全相同。
四. 计算结果不符合预期
这是最麻烦的错误了。
编译器和操作系统已经无法帮助我们来检查和预知错误。
需要我们自己进行 Debug 调试,检查计算结果从哪里开始与我们的预期开始不同了。
如果你的代码在其他编译器或其他操作系统上可以正常使用,但更换编译器以后计算结果不正确,也不要觉得奇怪。
语法只是规定了一部分规则,还有很多语法中尚未规定的事情,不同编译器的处理就不一样,导致这种结果。
这恰恰说明代码还有隐含的错误。
一段严谨的代码,会尽量避免上述情况。
我们在书写代码时,也应该如此。
不要让代码离开你的计算机就变成一堆垃圾。
如果你遇到了计算结果不符合预期的情况,耐心的检查吧,以下可能会是突破点:
1.检查变量是否全部定义并给定了类型和精度。
程序单元都使用了 Implicit None 语句。
2.检查变量是否有尚未初始化就使用的情况?
3.函数调用过程中,是否存在虚参实参的类型差异。
4.变量的 Kind 值在不同编译器上的含义是否有差别?
5.直接读取文件的 RecL 的值在不同编译器上含义是否一致?
6.是否使用了依赖编译器的函数库,在更换系统后同样替代的函数,适用范围是否一样?
最后,强调一下,如果你使用的编译器不是 Compaq / Intel Visual Fortran 系列,他们的错误提示与本文的可能不同。
请你首先尝试翻译错误提示,大多数情况错误提示会把问题描述得比较清楚。
1.2 FAQ之Intel Fortran + VS 安装配置
第一,配置IVF + VS 之前的准备工作
首先应该了解,IVF 和 VS 分别是什么?他们在我们的使用过程中,各自发挥什么作用?
IVF 是 Intel Visual Fortran 的简称,是一款主流的 Fortran 编译器。
windows 上的占有率很高,linux 下的表现能力也不错。
VS 是 Visual Studio 的简称,它是微软公司开发的一款开发平台,内含多种微软出品的编译器产品,比如 VC++,,等等。
除此之外,它还具有一个开放的集成开发环境(IDE),
而我们在使用时,基本只是借用它的 IDE 进行工程管理和操作环境。
在另一个FAQ系列介绍中,介绍了一款比较商业化的编译器产品,应当包含(或其中几部分):编译器,链接器,调试器,编辑器,函数库,集成开发环境(IDE)及其他。
在 IVF+VS 这个组合中,编译器,调试器,函数库是 IVF 的组成部分。
而链接器,编辑器,集成开发环境(IDE)是属于 VS 的。
另外我们也需要VS提供的VC++运行库
第二,VS 是不是必须的?安装IVF必须安装VS吗?
根据上面的说法,只有IVF的部分才是必须的。
我们可以使用命令行和make/nmake来管理工程,这样就不需要集成开发环境了。
链接器是免费的,也包含在IVF中。
编辑器,我们可以使用记事本(notepad),UltraEdit,Notepad++ 等等文本编辑器来代替。
至于 VC++运行库和开发库,微软发布有单独的版本,可以直接使用。
所以,VS并不是必须的。
只不过,单独配置这些,需要程序员有一定的基础知识,而且在很多时候IDE确实方便一些,因此,我们建议初学者还是安装IVF+VS更容易上手。
在熟练之后,可了解命令行编译或集成到第三方环境中。
第三,我应该安装什么版本的IVF 和什么版本的VS ?
理论上来说,版本越高的 IVF 越好,可以支持更多的新语法,优化效果也做得更好。
VS 也是一样的。
但是要注意的是,不是所有版本的 IVF 都可以嵌入到所有版本的 VS 里。
选购或获取时,应确保两者能够集成。
目前必须要IVF XE 2013 SP1 update 1 (或以上)才能集成到VS2013 中,如果您不确定自己手上的版本能集成到哪些版本的VS 里,可以插入光盘(或iso虚拟光驱镜像),找到光盘目录:\installs\1033 下面,查看类似下面的文件夹:
可知,当前版本可集成到 VS2008,2010,2012,2013当中。
其他版本的不再支持,包括更早的VS2005。
至于该选用32位,还是64位,要取决于你的计算机环境。
最重要的是操作系统的位数。
有条件的朋友,如果你的操作系统是64位的,可以安装64位的IVF。
关于VS的语言版本,我建议使用英文原版的,在中文的VS里,使用IVF的项目向导可能会有点问题(这不严重)
第四,安装VS 和IVF 的问题?
安装的顺序一般是:先VS,后IVF。
安装过程难度不大,需要注意几点:
1. 尽管IVF和VS都支持中文路径,但我们依然建议把它们安装在简单的英文路径下。
2. VS 安装时,如果你不做其他的工作,可以只安装 VC++ 一个组件。
其他组件均不安装。
3. 安装IVF 时,一般都会勾选 integration to Visual Studio 的组件。
只要不特意取消,都会安装的。
4. 如果安装时,让你确认是否修改环境变量(envionment variables )请选择 Yes。
5. 安装过程最好暂时关闭杀毒软件。
如果你使用的是 win7,但使用了更早版本的 IVF,可能会出现“reading license” 的时候卡死。
这是因为 IVF 的许可读取了你的 CPU 的编号,而在 win7 中这需要更高的权限。
所以,早期版本的 IVF 安装时候就无法读取lincense,请换用更新版本的 IVF 安装。
在VS 和IVF 都安装好以后,请打开VS ,选择帮助(Help)菜单,关于(about)选项,检查是否存在 IVF 的版本信息了。
然后在文件(File),新建(New),项目(Project)菜单里查看,是否已经有了 Intel Visual Fortran 的工程类型。
如果一切都正常的话,你就可以开始使用 IVF 和 VS 了
1.3 FAQ之基本概念
本文介绍了与Fortran相关的基本编程概念,让新手对计算机,编程,Fortran,编译器等有基本概念,强烈推荐新手阅读
如果你打算开始学Fortran,或者认为自己很多概念还比较模糊,那么我们建议你阅读这篇文章。
第一,Fortran 是什么?编译器又是什么?
Fortran 是一门编程语言,特长是科学计算,相信你已经了解了。
很多初学者弄不清楚它和编译器有什么差别。
于是,就出现了很多不严谨的说法,比如:
Fortran在哪儿下载?Fortran能不能支持Win7,64位?Fortran如何打开?Fortran如何执行程序?
实际上,Fortran 与编译器是两个不同的概念。
需要分清它们。
Fortran 是一种语言,是人与人,人与计算机之间的一种约定,是一种抽象的思维方式。
它的概念与中文,英文等是类似的。
因此,你不能下载英文,安装英文,英文也无所谓支持什么操作系统,如何打开什么的。
国际标准化组织制定了 Fortran 语法标准,并且有 FORTRAN66,FORTRAN77,Fortran90,Fortran95,Fortran2003,Fortran2008 等不同的语法标准规范。
这些语法规范都只存在于约
定上,并没有具体的产品,你可以下载到关于这些语法规范的文档,但没有可供你安装使用的产品。
Fortran 语法属于全人类,不属于任何一家公司。
我们都知道,要让计算机做事情,英语和中文是不能直接被计算机接受的。
必须使用计算机能识别的指令,例如二进制的计算机指令,而学习和使用这样的指令非常的繁琐。
于是,人们才制定了高级语言。
Fortran 是高级语言的一种。
那么,高级语言如何让计算机接受呢?这就需要借助编译器产品。
编译器的作用,就是让人类方便接受的高级语言代码,转变为计算机能够识别的指令。
编译器的概念就由此得出了,Fortran编译器,是一种程序,这种程序可以帮助我们把 Fortran 代码,转换为计算机能够识别的可执行代码(exe或其他)。
所以,编译器,才是软件,才能够被下载,被购买,被激活,被打开并操作。
我们把 Fortran源代码交给编译器,编译器把相应的可执行代码输出出来,执行后得到结果。
编译器的概念,与英语词典软件是类似的。
他是属于开发公司。
我们都知道,英语有英式美式的差别,Fortran 与之对应,有 FORTRAN77,Fortran90,95 等等差别。
而英语词典软件,有不同的品牌,比如金山词霸,有道词典,灵格斯词典等等。
Fortran 编译器与之对应,有Intel Fortran,Compaq Fortran,Lahey,PGI,NAG 等等不同的品牌。
有若干厂商和组织都开发了符合Fortran语法规范的编译器产品。
(绝大多数编译器产品都是同时兼容FORTRAN77,Fortran90和95语法的)
我们总结一下这些概念,如表:
上面的表格只是为了示意,有些概念不完全相通。
另外,有一些编程语言也隶属于某个公司,例如微软拥有C#,而 Java 属于 Sun。
这些情况与 Fortran 不完全相同。
第二,我该选择怎样的编译器?编译器与编辑器是什么关系?IDE 是什么?
由第一个问题,我们知道,Fortran 的编译器产品有很多种,很多厂商和个人都开发了 Fortran 编译器。
那么,在这些编译器之中,我们该如何选择呢?哪个编译器更好?
这没有绝对的答案,而应该根据自己的用途和习惯来选择。
以下是我们对新手的一些建议,仅供您参考:
本站另有文章对各平台主流编译器进行更专业和全面的对比。
可参考:/content-6-28-1.html
需要注意的是,我国流传较多的Compaq Visual Fortran 和 PowerStation 这些编译器,不能在 win7 下使用。
这一点经官方承认,我们建议你换用其他编译器产品。
(是的,我们知道,在其他网站,比如百度文库,微博,博客上,你可能会看到关于如何在win7下使用CVF的文章和教程,经过验证,他们都不能完美解决兼容性问题,尤其针对较大的工程类型。
所以,换用新的编译器或许更理智。
)
而在 Linux 平台下,大多数编译器则不包含编辑器和集成开发环境(IDE)。
这是因为,Linux 软件的开放性,使得众多软件之间配合工作更默契。
在 Linux 上,可以轻易的找到通用的代码编辑器和集成开发环境。
例如Code::Block 等。
IDE 是一个为广大程序员提供便利的东西,但实际上,它也让很多初学者缺少了理解很多重要概念的机会。
我们建议你在使用IDE环境的同时,也体验一下原始的命令行编译方式。
后者可以让你很容易理解更多编程中的实质性东西。
第三,使用IDE,还是使用命令行?
不管使用何种方式,操作系统实质都是使用命令行进行编译的。
只不过IDE方式,将很多问题都一键完成了,以致于我们可能会忽略后台做的事情。
以下,是在 windows 上使用 Intel Fortran 命令行编译的最简单的例子(红色框为输入命令):
由此,我们可以看到,执行一个程序的基本的两个步骤。
第一,编译。
执行语句为ifort -c fcode.f90
这个语句告诉 ifort 编译器,把fcode.f90 这个源代码文件转变为目标代码fcode.obj 。
这是编译器的核心。
第二,链接。
执行语句为 link /subsystem:console fcode.obj
这个语句告诉intel 链接器,把 fcode.f90 得到的目标代码fcode.obj 转换为可执行文件fcode.exe。
/subsystem:console 告诉链接器,我们需要链接一个console 类型的可执行文件。
( 这个概念第5个问题后面会提到)
实际上,link 链接器是微软的产品。
只有 ifort 编译器才是 intel 的产品。
上面是一个基本的程序执行过程。
真实的情况要复杂一些。
如下图:。