Thursday, November 26, 2009

Linux下C语言编程基础知识 (zz)

Linux下C语言编程基础知识
作者:Hoyt Em ail:hoytluo@21cn.com

作 者:Hoyt Email:hoytluo@21cn.com

前言:
这篇文章介绍在LINUX下进 行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以 下内容:
源程序编译
Makefile的编写
程序库的链接
程序的调试
头文件和 系统求助

----------------- ------------------------------ ------------------------------------------------------------------------
1.源程序的编 译
在Linux下面,如果要编译一个C语言源程序,我 们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何 使用gcc编译器.
假设我们有下面一个非常简单的源程 序(hello.c):
int main(int a rgc,char **argv)
{
pri ntf("Hello Linux\n");

}

要编译这个程序,我们只要在命 令行下执行:
gcc -o hello hello. c
gcc 编译器就会为我们生成一个hello的可执 行文件.执行./hello就可以看到程序的输出结果了.命令行 中 gcc表示我们是用gcc来编译我们的源程序,-o 选项表 示我们要求编译器给我们输出的可执行文件名为hello 而he llo.c是我们的源程序文件.
gcc编译器有许多选 项,一般来说我们只要知道其中的几个就够了. -o选项我们已经 知道了,表示我们要求输出的可执行文件名. -c选项表示我们只 要求编译器输出目标代码,而不必要输出可执行文件. -g选项表 示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息 .
知道了这三个选项,我们就可以编译我们自己所写的简 单的源程序了,如果你想要知道更多的选项,可以查看gcc的帮助 文档,那里有着许多对其它选项的详细说明.

-------------------------------------------------------------------------------------------------------------------------

2.Mak efile的编写
假设我们有下面这样的一个程序,源代 码如下:

/* main.c */
#include "mytool1.h"
#include "mytool2.h& quot;

int main(int arg c,char **argv)
{
mytoo l1_print("hello");
mytool2_print("hello&q uot;);
}


/* mytool 1.h */
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *pr int_str);
#endif


* mytool1.c */
#includ e "mytool1.h"

void mytool1_print(char *print_s tr)
{
printf("This is mytool1 print %s\n", print_str);
}


/* m ytool2.h */
#ifndef _MYTOO L_2_H
#define _MYTOOL_2_H
void mytool2_print(cha r *print_str);
#endif


/* mytool2.c */
#i nclude "mytool2.h"

void mytool2_print(char *pr int_str)
{
printf(&quo t;This is mytool2 print %s\n&q uot;,print_str);
}


当然由于这个程序是很短的我们可以这样来编译
gcc -c main.c
gcc -c myto ol1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
这样的话我们也可以产生main程 序,而且也不时很麻烦.但是如果我们考虑一下如果有一天我们修改 了其中的一个文件(比如说mytool1.c)那么我们难道还要 重新输入上面的命令?也许你会说,这个很容易解决啊,我写一个SHELL脚本,让她帮我去完成不就可以了.是的对于这个程序来说 ,是可以起到作用的.但是当我们把事情想的更复杂一点,如果我们 的程序有几百个源程序的时候,难道也要编译器重新一个一个的去编译?

为此,聪明的程序员们想出了一个很好的工具来做这 件事情,这就是make.我们只要执行以下make,就可以把上 面的问题解决掉.在我们执行make之前,我们要先编写一个非常 重要的文件.--Makefile.对于上面的那个程序来说,可 能的一个Makefile的文件是:

# 这是上面那个程序的Makefile文件
main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c

有了这 个Makefile文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理都不想去理的.

下面我们学习Makefile是如何编写的.
在 Makefile中也#开始的行都是注释行.Makefile中 最重要的是描述文件的依赖关系的说明.一般的格式是:
target: components
TAB rule

第一行表示的是依赖关系.第二行是规则.
比如说我们上面的那个Makefile文件的第二行 main:main.o mytool1.o mytool2.o
表示我们的目标(target)main的依赖对象(components)是main.o mytool1.o mytool2.o
当倚赖的对象在目标修改后修改的话, 就要去执行规则一行所指定的命令.就象我们的上面那个Makefile第三行所说的一样要执行 gcc -o main main.o mytool1.o mytool2.o 注意规则一行中的TAB表示那里是一个TAB键
Makefile有 三个非常有用的变量.分别是$@,$^,$<
代表的意义分 别是:
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件.
如果我们使用上面三个变 量,那么我们可以简化我们的Makefile文件为:

# 这是简化后的Makefile
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
main.o:main.c mytool1.h mytool2.h
gcc -c $ <

mytool1.o:mytool1.c m ytool1.h
gcc -c $<

mytool2.o:mytool2.c mytool2.h
gcc -c $<


经过简化后 我们的Makefile是简单了一点,不过人们有时候还想简单一 点.这里我们学习一个Makefile的缺省规则
.c .o:
gcc -c $<


这 个规则表示所有的 .o文件都是依赖与相应的.c文件的.例如mytool.o依赖于mytool.c这样Makefile还可以变为:

#这是再一次简化后的Makefile
main:main.o mytool1.o mytoo l2.o
gcc -o $@ $^
.c.o :
gcc -c $<


好了, 我们的Makefile 也差不多了,如果想知道更多的关于Makefile规则可以查看相应的文档.

-------------------------------------------------------------------------------------------------------------------------
3.程序库的链接
试着编译下面这个程序

/* temp.c */
#include

int main(int argc,char **argv)
{
double value;
printf("value:%f\n& quot;,value);
}

这个程序相当简单,但是当我们用 gcc -o temp temp.c 编译时会出现下面所示的错误.
/tmp /cc33Kydu.o: In function `main :
/tmp/cc33Kydu.o(.text+0x e): undefined reference to `log
collect2: ld returned 1 exit status

出现这个错误是因为编 译器找不到log的具体实现.虽然我们包括了正确的头文件,但是 我们在编译的时候还是要连接确定的库.在Linux下,为了使用 数学函数,我们必须和数学库连接,为此我们要加入 -lm 选项. gcc -o temp temp.c -lm这样才能够正确的编译.也许有人要问,前面我们用printf函数的时候怎么 没有连接库呢?是这样的,对于一些常用的函数的实现,gcc编译 器会自动去连接一些常用库,这样我们就没有必要自己去指定了. 有时候我们在编译程序的时候还要指定库的路径,这个时候我们要用 到编译器的 -L选项指定路径.比如说我们有一个库在 /hom e/hoyt/mylib下,这样我们编译的时候还要加上
-L /home/hoyt/mylib.对于一些标准库来说,我们没有必要指出路径.只要它们在起缺省库的路径下就可以了.系统的缺省库的路径
/lib, /usr/lib, /usr/local/lib, 在这三个路径下面的库,我们可以不指定路径.

还有一个问题,有时候我们使用了某个函数,但是我们不知道库的名字,这个时候怎么办呢?很抱歉,对于这个问题我也不知道答案,我只有一个傻办法.首先,我到标准库路径下面去找看看有没有和我用的函数相关的库,我就这样找到了线程(thread)函数的库文件(libpthread.a). 当然,如果找不到,只有一个笨方法.比如我要找sin这个函数所在的库. 就只好用 nm -o /lib/*.so|grep sin>~/sin 命令,然后看~/sin文件,到那里面去找了. 在sin文件当中,我会找到这样的一行libm-2.1.2.so:0000 9fa0 W sin 这样我就知道了sin在 libm-2.1.2.so库里面,我用 -lm选项就可以了(去掉前面的lib和后面的版本标志,就剩下m了所以是 -lm). 如果你知道 怎么找,请赶快告诉我,我回非常感激的.谢谢!

-------------------------------------------------------------------------------------------------------------------------
4.程 序的调试
我们编写的程序不太可能一次性就会成功的,在 我们的程序当中,会出现许许多多我们想不到的错误,这个时候我们 就要对我们的程序进行调试了.
最常用的调试软件是gdb.如果你想在图形界面下调试程序,那么你现在可以选择xxgdb.记得要在编译的时候加入 -g选项.关于gdb的使用可以看 gdb的帮助文件.由于我没有用过这个软件,所以我也不能够说出如何使用. 不过我不喜欢用gdb.跟踪一个程序是很烦的事情, 我一般用在程序当中输出中间变量的值来调试程序的.当然你可以选择自己的办法,没有必要去学别人的.现在有了许多IDE环境,里面已经自己带了调试器了.你可以选择几个试一试找出自己喜欢的一 个用.

-------------------------------------------------------------------------------------------------------------------------
5.头文件和系统求助
有时候 我们只知道一个函数的大概形式,不记得确切的表达式,或者是不记 得着函数在那个头文件进行了说明.这个时候我们可以求助系统.
比如说我们想知道fread这个函数的确切形式,我们只要执行 man fread 系统就会输出着函数的详细解释的. 和这个函数所在的头文件说明了. 如果我们要write这个函数 的说明,当我们执行man write时,输出的结果却不是我们 所需要的. 因为我们要的是write这个函数的说明,可是出来 的却是write这个命令的说明.为了得到write的函数说明 我们要用 man 2 write. 2表示我们用的write 这个函数是系统调用函数,还有一个我们常用的是3表示函数是C的 库函数.
记住不管什么时候,man都是我们的最好助手 .


---------------- ------------------------------ ------------------
好了,这一章就 讲这么多了,有了这些知识我们就可以进入激动人心的Linux下 的C程序探险活动.

From: http://www.aonet.cn/artical/39/200504858.htm

Wednesday, May 20, 2009

Emacs用户手册中文版 zz

译者: con Copyright (c) 1985 Free Software Foundation, Inc; See end for conditions.
You are looking at the Emacs tutorial.

Emacs 的命令通常包括控制键(就是上面标有 Ctrl或Ctl的那个)或者是META键(上面标有ED99v或ALT)。为了方便起见我们将用下面的缩写来代替这些键的全称:

C- 意思是当敲入字符 时同时按住控制键,因此,C-f表 示:按住控制键并且按 f 。 M- 表示当键入 时按住META或ALT或ED99v键。如果没有META 或ALT或ED99v键,则用ESC键代替。 表示ESC键

注意:退出Emacs,按C-x C-c(两个字符)。在文本左边区域的“>>”符号表示让你试着使用一个命令。比如:
>> 现在键入C-v(观看下一屏)移动到下一屏。(就象前面说的,按v的同时也按住控制键)。从现在开始,每当你读完一屏的时候都可以用它来翻屏。
注意在翻屏后会保留上屏的最后一行;这是为你继续阅读文本提供某些连贯性。
你所需要知道的第一件事是如何把光标从一个地方移动到另一个地方。你已经知道了如何向前翻一屏--用 C-v。要向后翻一屏,键入M-v。
>> 试着键入 M-v 和 C-v 几次。
* 摘要(SUMMARY)
---------------------------
下面几个命令对整屏观看时有用:

C-v 向前翻一整屏。
M-v 向后翻一整屏。
C-l 清除屏幕并重新显示所有的文本,然后把光标移动到屏幕的中央。 (注意是Control-L,而不是 Control-1)。
>> 寻找光标,并且注意它在文本里的位置。然后键入C-l。再寻找光标你会注意到光标现在会出现在同样的文本附近。
* 基本光标控制(BASIC CURSOR CONTROL)
-----------------------------------------------------------------
整屏整屏的移动是很有用的,可是如何把光标移动到屏幕上文本里的一个指定的地方呢?
有好几个方法可以实现。最基本的方法是用命令 C-p,C-b,C-f,和C-n。这些命令每个都使光标在屏幕上往特定的方向移动一行或者一列。下面是一个图表显示了这四个命令和它们所移动的方向:


上一行,C-p
:
:
向前,C-b ...... 当前光标的位置 ...... 向后,C-f
:
:
下一行,C-n
>> 用C-n或C-p把光标移动到图表中间。然后键入C-l会看到整个图表出现在屏幕的中央。



你也许会发现这些字母很容易记住:P 代表上面的(previous),N 代表下一个 (next),B 代表向前(backward),F 代表向后(forward)。这些是基本的光标位置命令,你将经常会用到它们。所以现在学习它们很有好处。


>> 用几次 C-n 把光标向下移动到这一行。

>> 用 C-f 把光标移动到行里,再用C-p把光标上移。观察当光标在行的中间时 C-p做了些什么。
每一个文本行都以一个换行符结尾,它用来当作行与行之间的分格。你的文件的最后一行的尾部应该有一个换行符(但Emacs并不要求一定要有一个)。
>> 试着在行的开头使用C-b。它将会把光标移到上一行的末尾。这是因为它向后移的时候穿过了换行符。
C-f 也能象 C-b一样穿过换行符。
>> 使用几次C-b,使您能知道光标在哪。然后用C-f移动到行的末尾。然后再用一次C-f,使光标移动到下一行。

当你移动超过屏幕的顶部或底部,光标回移动到下一屏的中间,这叫做“滚屏 (scrolling)”。它使得Emacs滚屏移动到文本上指定的部位而不是移出屏幕。

>> 试着用C-n把光标移过屏幕的底部,看看回发生什么。

如果觉得一个一个字符的移动太缓慢,可以一个单词一个单词的移动。M-f(Meta-f) 向前移一个单词,M-b向后移一个单词。
>> 键入几个M-f和M-b。

当光标在一个单词的中间,M-f移动到单词的末尾。当光标在两个单词间的空白部分 M-f移动到后一个单词的末尾。M-b与M-f一样,只是移动的方向相反。
>> 键入M-f和M-b几次,中间穿插一些C-f和C-b以使你能观察到M-f和M-b在单词中和单词间的不同行为。

注意比较C-f,C-b与M-f,M-b。通常情况下Meta键用于有关语言单位(词,句,段落) 的操作;而控制键用于编辑时的基本单位(字符,行等)。
这是句与行的比较:C-a和C-e移动到一行的开头和末尾,M-a和M-e移动到一个句子的开头和末尾。
>> 键入一对C-a,再键入一对C-e。 键入一对M-a,再键入一对M-e。

你会看到重复键入的C-a什么也不做,而重复键入的M-a则会移动一个以上的句子。
光标在文本中的位置也叫“点(point)”。在段落里,光标标示出了点在屏幕上文本里的位置。
下面是简单的光标移动命令的总结,包括单词和句子的移动命令:

C-f 向前移动一个字符。
C-b 向后移动一个字符。

M-f 向前移动一个单词。
M-b 向后移动一个单词。

C-n 移动到下一行。
C-p 移动到上一行。

C-a 移动到行首。
C-e 移动到行尾。

M-a 向前移动到句子的开头。
M-e 向后移动到句子的末尾。

>> 试着对每一个命令都实践几次,它们都是经常要用到的命令。
另外两个重要的光标移动命令是M-<(Meta小于),它移动光标到整个文本的开头,M-> (Meta大于)它移动光标到整个文本的末尾。
在多数终端上,“<”在逗号的上面,所以你必须用Shift键来输入它。在这些终端上,你也必须用Shift键来输入M-<;没有Shift键,你可以输入M-逗号。 >> 现在就试试M-<,移动到本教程的开头,然后再用C-v移回这里。 现在就试试M->,移动到本教程的末尾,然后再用M-v移回这里。

你也可以用方向键来移动光标,如果你的终端有方向键的话。我们建议学习C-b, C-f,C-n和C-p有三个原因。第一,它们能在所有类型的终端上工作。第二,你获得了使用Emacs的锻炼,你将会发现输入这些CTRL加字符比按方向键要快(因为你不必把你的手从键盘上移开)。第三,一旦你养成了使用这些CTRL加字符的命令的习惯,你就能一样容易的学习其他高级的光标移动命令。
大多数Emacs命令接收一个数字参数;对大多数命令来说,这表示命令重复的次数。输入重复命令次数的方法是在输入命令之前按C-u和数字。如果你有 META(或ED99v或 ALT)键,则有另一种方法输入数字参数:在按住META键的时候输入数字,我们建议学习C-u方法,因为它能在任何终端上工作。
例如,C-u 8 C-f 向前移动8个字符。
>> 试着使用带数字参数的C-n或C-p,只用一个命令就把光标移动到与本行相邻的 行上。

绝大多数命令把数字参数当作重复次数,但也有几个例外。C-v和M-v就是。当给出一个参数,只是上滚或下滚数字指定的行数而不是屏数。比如,C-u 4 C-v滚动4行屏幕。


>> 现在试试 C-u 8 C-v。
这将使屏幕滚动8行,如果你想往回滚动的话,键入一个带参数的M-v。
如果你正在使用X窗口,在Emacs窗口的左手边有一个叫做滚动条的矩形区域。你能通过用鼠标点击滚动条来滚动文本。
>> 试着在滚动条顶部的高亮区域点击中键。这将使文本滚动,滚动的位置取决于 你点击的长短。

>> 试着按住鼠标中键上移或下移鼠标,你将看到当你移动鼠标时文本会上下滚动。
* 当EMACS挂起时(WHEN EMACS IS HUNG)
------------------------------------------------------------------
当Emacs停止响应你的命令时,你能用C-g把它安全的停止。当一个命令执行了太长的时间时你可以用C-g把它终止。
你也可以用C-g来取消数字参数和输入后又不想执行的命令。
>> 键入C-u 100 产生一个值为100的数字参数,然后按C-g。再按C-f。它只会移动 一个字符,因为你用C-g取消了参数。


如果错误的输入了一个 ,你能用C-g消掉它。
* 禁止命令(DISABLED COMMAND)
----------------------------------------------------
一些Emacs命令是“禁止”的,所以新手不会因偶然而执行它。
如果你键入了一个禁止命令,Emacs会显示一条消息说明这条命令是干什么的,并且问你是否需要执行它。
如果你真的想要执行,敲空格键继续。通常,如果你不想执行禁止命令,用“n”来回答。

>> 输入 :(一条禁止命令),然后用n来回答。

* 窗口(WINDOWS)
-----------------------------
Emacs 能有好几个窗口,每一个显示自己的文本。我们将在后面解释怎样对多窗口操作。现在我们要解释怎样去除多余的窗口屏回到基本的单窗口编辑状态。这是一个例子:
C-x 1 一个窗口(也就是除去其他所有的窗口)。
因为Control-x跟了数字1。C-x 1使包含光标的窗口占满整个屏幕,屏删除其他所有窗口。
>> 把光标移动本行并输入 C-u 0 C-l。
>> 键入Control-h k Control-f。 看这个窗口如何缩小,并在按Control-f的时候出现了一个新的文档窗口。
>> 键入C-x 1 并且看到那个文档窗口消失了。

* 插入和删除(INSERTING AND DELETING)
---------------------------------------------------------------
如果你要插入文本,只须输入文本。输入的字符你能见到,比如A,7,*等等。Emacs 会立即把它们插入。键入 (回车键)插入一个换行符。
你能用 删除你输入的最后一个字符。 就是键盘上标着“Del”的键。在某些情况下,“Backspace”键作用和 一样,但不总是这样!


通常, 立即删除光标前面的那个字符。


>> 输入几个字符,然后用 删除它们。不必担心这个文件回被改变;你不会 替换主教程。这只是你的个人拷贝。

当一行文本太长而超过屏幕宽度时,这一行会在屏幕的下一行被“继续”。文本的右边会有一个反斜杠“”表示它被继续。
>> 插入文本直到最右边,然后再插入。你将看到一个继续了的行。
>> 使用 删除文本直到行的长度在屏幕的宽度以内。继续的行将会消失。

你能像删除其他任何字符一样删除换行符。删除两个行间的换行符会使它们合并为一行。如果这一行很长屏幕显示不下的话,将会用一个继续的行来表示。
>> 把光标移动到一行的开头按 这将使本行和上一行合为一行。
>> 按 重新插入你删除的换行符。

记住大多数的Emacs命令能接收一个重复次数。这包括文本字符,把一个文本字符重复的插入几次。
>> 键入这个-- C-u 8 * 来插入 ********

你现在已经学习了Emacs的大多数输入和排错的方法。你也能一样的删除单词或行。这是删除操作的摘要:
删除光标前面的字符
C-d 删除光标后面的字符
M- 除去光标前面的单词
M-d 除去光标后面的单词
C-k 除去从光标位置到行尾的内容
M-k 除去到当前句子的末尾
注意比较 ,C-d与M ,M-d和C-f,M-f( 不是一个控制字符,但不用担心)。C-k和M-k就象C-e,M-e。
当你一次除去不止一个字符时,Emacs将保存着这些文本,所以你可以恢复它们。恢复那些被除去的文本称作“拉(yanking)”。你能在除去文本的同一地方拉回它们,或是在文本的其他地方。你能对文本拉上几次以产生它们的多个拷贝,拉的命令是 C-y。
注意“除去(killing)”与“删除(Deleting)”之间的区别,被除去的东西能被拉回来,而被删除的不能。通常除去能除去很多的文本屏保存,而删除只能除去一个字符,或是空行或空格,并且不保存。


>> 把光标移到一个空行的开头,键入C-k除去这一行。
>> 按第二次C-k,你将看到剩下的空行也被除去了。



注意单个的C-k除去行的内容,第二个C-k除去行本身,并且使后面的所有行上移。特别要注意数字参数:它除去很多行和它们的内容,这不仅仅是重复。C-u 2 C-k 除去两行和它们剩下的空行;而按两次C-k并不会这样做。


要在当前光标处找回上次被除去的文本;按C-y


>> 试一试,用C-y把文本拉回来。



把C-y考虑为你把某人从你这里拿走的东西再拿回来。注意你如果在一行上按了几次 C-y,所有被除去的文本是存在一起的,所以按一次C-y将拉回全部的行。


>> 现在就试一下,按几次C-k。 现在找回被除去的文本;


>> 按C-y。然后把光标下移几行再按一次C-y,你现在会看到怎样拷贝这些文本。



当你要拉回一些被除去的文本该怎样做呢?C-y只能拉回最近被除去的文本。但以前的文本并没有消失。你能用M-y来恢复它。当你用C-y拉回最近被除去的文本后,换成 M-y可以拉回以前被除去的文本。键入一次又一次的M-y可以拉回更早以前被除去的文本。当你找到要寻找的文本,不必做任何事来保持它,只须离开拉文本的地方继续你的编辑。


如果你M-y了足够多的次数,你会回到开始点(最近被除去的)。


>> 除掉一行,移开,再除掉另一行。 然后用C-y拉回第二行。 然后换成M-y拉回被除掉的第一行。 再按一次M-y看看得到了什么。继续按直到拉回被除去的第二行;然后再做几次。 如果原意的话,你可以给M-y加正的或负的数字参数。


* 撤销(UNDO)
--------------------


如果你对文本作了一些改动,然后又发现这样做是错误的,你能用撤销命令,C-x u 撤销这些改变。

通常,一次C-x u撤销一个改变;如果你在一行上重复几次C-x u,就会重复几次撤销操作。

但有两个例外:不改变文本的操作(包括光标移动和滚屏命令)不算在内;只能处理20 次。


>> 用C-k除去这一行,然后按C-x u 它将重现出来。

C-_是一个可选择的撤销命令;它所作的工作和C-x u 完全一样,只是更容易输入。 C-_的缺点是有些键盘上没有它,这就是为什么还提供C-x u的原因。在某些终端上你可以按住CTRL的时候再敲/来输入C-_。C-_或C-x u把数参数字当作重复次数。

* 文件(FILES)
-------------------

为了永久保存你编辑的文本,你必须把它放到一个文件里。否则当你退出Emacs的时候它就会消失。你通过“查找(finding)”文件,把你编辑的内容放到文件里。(也称为 “访问(visiting)文件”)。


(译注:为了保持与原文的一致性,把find译为“查找”,但是这里和后面出现的 “查找文件”指的都是打开文件的意思。)


查找(finding)一个文件意味着你在Emacs里看文件的内容,在多数情况下,也就是你在编辑它。但是,你用Emacs对它作的改变并不是永久行的,除非你“保存(saving)” 它。所以你可以避免把一个改了一半的文件留在系统上。甚至你保存了文件,Emacs也会把原始文件换个名字保留下来,以防过后你发现对文件的改动是错误的。


如果你观察屏幕的你将看见一个开始和结尾都是破折号的行,并且以“--:**-- TUTORIAL”或之类的东西开始。屏幕的这部分通常显示你正在访问的文件的名字。现在,一个叫做“TUTORAL”的文件,它是你的Emacs教程的个人拷贝。当你用Emacs 查找一个文件,文件名会出现在同样的位置。


查找和保存文件命令不像前面学的那些命令。它们都以字符Control-x开始。以 Control-x起头的是一个完整的命令系列;它们中的许多都是对文件,缓冲,和相关的东西进行操作的。这些命令有两个,三个或四个字符长。


关于查找文件命令的另一件事是你必须给出你需要的文件的文件名。我们说这个命令 “从终端读取一个参数”。(在这种情况下,参数是文件的名字);当你键入命令C-x C-f后,Emacs会提示你输入文件的名字。你输入的文件名会出现在屏幕底部的行上。这个底部的行称为微型缓冲(minibuffer)用于这类较短的输入。你能用Emacs本身的编辑命令来编辑文件名。


当你正在输入文件名(或其他任何微型缓冲区输入),你能用命令C-g来取消。


>> 键入命令C-x C-f,然后输入C-g。这将取消微型缓冲,也取消了C-x C-f命令所使 用的微型缓冲,所以你不查找任何文件。



当你输完文件名后用 来结束。然后C-x C-f开始工作,并开始寻找你所选择的文件。当C-x C-f命令结束后微型缓冲区也消失了。


过一小会儿文件的内容就会显示在屏幕上,然后你就能对它进行编辑了。当想永久保留你的改动时用命令:


C-x C-s 保存文件(save the file)。


这个操作会把Emacs里的文本拷贝到文件里。在你第一次作的时候,Emacs把原始文 件改为一个新名字以使它不至于丢失。新名字是在原来名字的后面加一个“~”。


保存结束后,Emacs打印出被写的文件的文件名。你应当经常的保存,万一系统崩溃 的话你不至于丢失太多的工作。


>> 键入C-x C-s来保存你的教程的拷贝。屏幕的底部会打印出“Wrote.....TUTORIAL”。



注意:在某些系统上,输入C-x C-s 会把屏幕冻结住使你从Emacs看不到更多的输出。这表示这个操作系统的“特性”叫做“控制流程”,它拦截了C-x不让它到达Emacs那里。要使屏幕解冻,输入C-q,然后看Emacs手册里的“Spontaneous Entry to Incremental Search”一节,按上面的建议来对付这种“特性”。


你能查找一个已存在的文件,来查看它或编辑它。你也可以查找一个尚未存在的文件。这是 Emacs:里创建文件的方法:查找文件,将会出现一个空白,然后插入文件的文本。当你 “保存(saving)”的时候,Emacs将会用你插入的文本创建文件。从那时候起,你可以认为你在编辑一个存在的文件了。




* (缓冲)BUFFERS
--------------------------



如果你用C-x C-f查找第二个文件,第一个文件仍然留在Emacs里。你可以再用C-x C-f查找一次来切换回去。用这种方法你在Emacs里有很多文件。


>> 输入C-x C-f foo 来建立一个名为foo的文件。然后插入一些文本,编辑它,并 用C-x C-s来保存“foo”。 最后输入C-x C-f TUTORIAL 以回到本教程。




Emacs把每个文件的文本都保存在一个叫“缓冲(buffer)”的东西里。查找(打开)一个文件就会在Emacs里产生一个新的缓冲。要看你当前运行的Emacs里存在的缓冲列表,输入:


C-x C-b 列出缓冲(list buffers)


>> 输入 C-x C-b



观察每个缓冲都有一个名字,它可能也有一个它所保存的文件的文件名。一些缓冲不对应文件。比如,叫“*Buffers List*”的缓冲没有任何文件。这个缓冲只包含由C-x C-b产生的缓冲列表。你在Emacs窗口里看到的任何文本都是某个缓冲的一部分。



>> 输入 C-x 1 消除缓冲列表。



如果你对一个文件的文本作了改动,然后查找另一个文件,第一个文件并不保存。它的改变保存在Emacs里,在那个文件的缓冲里。被建立或编辑的第二个文件的缓冲并不影响第一个的。这一点很有用,但这也意味着要有一个便捷的方法来保存第一个文件的缓冲。如果要用 C-x C-f切换回去只是为了按C-x C-s保存它将会是一件令人讨厌的事。所以我们用


C-x s 保存缓冲(save the buffer)


C-x s 向你询问每个改动过但未存盘的缓冲,对每个这样的缓冲都询问是否保存。


>> 插入一行文本,然后按C-x s。 将会问你是否保存叫TUTORIAL的缓冲。 输入“y”来回答是。





* 扩展命令集(EXTENDING THE COMMAND SET)
-----------------------------------------------------------------------



有太多的Emacs命令,大大超过了Contorl和meta加上字符所能表示的数量。Emacs用X(扩展 eXtand)命令来解决这个问题。有两种风格:


C-x 字符扩展,后跟一个字符。
M-x 名字命令扩展,后跟一个长名字。


这些命令通常有用,但不如你已经学过的那些命令使用的频繁。你已经见过了它们中的两个:文件命令C-x C-f 用于查找和C-x C-s用于保存。


另一个例子是结束Emacs的命令C-x C-c(不必担心你所作的改动会丢失,在退出Emacs 之前,C-x C-c会提示你保存每一个改动过的文件)。


C-z命令用于*临时*退出Emacs,所以你能回到原来运行的Emacs里。在允许这样做的系统上,C-z把Emacs“挂起”;就是说回到外壳(shell)下,但并不破坏运行的Emacs。在大多数外壳上,你能用‘fg'命令或‘%emacs'来继续Emacs。


在不支持挂起的系统上,C-z建立一个子外壳(subshell)运行于Emacs下以使你能运行其他程序然后回到Emacs;这并不是真正的“退出” Emacs。在这种情况下,通常从子外壳回到Emacs的外壳命令是‘exit'。 有很多C-x 命令,这是已学过的一个列表:


C-x C-f 查找文件
C-x C-s 保存文件
C-x C-b 缓冲列表
C-x C-c 退出Emacs


C-x u 撤销操作


被称作扩展命令的命令的使用频率都不太高。或者是只在某些模式下使用。一个例子是替换字符串的命令,它在全文里把字符串替换为其他的。当你键入M-x, Emacs会在屏幕的底部提示你输入命令;在这种情况下,是“replace-string”。比如输入“repl s ”, Emacs会把命令补全。用 来结束命令。


替换字符串命令要求两个参数--要被替换的字符串和用来替换的字符串。你必须用 来结束两个参数。


>> 把光标移上两行,然后输入M-x repl s changed altered 。 注意现在这一行改变了:你把光标初始位置后的所有单词c-h-a-n-g-e-d替换为了 “altered”





* 自动保存(AUTO SAVE)
------------------------------------



当你改动了一个文件还未存盘的话,所作的改动也许会由于系统崩溃而丢失。为防止这种情况发生,Emacs在编辑时为每个文件提供了“自动保存(auto save)”。自动保存的文件的文件名前后都有一个#号;例如,如果你编辑的文件名叫“hello.c”,自动保存的文件的文件名就叫 “#hello.c#”。当你正常的保存了文件后,Emacs会删除这个自动保存的文件。如果遇到死机,你能打开那个文件后按M-x recover file 来恢复你的编辑,(是你编辑的文件而不是自动保存的文件)。当提示确认时,输入yes 来继续恢复自动保存的数据。




* 回显区域(ECHO AREA)
------------------------------------



如果Emacs发现你输入命令的速度很慢的话它会在屏幕底部为你显示出来,这个区域叫 “回显区域”。




* 模式行(MODE LINE)
---------------------------------



回显区域上面的一行称为“模式行(mode line)”。模式行显示与下面类似的东西:


--**-Emacs: TUTORIAL (Fundamental)--L670--58%----------------


这一行给出了有关你在编辑的文件和Emacs状态的有用信息。


你已经知道了文件名意味着什么。--NN%--指出你现在在文本里的位置;它意味着上面还有NN%的文本。如果是在文件的开头,会用--Top-- 来代替--0%--。如果是在行的末尾,会显示--Bot--。如果你正在看的文本内容很少,可以全部显示在屏幕上,模式行会说 --All--。


前面的星号表示你已经改动过文本了。一旦你保存了文件或打开了一个新文件,模式行的这部分就不是星号而是破折号了。


模式行上括号里的部分是现在的编辑模式。现在是缺省的基本(Fundamental)模式。它是 “主模式(major mode)”的一种。


Emacs有很多不同的主模式。有些意味着不同的语言或不同的文本。如Lisp模式(Lisp mode),文本模式(text mode)等等。在任何时候有且只能有一种主模式被激活。并且它的名字会出现在现在显示“Fundamental”的位置上。


每一个主模式都有些自己的命令。就象不同的编程语言的注释看起来不同一样。每种主模式插入的注释也不同。可以用扩展命令切换进某种主模式。例如,M-x fundamental-mode 是切换进基本模式。


>> 输入 M-x text-mode



不必担心,没有命令会给Emacs带来很大改变。但是你可以看到现在M-f和M-b把省略号当作单词的一部分。而先前,在基本模式里,M-f 和M-b把省略号当成当成分隔符。


主模式通常作诸如此类微小的变化:大多数命令在每个主模式里作“同样的工作”,但又有些微小的不同。


要观看关于你现在的主模式的文档,按C-h m。


>> 键入C-u C-v一次和多次使本行接近屏幕的顶端。
>> 输入C-h m ,看看文本模式和基本模式有些什么不同。
>> 按C-x 1 从屏幕上关掉这个文档。



主模式之所以叫做主模式是因为也存在从模式,从模式与主模式完全不同。每个从模式可以自己打开或者关闭,独立于所有其他从模式,也独立于你的主模式。所以你可以不用从模式或者同时用很多种从模式。


有一种从模式很有用,特别是在编辑英文文本时。它是自动填充模式(auto fill mode)。当这个模式打开的时候,当输入的文本过宽的时候就会自动折行。


你能用M-x auto-fill-mode 来打开自动填充模式。如果此模式已经打开M-x auto- fill-mode 则把它关闭。我们把这叫做切换开关。


>> 输入M-x auto-fill-mode 。然后插入一些“asdf”直到看到这行被分为两行。你必须在中间放一些空格,只有到空格的时候才会换行。



通常边界宽度是70,但你能用带数字参数的C-x f 命令来改变它。


>> 键入带参数20的C-x。(C-u 20 C-x f) 然后输入一些文本看现在每行只有20个字符了。然后用C-x f把它改回70。



如果你在一个段落的中间产生了改变,自动填充模式将不会重新填充。要想重新填充段落,当光标在段落里的时候按M-q。


>> 把光标移到上一段按 M-q。

* 搜索(SEARCHING)
-----------------------------

Emacs 能朝前和朝后搜索字符串(指相邻的一些字符或单词)。搜索是一个移动光标的操作,它把光标移动到字符串出现的下一个地方。


Emacs 的搜索命令和其他大多数编辑器不同,它是“增量式(incremental)”的,这意味着搜索在你键入字符串时就开始了。


开始一个向前搜索的命令是C-s,C-r是往回搜索。但等等,先别忙。


当你输入C-s是你将注意到在回显区域会出现一个字符串“I-search”。这告诉你Emacs开始了一个增量搜索,并在等待你输入要搜索的东西。 结束查询。


>> 现在键入C-s开始一个搜索。慢慢的输入单词‘cousor',在输入每一个字母的时候停顿一 下,注意看光标发生了什么。
>> 再输入一次C-s,来搜索“cursor”出现的下一个地方。
>> 现在输入 四次看看光标移到了哪里。
>> 输入 结束搜索。


看到发生什么了吗?在Emacs的增量搜索里,你输入多少字符串它就试着搜索这些字符出现的地方。到字符串出现的下一个地方,只须再按一次C-s。要搜索的字符串不存在的话,Emacs 会发出蜂鸣并告诉你当前的搜索“失败(failing)”,按 C-g 也是终止搜索。


注意:在某些系统上,输入 C-s 会把屏幕冻结住使你从Emacs看不到更多的输出。这表示这个操作系统的“特性”叫做“控制流程”,它拦截了C-s不让它到达Emacs那里。要使屏幕解冻,输入C-q,然后看Emacs手册里的“Spontaneous Entry to Incremental Search”一节,按上面的建议来对付这种“特性”。
如果你在搜索的过程里按了,你将注意到要搜索的字符串的最后一个字符会被删除并且光标会回到上一个被搜索到的地方。比如,假设你键入了“c”,将会搜索“c”第一次出现的地方。然后如果你键入“u”,光标将移到“ cu”第一次出现的地方。现在键入 。这将从搜索的字符串里把“u”删掉,这时光标回到“c”第一次出现的地方。


如果你在搜索时按了Control或meta键加字符(少数几个少数命令例外,如C-s和C-r),搜索将被终止。


C-s向当前光标的后面搜索字符串出现的地方。如果你需要搜索前面文本里的东西,用C-r来代替。我们所介绍的C-s的每个特性C-r也支持,除了方向相反。


* 多窗口(MULTIPLE WINDOWS)
------------------------------------------------


Emacs有一个非常好的特性是能同时在屏幕上显示不止一个的窗口。


>> 把光标移到本行上按C-u 0 C-l。


>> 现在按C-x 2,它把屏幕分裂成两个窗口,每个窗口都显示本教程。光标在上面的窗口里。


>> 按C-M-v 滚动到下面的窗口里。(如果你没有一个真正的Meta键,那么按ESC C-v)

>> 按 C-x o (“o” 指 “其他(other)”) 把光标移到到下面的窗口里。
>> 用 C-v 和 M-v 滚动下面窗口里的文本。 在上面的窗口里看本教程。


>> 再次按 C-x o 使光标回到上面的窗口里。 现在光标象以前一样在上面的窗口里了。



你能一直用C-x o在窗口间切换。每个窗口都有它自己的光标位置,但仅有一个窗口能显示活动的光标。所有的编辑命令都发生在那个显示光标的窗口上。我们把这个窗口叫做“选中窗口( selected window)”。


当你在一个窗口里编辑文本,而用另一个窗口作参考时命令C-M-v非常有用。你总是能把光标留在所编辑的地方,而用C-M-v来翻阅另一窗口。


C-M-v 是 CONTROL-META 加字符的一个例子。 如果你有一个真正的META 键,你能同时按住 CTRL 和 META 再按“v”来输入C-M-v。CTRL 和 META 谁先按谁后按无所谓。


如果你没有一个真正的META 键, 你可以用 ESC 来代替。这时候次序是有关系的: 你必须让 ESC 跟在 CTRL-v后面; 否则 CTRL-ESC v 将不工作。 这是因为 ESC 是一个有意义的字符而不是一个修饰字符。


>> 输入 C-x 1 (在上面的窗口里) 以消除下面的窗口。



(如果你在下面的窗口里键入C-x 1,将会把上面的窗口去掉。可以把这个命令看作是“只保留你现在在的那个窗口。)


你不必一定要在两个窗口里显示同样的缓冲。如果你在一个窗口里键入C-x C-f查找文件,另一个窗口的内容不会改变。你能独立的在每个窗口里查找文件。


这是让两个窗口显示不同内容的另一种方法:


>> 在你输入的文件名后再输入C-x 4 C-f,然后用 结束。会看到指定的文件出现在下面 的窗口里。光标也在那里面。


>> 键入C-x o 回到上面的窗口,然后输入C-x 1删掉下面的窗口。



* 递归编辑层(RECURSIVE ED99vING LEVELS)
----------------------------------------------------------------

有时候你会进入“递归编辑层(recursive editing level)”。由模式行上的方括号指示。它在主模式名的括号外面。例如你也许会看到(Fundamental)变成了[(Fundamental)]。


要退出递归编辑层,按ESC ESC ESC。这是一个通用的退出命令,你也可以用它除去额外的窗口,或者退出微型缓冲。


>> 输入 M-x 进入一个微型缓冲; 然后用 ESC ESC ESC 离开。

你不能用C-g来退出递归编辑层。这是因为C-g只能取消在递归编辑层里面的命令。


* 获取更多的帮助(GETTING MORE HELP)
--------------------------------------------------------------

在本教程里我们试着为你开始使用Emacs提供了足够多的信息。但是有关Emacs的信息实在是太多以至于不能全部都在这里说明。但是,你还应该学习更多有关Emacs的东西,因为它另外还有很多有用的特性。Emacs提供了很多读取有关命令的文档的命令。这些“帮助”命令都以 Control-h开头,叫做“帮助字符”。


为了使用帮助特性,输入字符C-h,然后再输入一个字符来说明你需要哪种帮助。如果你真的不知道,输入C-h ? 然后 Emacs会告诉你它能给你什么样的帮助。如果你输入了C-h 又觉得不需要任何帮助,你可以用C-g来取消它。


(在有的地方,C-h的作用被改变了。如果按C-h在屏幕的底部没有出现有关帮助的信息的话,试试用F1和M-x help RET来代替。)


最基本的帮助特性是C-h c。输入C-h,然后是字符 c,然后输入一个命令字符和序列;然后 Emacs 会显示这个命令的简洁的描述。


>> 输入 C-h c Control-p.

显示的消息看起来会象这样:


C-p runs the command previous-line


这告诉你“功能的名字”。功能的名字主要用于对Emacs的功能扩充和定制。但因为功能的名字指出了命令的用途,所以最好不要改动它。


C-h c后面可跟多字符命令,比如 C-x C-s 和 (如果你没有 META 或者 ED99v 或者 ALT 键) v 。


要获取有关命令的更多信息,用C-h k 代替 C-h c。


>> 输入 C-h k Control-p.



这将在一个Emacs窗口里显示命令的文档。当你读完后可以用C-x 1除去帮助文本。如果不想马上离开,你可以一边编辑一边参考帮助文本,然后再按C-x 1。


这是一些有用的 C-h 选项:


C-h f 描述一个功能,在你输入了这个功能的名字后。

>> 输入 C-h f previous-line 。 将打印出C-p命令所实现的所有功能。



C-h a 命令查找。输入一个关键字,Emacs将列出所有名字里有这个关键字的命令。 包括所有以Meta-x开始的命令。对有些命令,C-h a 也将列出实现同一功能的 几个命令序列。


>> 输入 C-h a file .




这将在窗口里显示所有名字里有单词“file”的M-x命令。


>> 输入 C-M-v 来滚动帮助窗口,做上几次。


>> 输入 C-x 1 来删除帮助窗口。





* 总结(CONCLUSION)
--------------------------------

记住,永远都用C-x C-c来退出Emacs。用C-z来退到一个临时的外壳里,以使你过后还能回到 Emacs。
本教程尽量让所有的初学者都能理解,如果你发现有些东西不清楚的话,别责备你自己-抱怨吧!


(拷贝与版权)COPYING
---------------------------------

This tutorial descends from a long line of Emacs tutorials starting with the one written by Stuart Cracraft for the original Emacs.


This version of the tutorial, like GNU Emacs, is copyrighted, and comes with permission to distribute copies on certain conditions:

Copyright (c) 1985, 1996 Free Software Foundation


Permission is granted to anyone to make or distribute verbatim copies
of this document as received, in any medium, provided that the
copyright notice and permission notice are preserved,
and that the distributor grants the recipient permission
for further redistribution as permitted by this notice.


Permission is granted to distribute modified versions
of this document, or of portions of it,
under the above conditions, provided also that they
carry prominent notices stating who last altered them.



The conditions for copying Emacs itself are more complex, but in the same spirit. Please read the file COPYING and then do give copies of GNU Emacs to your friends. Help stamp out software obstructionism ("ownership") by using, writing, and sharing free software!

http://blog.csdn.net/chiefsailor/archive/2007/03/22/1538049.aspx

贴自己的.emacs文件 zz

http://hi.baidu.com/chinsung/blog/item/e50bd8545c9b205bd0090665.html


http://hi.baidu.com/chinsung/blog/item/5f33b5518ae5341b377abe4d.html

http://hi.baidu.com/super_c_mew/blog/item/a52be7c94e29bc1f7e3e6ffe.html

Add or eidt file: ".emacs"

(1)After install Emacs, you should create a ".emacs" file yourself, and save it in the path "home/user../"

(2)Install "speedbar" into Emacs

1. download speedbar package from http://packages.ubuntu.com/hardy/speedbar
2. save it in the path opt/speedbar/
3. sudo tar -xzf speedbar-0.14beta4.tar.gz
4. sudo make
Add following code in the file of ".emacs":
;;常用设置
;;(setq default-major-mode 'text-mode);一打开就起用 text 模式。
(global-font-lock-mode t);语法高亮
(auto-image-file-mode t);打开图片显示功能;;
(fset 'yes-or-no-p 'y-or-n-p);以 y/n代表 yes/no,可能你觉得不需要,呵呵。
(column-number-mode t);显示列号
(show-paren-mode t);显示括号匹配
(display-time-mode 1);显示时间,格式如下
(setq display-time-24hr-format t)
(setq display-time-day-and-date t);;
(tool-bar-mode nil);去掉那个大大的工具栏;;
(scroll-bar-mode nil);去掉滚动条,因为可以使用鼠标滚轮了 ^_^
(mouse-avoidance-mode 'animate);光标靠近鼠标指针时,让鼠标指针自动让开,别挡住视线。很好玩阿,这个功能
(setq mouse-yank-at-point t);支持中键粘贴
(transient-mark-mode t);这个忘了,郁闷!
(setq x-select-enable-clipboard t);支持emacs和外部程序的粘贴
(setq frame-title-format "xxx@%b");在标题栏提示你目前在什么位置。你要把xxx改成自己的用户名;;
(setq default-fill-column 80);默认显示 80列就换行

;;color Themes
(load-file "/home/xxx/myemacs/color-theme.el")
(color-theme-deep-blue);选择 deepblue的配色方案

;;speed Themes
~$ cat .emacs
(add-to-list 'load-path "/opt/speedbar/speedbar-0.14beta4")
(autoload 'speedbar-frame-mode "speedbar" "Popup a speedbar frame" t)
(autoload 'speedbar-get-focus "speedbar" "Jump to speedbar frame" t)
(define-key-after (lookup-key global-map [menu-bar tools]) [speedbar] '("Speedbar" . speedbar-frame-mode) [calendar])
;; Texinfo fancy chapter tags
(add-hook 'texinfo-mode-hook (lambda () (require 'sb-texinfo)))
;; HTML fancy chapter tags
(add-hook 'html-mode-hook (lambda () (require 'sb-html)))
;; For any verison of emacs on a linux RPM based system:
;; (autoload 'rpm "sb-rpm" "Rpm package listing in speedbar.")
;; For any version of emacs where w3 is installed:
;; w3 link listings (autoload 'w3-speedbar-buttons "sb-w3" "s3 specific speedbar button generator.")

Monday, May 18, 2009

ubuntu8.10安装配置emacs22

1. 准备工作
(1)安装CVS、SSH
sudo apt-get install ssh cvs

(2)安装texinfo(为了编译man包)
sudo apt-get install texinfo

(3)安装编译所需的支持包
sudo apt-get install libgtk2.0-dev xlibs-dev (GNOME界面相关)
sudo apt-get install xserver-xorg-dev
sudo apt-get install build-essential
sudo apt-get install libncurses5 libncurses5-dev
sudo apt-get build-dep emacs21 (编译emacs21所需)

2.安装
sudo apt-get install emacs

Thursday, May 14, 2009

intel Fortran 编译器 10.1 Linux*版入门 4

英特尔 ® Fortran 编译器 10.1 Linux* 版入门指南、安装指南和发行说明[4]
原始文档下载地址
http://www.intel.com/cd/software/products/apac/zho/358463.htm

系统要求
处理器术语
英特尔® 编译器支持三种平台:处理器与操作系统类型的常规组合。这部分介绍英特尔在其文档、安装过程以及技术支持网站中用于描述平台的术语。

IA-32
IA-32 体系结构指基于以下处理器且运行 32 位操作系统 ("Linux x86") 的系统:通常与英特尔奔腾® II 处理器兼容的 32 位处理器(例如,英特尔® 奔腾® 4 处理器或英特尔® 至强® 处理器),或是其它厂商生产的支持相同指令集的处理器。

Intel® 64
Intel® 64 体系结构指基于带 64 位体系结构扩展的 IA-32 体系结构处理器(例如,英特尔® 酷睿™2 处理器系列)且运行 64 位操作系统 ("Linux x86_64") 的系统。如果系统运行 32 位版的 Linux 操作系统,则适用 IA-32 体系结构。针对 Intel® 64 体系结构应用程序的英特尔编译器还支持以下系统:基于 AMD* Athlon64* 与 Opteron* 处理器,并且运行 64 位操作系统的系统。
IA-64
指基于英特尔® 安腾® 2 处理器且运行 64 位操作系统的系统。

本机与跨平台开发
术语“本机”是指构建一个应用程序,它将在构建时使用的相同平台上运行;例如,在 IA-32 体系结构上构建要在 IA-32 体系结构上运行的应用程序。术语“跨平台”或“交叉编译”是指构建一个应用程序,它运行时使用的平台与构建时使用的平台属于不同的类型;例如,在 IA-32 体系结构上构建要在 IA-64 体系结构上运行的应用程序。并非所有的跨平台开发组合都受支持,有些组合可能需要安装可选的工具与函数库。
下表介绍支持的编译主机(构建应用程序的系统)与应用程序目标(运行应用程序的系统)组合。
IA-32 体系结构主机
支持的目标:IA-32
Intel® 64 体系结构主机
支持的目标:IA-32 与 Intel® 64
IA-64 体系结构主机
支持的目标:IA-64
备注:开发与主机不同的目标时,可能需要从 Linux 发行包中安装可选的函数库组件。
备注:“英特尔® 集群 OpenMP*”是单独授予许可证的功能,与编译器的系统要求也不相同。如需有关详细信息,请参阅“英特尔集群 OpenMP”文档。

开发 IA-32 体系结构应用程序的要求
  • 基于 IA-32 体系结构处理器(最低 450 MHz 主频的英特尔奔腾® II 处理器,或更高级的处理器 - 建议配备英特尔® 酷睿™2 处理器系列或英特尔® 奔腾® 4 处理器)、Intel® 64 体系结构处理器的系统,或是基于 AMD* Athlon* 或 AMD Opteron* 处理器的系统
  • 512 MB 内存(建议配备 1GB)。
  • 100 MB 的磁盘空间,另外还需要 200 MB 空间,用于存放安装过程中下载的文件与临时文件。
  • 以下 Linux 版本(这是经英特尔测试过的操作系统版本的列表;其它版本可能会,也可能不会正常工作,因此不建议使用 - 如有任何疑问,请与“英特尔® 首要支持”联系)之一:
    Asianux* 3.0
    Debian* 4.0
    Fedora* 7
    Red Hat Enterprise Linux* 3, 4, 5
    SUSE LINUX Enterprise Server* 9, 10
    TurboLinux* 11
    Ubuntu* 7.04
  • 安装了“Linux 开发工具”组件,包括 gcc 3.2.3、3.3、3.4、4.1、4.11、g++ 以及相关工具
  • 提供 libstdc++.so.5 的 Linux 组件 compat-libstdc++


针对 Intel® 64 体系结构系统或针对 AMD* Opteron* 处理器开发应用程序时的要求

  • 基于 IA-32 或 Intel® 64 体系结构处理器(建议配备英特尔® 酷睿™2 处理器系列或英特尔® 至强® 处理器),或是基于 AMD Opteron 处理器的系统
  • 512 MB 内存(建议配备 1GB)
  • 300 MB 的空闲硬盘空间,另外还需要 300 MB 空间,用于存放安装过程中下载的文件与临时文件。
  • 100 MB 硬盘空间,用于虚拟内存页面文件。确保使用的虚拟内存量至少达到针对安装的 Linux 操作系统版本所建议的最小值
  • 以下 Linux 版本(这是经英特尔测试过的操作系统版本的列表;其它版本可能会,也可能不会正常工作,因此不建议使用 - 如有任何疑问,请与“英特尔® 首要支持”联系)之一:
    Asianux* 3.0
    Debian* 4.0
    Fedora* 7
    Red Hat Enterprise Linux* 3, 4, 5
    SGI ProPack* 5
    SUSE LINUX Enterprise Server* 9, 10
    TurboLinux* 11
    Ubuntu* 7.04
  • 安装了“Linux 开发工具”组件,包括 gcc 3.2.3、3.3、3.4、4.1、4.11、g++ 以及相关工具
  • 提供 libstdc++.so.5 的 Linux 组件 compat-libstdc++


开发 IA-64 体系结构应用程序的要求

  • 基于英特尔® 安腾® 2 处理器的系统。
  • 512 MB 内存(建议配备 1 GB)。
  • 150 MB 的磁盘空间,另外还需要 200 MB 空间,用于存放安装过程中下载的文件与临时文件。
  • 以下 Linux 版本(这是经英特尔测试过的操作系统版本的列表;其它版本可能会,也可能不会正常工作,因此不建议使用 - 如有任何疑问,请与“英特尔® 首要支持”联系)之一:
    Asianux* 3.0
    Debian* 4.0
    Red Hat Enterprise Linux* 3, 4, 5
    SUSE LINUX Enterprise Server* 9, 10
    TurboLinux* 11
  • 安装了“Linux 开发工具”组件,包括 gcc 3.2.3、3.3、3.4、4.1、4.11、g++ 以及相关工具
  • 提供 libstdc++.so.5 的 Linux 组件 compat-libstdc++


关于 gcc 版本的说明
英特尔编译器使用许多不同的 Linux 操作系统版本(具有不同版本的 gcc)进行过测试。某些 Linux 版本可能包含与已经测试过的版本不同的头文件,这可能会导致问题。您使用的 glibc 版本必须同使用的 gcc 的版本保持一致。
备注:

  • 使用 -O3、-ipo 及 -openmp 等高级优化选项编译非常庞大的源文件(几千行)时,所需的内存量可能会明显大很多。
  • 上面的处理器型号名称列表并非毫无遗漏 - 与上面列出的那些处理器支持相同指令集的其它处理器型号应该也可以正常使用。如果有关于特定处理器型号的问题,请与“英特尔® 首要支持”联系。
  • 有些优化选项在运行应用程序的处理器类型方面存在限制。如需有关详细信息,请参阅这些选项的文档。


安装
如需有关安装编译器与设置编译器环境的详细信息,请参阅单独的安装指南。在本文的其它部分,使用 与 表示的默认安装目录是:
/opt/intel/fc/10.1.xxx(针对 IA-32 与 IA-64)
/opt/intel/fce/10.1.xxx(针对 Intel® 64)
/opt/intel/idb/10.1.xxx(针对 IA-32 与 IA-64)
/opt/intel/idbe/10.1.xxx(针对 Intel® 64)


已知问题
OpenMP 应用程序的二进制文件不兼容
在安装“英特尔编译器 10.1 版”之后,使用“英特尔编译器 9.0 版”并指定 -openmp 开关编译的程序可能无法运行。对于这类程序,加载器可能会在运行时退出,并出现以字符串 _intel 开头的有关未定义符号的错误消息(例如,_intel_fast_memset)。如果发生这种情况,请使用“英特尔编译器 10.1 版”重新编译可执行文件,之后加载器错误消息应该会消失。


RPM 4.0.2 与 RPM 4.1 的安装警告
RPM 4.0.2 无法安装到非默认目录。这个问题在 RPM 4.0.3 中已经解决。RPM 4.1 无法安装到非默认目录。这个问题在 RPM 4.11 到 4.2 中已经解决。


静态链接 libpthreads 时的段冲突
在某些版本的 Linux 上,对于使用静态链接的 libpthreads.a 构建的应用程序(使用 -static 时,默认使用 libpthreads.a), 在使用大于 2GB 的堆栈空间时,可能会因为段冲突而失败。这是 Linuxthreads 的一个已知问题。如果遇到此问题,请动态链接 libpthreads。作为变通方法,在 Red Hat Linux 9 与 Red Hat Enterprise Linux 3.0 上,您可以安装 nptl-devel 软件包,并在 ifort 命令行上传递 "-I/usr/include/nptl -L/usr/lib/nptl"。这将创建一个静态链接的二进制文件,它将仅在 nptl 下运行,但没有堆栈大小的限制。


OpenMP 限制

  • 在某些版本的 Linux POSIX 线程库中,堆栈大小限制以硬编码方式写在程序中,因此在某些版本的 Linux 上,需要很大堆栈空间的 POSIX* 多线程程序可能无法正确运行。英特尔编译器使用 POSIX 线程库来实现基于 OpenMP 的自动生成的并行化,因此这些限制也适用于 OpenMP 程序 (-openmp) 以及使用英特尔编译器自动生成的并行程序 (-parallel)。超出堆栈空间限制的多线程程序通常会遇到段冲突或寻址错误。
    要避免这些限制,请使用在构建时定义了 FLOATING_STACKS 参数的 glibc 版本。对于某些发行版,这意味着使用共享的 pthread 库而不是静态版的 pthread 库。然后,使用 ulimit -s 或 limit stacksize 命令将最大 shell 堆栈大小设置为明显非常大的值(以 KB 为单位,但不是 unlimited),并将 KMP_STACKSIZE 环境变量设置为所需的线程堆栈大小(以字节为单位)。请注意,在 bash shell 中,只能使用一次 ulimit -s 来设置很大的最大堆栈大小。在 C shell (csh) 中,可以使用 limit stacksize(参数之前没有短划线)重复设置最大堆栈大小。
  • 请注意,在特定版本的 Linux(Red Hat Enterprise Linux 4 及更早的版本是已知的示例)上,默认安装的 /usr/lib/libpthread.a 与 /usr/lib/libc.a 不完全支持 Linux 线程本地存储器(Thread Local Storage,简称 TLS)。使用 Linux TLS 机制并使用 -static 进行链接时,如果尝试访问线程本地存储器,则包含 -openmp 或调用 libpthread 便可能触发运行时故障。为纠正此问题,请安装 nptl-devel.rpm 软件包(包含在 Linux 安装光盘上)并使用 -L/usr/lib/nptl 进行编译。
  • 如果公用块声明为带 OpenMP 指示的 THREADPRIVATE,则公用块在声明它的所有源文件中都必须有相同的长度。


IA-64 Linux 系统上的 gprel relocation(gprel 重新定位)错误消息
在运行 Linux 的 IA-64 系统上,使用 -shared 开关创建“动态共享目标”(.so) 时,在 ld 阶段可能会生成一些 "relocation against dynamic symbol"(动态符号重新定位)消息,类似于:
/usr/bin/ld: for_init.o: @gprel relocation against dynamic symbol for__segv_default_msg/usr/bin/ld: for_init.o: @gprel relocation against dynamic symbol for__l_fpe_mask/usr/bin/ld: for_init.o: @gprel relocation against dynamic symbol for__l_undcnt

...
要纠正此问题,请将 -i_dynamic 与 -nofor_main 开关添加到命令行。对于 9.0 版,指定 -shared 时,将自动设置 -i_dynamic 与 -nofor_main。


不再支持 -ipo_obj 选项。
强制生成直接目标代码的 -ipo_obj 选项不再受支持。如果指定该选项,则会发出一个警告,并且其效果与指定 -ip 时的一样。
在 IA-64 体系结构系统上,-relax 不再传递给链接器
对于 9.0 版,编译器驱动程序不再将 -relax 开关传递给 IA-64 体系结构系统上的链接器,原因在于这与 -r 选项冲突。使用 binutils 2.11.90.0.27 或更高版本(建议使用 2.14)时,由于 -relax 是默认选项,因此不需要指定它。如果必须使用较早版本的 binutils 并希望指定 -relax 选项,请在调用链接器的编译命令中使用 -Xlinker -relax。


SLES 10 上关于 libunwind.so.7 的 ld 警告
在 SUSE LINUX Enterprise Server 10 上使用英特尔编译器构建应用程序时,可能会看到类似以下的警告:
ld: warning: libunwind.so.7, needed by /usr/lib/gcc/ia64-suse-linux/4.1.0/../../..//libgcc_s.so, may conflict with libunwind.so.6
变通办法是将以下命令行添加到 ifort.cfg:
-L /usr/lib
此问题会在将来发行的英特尔编译器中得到解决。


使用 CPU 自动调度 (-ax*) 时的调试信息有限
使用 -ax{WNBP} 进行编译时,会为每个函数生成两份代码。一份是针对通用代码,另一份是特定于 CPU 的代码。每个函数的符号随后引用“CPU 自动调度”例程,在运行时确定要执行生成的哪一个代码部分。使用名称在这些函数上设置的调试器断点会导致应用程序在调度例程中停止。这可能会导致在调试时出现意外的行为。此问题可能会在将来版本的“英特尔调试器”与“英特尔编译器”中得到解决。


对于构建时未使用 -fp 的 IA-32 体系结构的程序,无法进行调试或无法查看其跟踪信息
使用 -fp 编译时,指定将 IA-32 体系结构 EBP 寄存器用作帧指针,而不是用作通用寄存器。调试器与跟踪处理器可能无法正确展开特定的堆栈(包含对编译时未使用 -fp 的函数的调用)。如果使用 -g 或 -O0 进行编译,-fp 是隐含启用的;但明确指定更高的优化级别(如 -O2)时,则不会启用它。如果希望在应用程序上使用调试器或跟踪器,并且要使用的优化级别高于 -O0,则还应该指定 -fp,以确保调试器与跟踪处理器可以使用帧指针。

汇编器可能无法识别生成的代码
旧版 GNU 汇编器可能无法处理编译时使用了 -[a]xP、T 或 S 选项而生成的汇编代码。如果对于您而言这是个问题,请使用 binutils 2.17.50.0.15 或更高版本。

用带扩展调试信息的 idb
如果使用 inline_debug_info、semantic_stepping、variable_locations 或 extended 等 -debug 关键字,则应该使用“英特尔调试器”(idb);原因在于其它调试器可能不理解这些扩展信息,并因此出现无法预测的行为。我们正在与其它调试器的开发人员合作,以期获得他们对扩展调试信息的支持。


不支持 -auto_ilp32 选项
-auto_ilp32 选项不受支持,该选项指定应用程序不得超出 32 位地址空间(这在文档中有提及)。


启用运行时检查时,可能也会启用编译时检查
在某些情况中,使用 -check 或 -C 选项启用运行时检查时,如果当时可以诊断所请求的条件,则可能会导致编译器在编译时发出针对该条件的诊断信息。例如,如果指定 -check bounds 或 -CB,则常数下标的数组越界可能会导致编译时错误。


技术支持
如果未在安装过程中注册编译器,请访问英特尔® 软件开发产品注册中心进行注册。注册之后,在技术支持服务期间,您可以获取免费技术支持、产品更新以及升级。
如需有关如何找到“技术支持”、“产品更新”、“用户论坛”、常见问题、提示与技巧的信息,以及其它技术支持信息,请访问:http://www.intel.com/software/products/support/flin。
备注:如果分销商提供本产品的技术支持,请与他们而不是英特尔联系技术支持事宜。


提交问题
提交问题的步骤:

  • 转到 http://www.intel.com/software/products/support,然后单击“英特尔® 首要支持”的链接。
  • 登录该网站。请注意,用户名与密码区分大小写。
  • 单击“产品”下拉列表旁边的“执行”按钮。
  • 单击左侧导航栏中的“提交问题”链接。
  • 从“产品类型”下拉列表中,选择“开发环境(工具、SDV、EAP)”。
  • 如果是与软件或许可证相关的问题,请从“产品名称”下拉列表中选择“英特尔(R) Fortran 编译器 Linux* 版”。
  • 输入问题,填写随后出现的各个窗口中的所有字段,以便成功提交问题。
    备注:在提交源代码(对源代码的访问需要限制为特定的国家或地区)之前,请通知技术支持代表,以确定是否允许受理这项请求。


问题报告或产品建议的指导原则:

  • 描述困难或建议。对于问题报告,请尽可能具体一些,以便我们能够重现问题。对于编译器问题报告,如果可能,请包含编译器选项与较小的测试用例。
  • 描述系统配置信息。使用以下命令获取 glibc 与内核的版本:

> uname -a

> rpm -qa grep glibc

如果未安装 rpm,请使用以下命令:

> ls /lib/libc*

并将信息复制到相应的“英特尔® 首要支持”字段。
使用以下命令获取“英特尔 Fortran 编译器”的“软件包标识”:

ifort -V

然后从输出内容中,将“软件包标识”(如 l_fc_x_10.1.xxx)复制到相应的“英特尔® 首要支持”字段中。请包含可能有助于我们重现并解决您的问题的任何其它特定信息。

  • 如果无法安装编译器或获取“软件包标识”,请输入所下载的文件名作为软件包标识。


已解决的问题
如需了解最新版的编译器中已经解决的问题,请查阅 <软件包标识>_README(例如 l_fc_x_10.1.xxx_README),它可以从英特尔® 软件开发产品注册中心的“产品下载”部分下载。
编译器源代码减错器 (CESR)
“ 编译器源代码减错器”(CESR) 包含一套非常有用的实用程序,它们可以单独使用,也可以组合在一起使用,能够对由 C/C++ 或 Fortran 源代码组成的测试用例进行多种处理,包括收集、缩减、精确定位、保护、文档编制及打包等。如果希望从庞大的应用程序中提取较小的测试用例提交给“英特尔® 首要支持”,它会很有帮助作用。CESR 可以从英特尔® 软件开发产品注册中心的“产品下载”部分进行下载。选择您的产品,然后在“版本”下拉列表中选择 CESR。CESR 是实验性产品,我们不为它提供技术支持,但仍然非常欢迎您通过“英特尔® 首要支持”向我们提供有关该产品的反馈。CESR 要求先安装 Python* 2.2 或更新版本。


文档
您可以使用 Web 浏览器来查看英特尔编译器以及相关的基于 HTML 的文档。您应该使用支持 JavaScript 的 Web 浏览器(如 Firefox*),这样它便可以为联机帮助文件提供全面的浏览、搜索、索引查询,以及超链接功能。
文档安装在 /doc 目录中。HTML 索引文档可以在 /doc/Doc_Index.htm 中找到。英特尔® 调试器手册 在“英特尔® 调试器”的 doc 目录中以 HTML 的形式提供。
查看手册页
ifort(1) 手册页提供 ifort 编译器命令的命令行选项列表及相关信息。要显示 ifort(1) 手册页,在使用 source 命令执行 < 文件以设置环境之后,输入以下命令:
$ man ifort
man 命令提供一些单键或组合键,让您滚动查看显示的内容、搜索字符串、跳转到某个位置,以及执行其它功能。例如,输入 z 查看下一个屏幕;或输入 w 查看上一个屏幕。要获得有关 man 命令的帮助,请输入 h 键;查看完帮助时,输入 q 键以返回到所显示的手册页中。要进行搜索,请输入 / 字符,后接搜索字符串 (/string),然后按 Enter 键。查看 man 命令文本之后,输入 q 以返回到 shell 命令提示符中。


查看文档
在受支持的 Linux* 发行版所附带的 Web 浏览器上,HTML 文档格式经测试可以正常工作。PDF 版的编译器文档可以在以下位置找到:http://developer.intel.com/software/products/compilers/flin/docs/manuals.htm


附加信息
相关产品与服务

有关英特尔软件开发产品的信息可以在 http://www.intel.com/software/products 上找到。
其中一些相关产品包括:
Intel® Software College 为开发人员提供一流的软件开发技术培训。培训包括在线课程与讲师指导的课程,内容涵盖所有的英特尔架构、平台、工具及技术。
英特尔® VTune™ 性能分析器可以评估应用程序的 CPU 使用情况,并帮助确定是否可以通过进行一些修改来改善应用程序的性能。
英特尔® C++ 与 Fortran 编译器是让软件运行如飞,并全面支持最新英特尔处理器的重要组成部分。
英特尔® 性能程序库提供一套针对各种英特尔处理器进行过优化的例程。英特尔® Math Kernel Library 为科学与工程软件的开发人员提供一整套线性代数、快速傅立叶变换以及矢量数学函数,它们均针对最新的英特尔处理器进行过优化。英特尔® 集成性能基元包含多个跨平台的工具,可针对多种英特尔架构与多个操作系统构建高性能的软件。


免责声明与法律信息
本文所含信息专门针对英特尔(R) 产品提供。本文并未授予任何知识产权的许可证,无论是明确、暗示、禁止翻供还是其它任何形式。除这些产品的“英特尔销售条款”之规定外,英特尔概不承担任何其它义务,对于英特尔产品的销售与/或使用(包括适合特定用途、适销性或不侵犯任何专利权、版权或其它知识产权),英特尔不作任何明确或暗示的担保,也不承担任何赔偿责任。未经英特尔公司书面同意,不应将英特尔产品用于任何在发生故障时可能会造成人身伤亡的用途,英特尔产品并未针对这些用途而设计,也不旨在用于这些用途。
英特尔随时可能更改技术规格与产品说明,如确有更改,恕不另行通知。标有“保留”或“未定义”字样的任何功能或指令,其存在性与特性均不确定,设计人员切勿对此有所依赖。英特尔保留这些供将来定义之用,对于因将来对它们的更改而导致的任何冲突或不兼容现象,英特尔概不承担任何责任。本文所含信息可随时更改而不另行通知。不应依赖这些信息进行最终设计决策。
本文所述产品可能包含一些设计缺陷或错误(统称错误),导致产品与发布的规格不符。目前已确定的错误可应客户要求提供。
在订购产品之前,请与当地的英特尔销售办事处或分销商联系,以获取最新规格。
对于本文中引用的并且包含订单号的文档,或是其它的英特尔文档,均可通过拨打 1-800-548-4725 或访问英特尔网站来获取。
赛扬、迅驰、英特尔、英特尔徽标、Intel386、Intel486、英特尔酷睿、安腾、MMX、奔腾、VTune 以及至强是英特尔公司在美国以及其它国家或地区的商标。
* 其它品名与品牌可能是属于其它公司的资产。
(C) 2007 英特尔公司版权所有。保留所有权利。

(http://blog.sina.com.cn/s/blog_51ffcfc301009utw.html~type=v5_one&label=rela_nextarticle)

intel Fortran 编译器 10.1 Linux*版入门 3

英特尔 ® Fortran 编译器 10.1 Linux* 版入门指南、安装指南和发行说明[3]
原始文档下载地址
http://www.intel.com/cd/software/products/apac/zho/358463.htm

英特尔® Fortran 编译器 10.1 Linux* 版发行说明
目录
概述
新增功能
系统要求
安装
已知问题
技术支持
文档
附加信息
免责声明与法律信息
概述
本 产品为 Linux* 软件开发人员提供各种工具,用于创建性能出众的 Fortran 应用程序。“英特尔® Fortran 编译器”是完整的 Fortran 95 语言编译器,它包含 Fortran 2003 标准中的许多功能,此外还有广泛的主流语言扩展。英特尔编译器通过对并行化与 OpenMP* 的支持,来支持多线程代码的开发。
产品内容
本产品有两个版本。
标准版包含以下组件:
  • 针对 IA-32 体系结构应用程序的“英特尔® Fortran 编译器”
  • 针对 IA-64 体系结构应用程序的“英特尔® Fortran 编译器”
  • 针对 Intel® 64 体系结构应用程序的“英特尔® Fortran 编译器”
  • 针对 IA-64 体系结构应用程序的“英特尔® 汇编器”
  • 英特尔® 调试器(请参阅单独的“发行说明”)
  • 实用程序
    英特尔® 编译器代码覆盖工具
    英特尔® 编译器测试优先级调整工具
  • 光盘文档
    为方便访问所有的文档,提供了一个文档索引。它位于 /doc/Doc_Index.htm

专业版包含“标准版”的所有内容,外加“英特尔® Math Kernel Library”,这个函数库包含许多经过高度优化且充分线程化的数学函数,适用于对性能要求极高的工程、科学以及金融等领域的应用。
备注:“英特尔® Fortran 编译器”的安装路径是 /opt/intel/fc/10.1.xxx,其中 xxx 代表 3 位数字的更新号。本文通篇使用 一词指代默认的安装路径。
“英特尔® Math Kernel Library”的安装独立于编译器。如需有关详细信息,请参阅“英特尔® Math Kernel Library 安装指南”。
要获取本产品中提供的各种工具的技术支持与产品更新,需要进行注册。如需了解如何注册,请参阅下面的技术支持部分。


兼容性
对 于使用 8.0 版之前的编译器(包括会创建 .mod 文件的那些编译器)编译的所有 Fortran 源代码,都必须重新编译。使用 8.0 之前的版本构建的第三方函数库也需要重新构建 - 如果使用的第三方函数库不支持“英特尔 Fortran”,请通过“英特尔® 首要支持”https://premier.intel.com 告诉我们是哪些。使用“英特尔 Fortran 8.0”或之后的版本构建的 Fortran 源代码无需使用 10.1 版重新编译。
另请参阅下文的“Fortran-C/C++ 混合语言应用程序的链接方面的变动”部分。


10.0 与 10.1 版的新增功能
以下部分讨论“英特尔 Fortran 编译器”自 10.0 版以来所引入的新功能与更改。对于“英特尔调试器”,请参阅单独的发行说明。
新增与更改过的命令行选项
下面列出自 9.1 版初次发行以来新增或更改过的命令行选项。如需有关这些选项的详细信息,请参阅编译器文档。
-assume [no]old_boz
控制二、八、十六进制的常数在作为 INT、REAL、DBLE 及 CMPLX 等内部函数的参数时如何进行处理。请参阅下面关于 Fortran 2003 行为的说明。(默认值:-assume noold_boz)
-assume [no]old_unit_star
控制与设备* 之间如何进行输入、输出,以及如何处理 ACCEPT、PRINT 以及 TYPE。请参阅下面关于 Fortran 2003 行为的说明。(默认值:-assume old_unit_star)
-assume protect_parens
确定优化器在对 REAL 与 COMPLEX 表达式进行求值时,是否会不重新组合各个运算来优先处理括号。(默认值:off)
-assume [no]realloc_lhs
确定赋值语句左侧的可分配对象是按照 Fortran 95/90 规则还是 Fortran 2003 规则进行处理。请参阅下面关于 Fortran 2003 行为的说明。(默认值:off)
-assume [no]std_mod_proc_name
确定是否允许模块过程的名称与用户外部符号名称冲突。请参阅下文备注。(默认值:off)
-axS
指定编译器生成“SSE4 矢量化编译器与媒体加速器”指令(针对将来支持这些指令的英特尔处理器)以及普通的 IA-32 体系结构代码。(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)
-check [no]pointer
启用或禁用以下运行时检查:是否通过空指针进行访问,或是否访问未分配的 ALLOCATABLE 变量。(默认值:off)
-cxxlib-nostd
防止编译器链接标准的 C++ 库(默认值:off)
-diag-
控制诊断信息的显示(默认值:off)
-diag-dump
告诉编译器打印所有已经启用的诊断消息并停止编译(默认值:off)
-diag-enable sv[123]
启用“静态验证器”。(默认值:off)
-diag-enable sv-include
指定“静态验证器”也应考虑 include 文件。
-diag-file[=file]
将诊断分析的结果输出到一个文件。(默认值:off)
-diag-file-append[=file]
将诊断分析的结果附加到一个文件。(默认值:off)
-[no-]diag-id-numbers
告诉编译器通过使用诊断消息的标识号值来显示诊断消息(默认值:on)
-f[no-]align-functions[=n]
告诉编译器以最优字节边界对齐函数。(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)
-fast
启用一组用于改善性能的选项。在此发行版中,这些选项已经改变。请参阅下文备注。
-f[no-]instrument-functions
确定是否在函数入口与出口点插入指令(默认值:off)
-f[no]-keep-static-consts
告诉编译器保留给源代码中未引用的变量分配的空间(默认值:off)
-fp-speculation=
告诉编译器推测浮点运算时的模式(默认值:fast)
-[no-]func-groups
如果启用评测信息,则启用或禁用函数组合功能(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)
-gdwarf-2
启用使用 DWARF2 格式生成调试信息的功能(默认值:off)
-heap-arrays[-]
指定应该在堆而不是堆栈上分配自动数组,以及为了临时计算而创建的数组。
-help [category]
显示所有可用的编译器选项或某一类编译器选项(默认值:off)
-ipo-jobs
指定要在“过程间优化”(IPO) 的链接阶段同时执行的命令(作业)数
-march=
告诉编译器生成针对指定的 CPU 的代码(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)
-msse[n]
告诉编译器生成针对特定英特尔® 处理器的代码(仅限 IA-32 与 Intel® 64 体系结构,默认值:IA-32 为 off,Intel® 64 体系结构为 -msse2)
-mtune=core2
告诉编译器选择为英特尔® 酷睿™2 处理器系列带来好处的优化(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)
-openmp-lib type
可供指定用于链接的 OpenMP* 运行时库。. (默认值:legacy)
-[no-]opt-multi-version-aggressive
告诉编译器主动使用多版本功能来检查指针别名与标量替换。(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)
-opt-ra-region-strategy [=keyword]
选择寄存器分配器用于将每个例程划分成区域的方法。(仅限 IA-32 与 Intel® 64 体系结构,默认值:default)
-opt-streaming-stores keyword
启用生成数据流存储以进行优化的功能。(仅限 IA-32 与 Intel® 64 体系结构,默认值:auto)
-[no-]par-runtime-control
生成代码以便对具有符号循环边界的循环执行运行时检查。(默认值:off)
-par-schedule-[=n]
指定 DO 循环迭代的调度算法
-[no-]prefetch
启用或禁用预取插入优化。在 IA-32 体系结构上使用时需要指定 -xT。(仅限 IA-32 与 IA-64 体系结构,默认值:off)
-save-temps[-]
告诉编译器保存编译期间创建的中间文件(默认值:off)
-shared-intel
使英特尔提供的库可以动态链接(默认值:除 libguide 之外,所有的库都静态链接)
-shared-libgcc
动态链接 GNU libgcc 库。(默认值:off)
-static-intel
使英特尔提供的库可以静态链接(默认值:除 libguide 之外,所有的库都静态链接)
-static-libgcc
静态链接 GNU libgcc 库。(默认值:off)
-std 或 -stand
与 -std03 或 -stand f03 相同。请注意,这与之前的版本相比有所变化。(默认值:off)
-std03 或 -stand f03
告诉编译器针对不符合 Fortran 2003 标准的源代码语法发出警告。(默认值:off)
-tcheck []
指出要对 OpenMP 多线程应用程序执行的分析方法(默认值:off)
-tcollect
插入调用“英特尔® 踪迹收集器”API 的指令探针(默认值:off)
-[no-]unroll-aggressive
告诉编译器对包含小常数遍历计数的循环主动使用完整的展开。(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)
-[no-]vec-guard-write
告诉编译器在矢量化循环中执行条件检查。(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)
-xO
指 定编译器要生成 SSE3、SSE2 以及 SSE 指令,并且要针对含 SSE3 的英特尔® 奔腾® 4 处理器与英特尔® 至强® 处理器进行优化。生成的代码应该能够在并非英特尔制造但支持 SSE3、SSE2 以及 SSE 指令集的处理器上运行,如某些 AMD* 处理器。此值不启用在 S、T、P 等处理器值中启用的某些优化选项。(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)
-xS
指 定编译器生成“SSE4 矢量化编译器与多媒体加速器”指令(针对将来支持这些指令的英特尔处理器)。此选项还允许编译器生成 SSSE3、SSE3、SSE2 以及 SSE 指令,并且它可以针对将来的英特尔处理器进行优化。(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)


不再建议使用的和已经删除的命令行选项
如需有关不再建议使用(仍然起作用,但将在未来的版本中删除)或已经删除(不再支持)的命令行选项的详细信息,请参阅光盘文档中的 Compiler Options > Deprecated and Removed Compiler Options(编译器选项 > 不再建议使用的和已经删除的编译器选项)部分。
-fast 的含义已更改
-fast 选项是一种简便方式,用于指定通常可改善运行时性能的一组选项。如文档所述,随着时间的推移,这组选项可能会发生变化。在 10.0 版中,-fast 设置 -xT;而在较早的版本中,它设置 -xP。如果此变化对您而言不合适,则您必须单独指定所需的选项,而不是使用 -fast。如需有关详细信息,请参阅光盘文档上的 Compiler Options(编译器选项)部分。


-stand 的含义已更改
在 10.0 版中,指定 -stand 选项而后面不跟关键字时,其含义已经变为 -stand f03,即检查是否符合 Fortran 2003。通过指定 -stand f90 或 -stand f95,您可以选择检查是否符合 Fortran 90 或 Fortran 95。-std 是 -stand 的替代性拼写法。请注意,Intel® Fortran Language Reference(英特尔® Fortran 语言参考)仍然将 Fortran 2003 功能作为对 Fortran 95 的扩展来突出介绍。


在 Intel® 64 体系结构系统上,默认情况下 -xW 是启用的
在 Intel® 64 体系结构的系统上,默认情况下 -xW 是启用的;这相当于启用矢量化,您可能会看到显示的矢量化报告消息,这是使用以前的发行版所无法看到的。要禁用矢量化报告消息,请使用 -diag-disable vec。您仍然可以指定替代性选项,如 -xP 或 -axT。


替代性命令行选项
许多命令行选项都有老式的拼写,选项名称中的单词之间使用下划线 ("_") 而不是连字符 ("-") 来连接。老式拼写仍然是有效的替代性选项名称。


支持 gcc* OpenMP* 库
对于 10.1 版,您可以通过指定 -openmp-lib compat 来指定使用与 gcc 兼容的 OpenMP 库。如果您的应用程序包含某些使用 gcc 或 g++ 所构建的源模块,并且使用了 OpenMP,这可能正是所需要的。默认值是 -openmp-lib legacy,它使用英特尔提供的 OpenMP 库。


Fortran 2003 行为
Fortran 2003 定义作为对以前标准的扩展,或是较早的标准中未指定的语言功能的行为。尽管“英特尔 Fortran 编译器 10.1 版”尚不支持 Fortran 2003 的全部功能;但在某些情况中,此编译器现在选择的是 Fortran 2003 的行为,而较早的编译器版本选择的则是不同的行为。在其它某些情况中,此编译器的默认行为尚没有发生变化。这些情况如下文所述。


对可分配对象的赋值
在 Fortran 95 中,对可分配数组的赋值要求赋值语句左右两侧的形状与长度参数都要匹配。在 Fortran 2003 中,如果形状与长度参数不匹配,则取消分配所赋值的变量,然后重新分配到与赋值的表达式匹配的形状与长度参数。对于 10.1 版,编译器可以执行 Fortran 2003 指定的额外操作,但由于这些操作会明显影响性能,默认值是保留 Fortran 95 行为,即形状与长度参数要求匹配。如果希望采取 Fortran 2003 的行为,即在形状不匹配时取消并再次分配变量,请指定 -assume realloc_lhs


二、八、十六进制常数
在 Fortran 95 中,二、八、十六进制常数(“BOZ 常数”)只能出现在 DATA 语句中,并且限制为初始化标量整型变量。作为 Fortran 95 的扩展,“英特尔 Fortran 编译器”允许 BOZ 常数出现在任何上下文中,类型诠释由上下文来确定。Fortran 2003 对 BOZ 常数的用法进行了扩展,允许它们初始化任何数值类型,并且允许它们出现在 INT、REAL、DBLE 以及 CMPLX 内部函数的参数中。
BOZ 常数用法的 Fortran 2003 语义同以前“英特尔 Fortran”的扩展版相同,但 BOZ 常数作为 INT、REAL、DBLE 以及 CMPLX 等函数的参数的情况除外。按照 Fortran 2003 的规定,在这些上下文中,BOZ 常数诠释为二进制值,也就是直接作为内部函数返回的数据类型进行诠释;而在以前的“英特尔 Fortran”诠释中,BOZ 常数先是视作有符号整型值,随后再进行转换。
例如:
print *, real(Z'40490FDB')
按照旧式的行为 (-assume old_boz),打印结果是 1.0785300E+09;而按照新的行为 (-assume noold_boz),打印结果是 3.141593。
对于 10.0 版,“英特尔 Fortran”的默认行为是 Fortran 2003 的行为,即传递二进制值而不进行转换。如果应用程序需要旧式的行为,请使用 -assume old_boz 选项进行编译。


默认 I/O 设备 *
在“英特尔 Fortran 编译器”中的默认情况下,同 ACCEPT、PRINT 以及 TYPE 语句使用的 I/O 设备* 与隐含设备关联的设备号和可以在 OPEN 语句中指定的设备号(如设备 5 或 6)不同。Fortran 2003 要求程序员能够 OPEN 这些默认设备,这与当前“英特尔 Fortran”的行为不兼容。
在 10.0 版中,已经添加了 -assume [no]old_unit_star 编译命令行选项以控制此行为。默认值 -assume old_unit_star 对于不同于设备 5 和 6 的设备,保持当前与过去的行为。如果希望使用 Fortran 2003 的行为,或如果将使用 Fortran 2003 内部模块 ISO_FORTRAN_ENV 及其定义的 INPUT_UNIT 与 OUTPUT_UNIT 常数,请指定 -assume noold_unit_star 让设备*(以及 ACCEPT、PRINT 和 TYPE)使用设备 5(输入)和 6(输出)。
此行为的默认值在将来的发行版中可能会改变。


RECL= 无格式文件的单位
在 10.0 版中,同“英特尔 Fortran”8.x 与 9.x 版中一样,打开文件进行无格式 I/O 时,在 OPEN 中为 RECL= 关键字指定的值是四字节单位,即默认整数的大小。以前的 Fortran 标准规定,RECL= 单位“独立于实现”,但 Fortran 2003“建议”使用单字节。要将无格式 I/O 的 RECL= 单位指定为字节,请使用现有的编译器选项 -assume byterecl。如果您的应用程序使用 ISO_FORTRAN_ENV 内部模块中的 FILE_STORAGE_SIZE 命名参数,则也必须使用此选项。


.XOR。内部函数操作符
作为扩展,“英特尔 Fortran”编译器定义了内部函数操作符 .XOR.。由于内部函数操作符具有与用户自定义操作符不同的优先级,这会导致与相同名称的用户自定义操作符发生冲突。如果您定义自己的操作符 .XOR.,则可以指定 -assume no_old_xor 以禁用编译器将 .XOR. 当作内部函数操作符的定义。


模块过程与变量的全局符号
“英特尔 Fortran”编译器通过将模块名称与过程或变量名称合到一起(以字符串 "_mp_" 分隔),然后应用标准的名称修饰规则,来构造模块过程与变量的全局名称。例如,MYMOD 模块中的 SUB 过程的全局名称为 MYMOD_mp_SUB。此方法可能会与名称中包含 _mp_ 字符串的用户过程产生冲突。如果您的应用程序发生这种冲突,请指定 -assume noold_mod_proc_name 选项,它会将分隔符的大小写切换为与默认名称的大小写相反。您必须为整个应用程序指定相同的选项,以使所有名称保持一致。


数据流 I/O(Fortran 2003 功能)
对于 10.1 版,编译器支持 Fortran 2003 数据流 I/O 功能,它提供按照字节流来读取和写入文件的能力。要启用数据流访问,请打开指定 ACCESS='STREAM' 的文件。READ 与 WRITE 语句支持 POS= 关键字,可以指定文件位置。如需有关详细信息,请参阅“英特尔 Fortran 编译器语言参考”。


RECORDTYPE='STREAMxx' 的行为改变
作为扩展,“英特尔 Fortran”支持 OPEN 语句中的 RECORDTYPE 值 STREAM、STREAM_CR 及 STREAM_LF。在以前的版本中,文档与实现都不正确,并且两者不一致。旧的行为如下:
RECORDTYPE='STREAM'
写入时,将 LF 用作行终结符。输入时,不识别分隔符。
RECORDTYPE='STREAM_CR'
写入时,将 CR-LF 用作行终结符。输入时,不识别分隔符。
RECORDTYPE='STREAM_LF'
写入时,将 CR-LF (Windows)、LF(Linux* 与 Mac OS*)用作行终结符。输入时,不识别分隔符
此外,如果指定了 CARRIAGECONTROL='NONE',则行为已发生改变。
在 10.1 版中,行为改变如下:
RECORDTYPE='STREAM'
不写入或读取分隔符。类似于 Fortran 2003 的数据流 I/O
RECORDTYPE-'STREAM_CR'
将 CR 当作记录分隔符进行写入和读取
RECORDTYPE='STREAM_LF'
将 LF 当作记录分隔符进行写入和读取
按如下所示定义新选项:
RECORDTYPE='STREAM_CRLF'
将 CR-LF 对当作记录分隔符进行读取和写入
CARRIAGECONTROL 不再影响 RECORDTYPE 的行为。
在 Windows 上,默认格式的记录分隔符是 CR-LF;在 Linux 与 Mac OS 上则是 LF。利用这些更改,现在可以使用相同的方式在所有三种操作系统上指定特定的分隔符类型。
如果希望在无须编辑源代码的情况下更改应用程序的运行时行为,则可以定义一个新的环境变量 FOR_FMT_TERMINATOR。此环境变量的值采用以下形式:
mode[:ulist][;mode[:ulist]...]
其中 mode 是 CR、LF 或 CRLF 之一,ulist 是应用该模式的可选设备号范围,例如,2,17-20, 91


Fortran 2003 的新增功能
自 9.1 版最初发行以来,Fortran 2003 标准中已经添加了以下功能。其中某些功能第一次出现在 9.1 版的更新中。如需有关详细信息,请参阅 Intel® Fortran Language Reference(英特尔® Fortran 语言参考)。
ASYNCHRONOUS 属性和语句
BIND(C) 属性和语句
PROTECTED 属性和语句
VALUE 属性和语句
指针对象的 INTENT
赋值语句右侧在形状或长度上存在差异时,重新分配其左侧的可分配变量(要求使用 "assume realloc_lhs" 选项)
FLUSH 语句
WAIT 语句
OPEN 的 ACCESS='STREAM' 关键字值
OPEN 与数据传输语句的 ASYNCHRONOUS 关键字
INQUIRE 与数据传输语句的 ID 关键字
INQUIRE 与数据传输语句的 POS 关键字
INQUIRE 的 PENDING 关键字
用户自定义操作符的重命名
IMPORT 语句
USE 语句的 INTRINSIC 与 NON_INTRINSIC 关键字
ISO_C_BINDING 内部模块
用于 COMMAND_ARGUMENT_COUNT 内部过程的 ISO_FORTRAN_ENV 内部模块(必须使用 /assume:byterecl 与 /assume:noold_unit_star 进行编译,以便得到正确的值)。
GET_COMMAND 内部过程
GET_COMMAND_ARGUMENT 内部过程
GET_ENVIRONMENT_VARIABLE 内部过程
IS_IOSTAT_END 内部过程
IS_IOSTAT_EOR 内部过程
MOVE_ALLOC 内部过程
NEW_LINE 内部过程
SELECTED_CHAR_KIND 内部过程


其它语言功能
如需有关以下新增语言功能的详细信息,请参阅 Intel® Fortran Language Reference(英特尔® Fortran 语言参考)。
ASSUME_ALIGNED 指示
LOOP_COUNT 指示
MEMORYTOUCH 指示
OPTIMIZE 指示
MULT_HIGH_SIGNED 内部过程


用于指定默认记录长度的新环境变量
现提供两个新的函数变量,可用于更改应用程序的运行时行为:FORT_FMT_RECL 与 FORT_UFMT_RECL。
FORT_FMT_RECL 用于给为进行有格式 I/O 而打开的所有 Fortran 设备指定默认的 RECL(记录长度)值。如果定义为十进制无符号整型值,则使用该环境变量值时,仿佛该值是在 RECORDTYPE 不是 'FIXED' 的情况下为 OPEN 的 RECL= 指定的那样。它最常见的用途是更改表式输出的行长度,默认值是 80 列。
FORT_UFMT_RECL 用于给为进行无格式 I/O 而打开的所有 Fortran 设备指定默认的 RECL(记录长度)值。如果定义为十进制无符号整型值,则使用该环境变量值时,仿佛该值是在 RECORDTYPE 不是 'FIXED' 的情况下为 OPEN 的 RECL= 指定的那样。它最常见的用途是更改使用 RECORDTYPE='SEGMENTED' 打开的文件的最大段长,默认值是 2040 字节。


OpenMP* 应用程序的 KMP_AFFINITY 环境变量
KMP_AFFINITY 环境变量可以在 OpenMP* 应用程序中用于指定应该如何将执行线程绑定到系统中的处理器上。此设置的效果是在程序执行期间按照线程的创建顺序,以轮流的方式将每个线程绑定到系统中的处理器核心。KMP_AFFINITY 的值应该采用以下形式:
compact,
其中 是一个非负整数。例如:
compact,1
参数指定连续线程的绑定核心在机器拓扑图(用二叉树表示)中的间隔。级别零表示,对于启用了“英特尔® 超线程技术”的处理器,线程将绑定到处理器的连续线程上下文;如果未启用,则绑定到连续的处理器。从线程上下文到核心,再到封装(处理器),级别依次增加一级。此设置仅有英特尔公司提供的处理器才支持,并且所在的系统必须使用支持线程绑定的操作系统。


改善的并行器与矢量器
此版本采用一个完全重新设计的优化器,在包含内存与循环优化的 O2 与 O3 优化级别,优化器会将并行化(所有体系结构)与矢量化(IA-32 与 Intel® 64 体系结构)的功能集成到一起。
通过采取以下措施可以显著改善性能:
生成更高效的多线程代码
生成更高效的 SIMD 代码
增强的循环转换


新增与改进的高级循环转换优化报告
“循环转换 (HLO) 优化”报告可以告诉您编译器为什么无法对某组循环进行循环交换,并提示是否可通过更改源代码来消除所报告的瓶颈。这些报告现已经过改进,可以提供更详细的信息,并且也更容易理解。


静态验证器
“静态验证器”是一个新的编译器功能,可跨越多个源文件对程序执行静态分析。它可以检测不同种类的缺陷,以及用户代码中语言功能的可疑或不一致的用法,并按照严重程度进行报告。“静态验证器”可以理解 C/C++ 与 Fortran 代码,也可以分析 OpenMP 指示。


Fortran 2003 功能摘要
“英特尔 Fortran 编译器”支持最新版 Fortran 标准(即 Fortran 2003)中的许多新功能。在将来的版本中,将出现更多的 Fortran 2003 功能。当前编译器支持的 Fortran 2003 功能包括:
Fortran 字符集已扩展到包含 8 位 ASCII 字符 ~ \ [ ] ` ^ { } # @
名称最长可达 63 个字符
语句最长可达 256 行
允许方括号 [ ] 代替 (/ /) 用作数组构造器的分隔符
命名为 PARAMETER 常数可以用作复常数的一部分
可分配的衍生类型组分
ASYNCHRONOUS 属性和语句
BIND(C) 属性和语句
PROTECTED 属性和语句
VALUE 属性和语句
VOLATILE 属性和语句
指针对象的 INTENT 属性
赋值语句右侧在形状或长度上存在差异时,重新分配其左侧的可分配变量(要求使用 "assume realloc_lhs" 选项)
在所有的 I/O 语句中,以下数值可以是任何类型:UNIT=、IOSTAT=
FLUSH 语句
WAIT 语句
OPEN 的 ACCESS='STREAM' 关键字
OPEN 与数据传输语句的 ASYNCHRONOUS 关键字
INQUIRE 与数据传输语句的 ID 关键字
数据传输语句的 POS 关键字
INQUIRE 的 PENDING 关键字
以下 OPEN 数值可以是任何类型:RECL=
以下 READ 与 WRITE 数值可以是任何类型:REC=、SIZE=
以下 INQUIRE 数值可以是任何类型:NEXTREC=、NUMBER=、RECL=、SIZE=
在以下情况中允许执行递归 I/O:除自己的内部文件之外,新启动的 I/O 不会修改其它任何内部文件
IEEE 无穷大与 NaN 按照 Fortran 2003 规定的格式化输出进行显示
在 I/O 格式中,如果 P 编辑描述符后面跟一个重复说明符,则编辑描述符后面的逗号可有可无
USE 中用户自定义操作符的重命名
USE 中的 INTRINSIC 与 NON_INTRINSIC 关键字
IMPORT 语句
可分配的虚拟参数
可分配的函数返回值
COMMAND_ARGUMENT_COUNT 内部函数
GET_COMMAND 内部函数
GET_COMMAND_ARGUMENT 内部函数
GET_ENVIRONMENT_VARIABLE 内部函数
IS_IOSTAT_END 内部函数
IS_IOSTAT_EOR 内部函数
MOVE_ALLOC 内部函数
NEW_LINE 内部函数
SELECTED_CHAR_KIND 内部函数
以下内部函数可接受可选的 KIND= 参数:ACHAR、COUNT、IACHAR、ICHAR、INDEX、LBOUND、LEN、LEN_TRIM、MAXLOC、MINLOC、 SCAN、SHAPE、SIZE、UBOUND、VERIFY
ISO_C_BINDING 内部模块
ISO_FORTRAN_ENV 内部模块

在此发行版中,启用“静态验证器”时,不会调用链接器,因此不会产生可执行文件或静态/动态链接库,作为调用“静态验证器”的结果而产生的目标文件无效,不应用于生成实际的可执行文件或静态/动态链接库。当前用法模型是添加“静态验证器”作为替代性的构建选项,以产生诊断报告。
“静态验证器”不能与交叉文件过程间优化 (/Qipo) 结合使用。
如需有关详细信息,请参阅光盘文档中关于 Building Applications > Error Handling > Handling Compile Time Errors > using Static Verification Diagnostic Options(构建应用程序 > 错误处理 > 处理编译时错误 > 使用静态验证诊断选项)的部分。


(http://blog.sina.com.cn/s/blog_51ffcfc301009utu.html~type=v5_one&label=rela_nextarticle )