Linux系统的C编程PPT课件_第1页
Linux系统的C编程PPT课件_第2页
Linux系统的C编程PPT课件_第3页
Linux系统的C编程PPT课件_第4页
Linux系统的C编程PPT课件_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十一章 Linux系统的C编程 第十一章 Linux系统的C编程 11.1 编译器 11.2头文件 11.3链接器与库文件 11.4 静态库 11.5 共享库 11.6 make与Makefile 11.7 调试器gdb 11.8 UNIX/Linux其它编程工具简介 11.1 编译器 11.1.1 功能及用法 11.1.2 参数及说明 11.1.3 示例 11.1.4 gcc的工作过程 11.1.1 功能及用法 1.为什么要使用编译器? C语言源程序需要经过编译和链接这两个过程才能转换 成二进制可执行程序。 一般在Unix系统中使用的C编译器是cc(C Compiler的 缩写)。在各个L

2、inux发行版本中广泛使用的C编译器 名为gcc(GNU cc)。为了保持与Unix系统的兼容,在 Linux系统中cc作为了gcc的一个链接。 2.gcc的功能 gcc能将C/C+源程序和目标程序编译并 调用链接程序ld生成可执行文件,如果用 户没有给出可执行文件的名字,gcc将默 认生成一个名为a.out的可执行文件。 3.gcc的用法 gcc的一般用法为: gcc options 其常用格式为: gcc -c-S-E-s-g -static-shared-rdynamic -Idir -Ldir -lmylib -Olevel -x Language -Dmacro=defn -Umac

3、ro-mmachine-option -o out_file infile 几点说明 gcc根据源程序的扩展名来决定使用哪一种语言的编译器进 行编译工作。 扩展名为“.c”的文件被gcc认为是C语言的源程序文件。例 如:gcc hello.c gcc编译出来的可执行程序默认是a.out。 g+是一个C+版本的gcc编译器。 g+要求C+语言源程序文件带有扩展名“.cc”或 “.C”。例如:g+ hello.cc, g+ hello.C 参数 -c:编译后仅输出*.o型的目标文件,而不 连接生成可执行程序 -S:编译后仅生成汇编语言文件*.s,但不 生成目标文件和可执行代码 -s:生成可执行文件

4、时,删除符号表和重定 位信息。生成成品软件时使用 -E:在预处理过程后结束,不进行编译和 连接,也不生成可执行代码 -g:在可执行文件中加入调试信息,便于程 序的调试 参数(续) -o outfile:指定输出文件名。若不指定则生成a.out -Idir:将目录dir添加到头文件搜索范围 -lmylib:连接时搜索库libmylib.a -Ldir:将目录dir添加到库文件搜索范围 -OL:编译时进行优化。L为优化级别,分别03和 s。生成最终产品时使用 -static:禁止使用共享库(动态连接库) -shared:生成共享库 -rdynamic:连接时使用共享库 11.1.3 示例 C程序

5、设有一个文件名为hello.c的程序,其内容为: #include#include main()main() printf(“Hello World!n”);printf(“Hello World!n”); 编译和执行步骤 编译 gcc hello.c #生成可执行程序a.out,或 gcc o hello hello.c #生成可执行程序hello 运行 ./a.out或 ./hello 输出结果 Hello World! 2. c+程序 一个c+版的Hello World程序,其文件名为 hello.C,内容为: #include main (void) cout Hello, World

6、! endl; 编译方法 使用c+或g+来编译: g+ hello.C#生成可执行程序a.out c+ o hello hell.C#生成可执行程序hello g+ s -o Hello hello.C#生成删除符号表的可执行程序Hello 或使用gcc并指定库文件来编译c+程序: gcc c hello.C#生成目标文件hello.o gcc o h hello.C lstdc+#指定标准c+库,生成可执行程序h 11.1.4 gcc的工作过程 使用gcc/g+由C源代码文件生成可执行 文件的过程,有以下四个阶段 预处理(也称预编译,Preprocessing) 编译(Compilation

7、) 汇编(Assembly) 链接(Linking) 11.2 头文件 在标准C中有两种形式的头文件使用方式: #include #include“headfile.h” 区别: #include 型头文件搜索范围为默认位 置/usr/include, #include“headfile.h”型头文件的搜索位置为当前 目录,在Linux的GNU C中,若当前目标不存在 headerfile.h,则也会到默认位置去搜索。 11.3 链接器与库文件 UNIX/Linux的链接器为ld,其功能是将目标文件 或库文件链接在一起,生成可执行文件,一般在 编译过程的最后执行。 Linux标准库文件一般存放

8、在目录/lib或/usr/lib。 默认情况下链接器查找C语言的标准库函数。如 果使用的不是标准的库函数,必须通过-llib或- Llibdir告诉链接器ld,否则将无法找到库函数。 关于库文件的规定 库文件命名必须遵守一定命名规则,库文件名字必 须永远以lib开头,后紧跟库类名,文件名的后缀为 .a:传统静态库 .so:共享库或动态链接库 例如,libc.a为标准C库,libm.a为数学运算静态库, libm.so.6和libc.so.6分别为标准C和数学运算共享库。 11.4 静态库 静态库也叫档案(archive),以.a为后缀, 用于编译链接后生成静态可执行文件。 用户可以使用库管理程

9、序ar和ranlib来创 建和管理自己的或已有的静态库。 11.4.1 引例 设有C语言文件f1.c,f2.c,f3.c,它们的内容分别为: /文件f1.c的内容 f1(int arg) printf(”F1: you passed: %dn”,arg); /文件f2.c的内容: f2(char *arg) printf(”F2: you passed: %sn”,arg); /文件f3.c的内容 #include main() fprintf(stderr,”Begine: n”); f1(15); f2(”Hello World!”); fprintf(stderr,”:Endn”); e

10、xit(0); 编译与链接 可以采用各模块文件分别编译然后再统一链接 的办法进行编译。 cc c f1.c f2.c/生成f1.o和f2.o cc o f f3.c f1.o f2.o/生成f cc o fp f3.c f1.c f2.c/生成fp cc c f1.c f2.c f3.c/生成f1.o,f2.o和f3.o cc o myp f1.o f2.o f3.o/生成myp 11.4.2 构造和管理静态库 用户可以使用命令ar构造自己的静态库: cc -c f1.c f2.c#生成目标文件f1.o和f2.o ar crv libmyl.a f1.o f2.o#生成库libmyl.a ra

11、nlib libmyl.a#为子函数建立索引表 说明 ar用于静态库文件的管理,其功能是库创建、 修改和从库中取出模块等 ranlib用于为刚建立的库文件建立索引表, 通过索引表可以加快库文件搜索速度。其用 法为: ranlib -vV ar_file 11.4.3 使用自己的库 #使用库libmyl.a和f3.c生成可执行程序fp: cc -o fp f3.c libmyl.a #使用库libmyl.a和f3.o生成可执行程序fp: cc -o fp f3.o libmyl.a #-L指定当前目录,-lmyl指定静态库文件libmyl.a: cc -o fp f3.c -L. lmyl 11

12、.5 共享库 Linux系统的另一种库文件为共享库,用于 生成动态链接的可执行程序。 共享库文件名的格式为: libNAME.so.N NAME为库名,N为版本号。 可用命令ldd和ldconfig命令管理共享库。 11.5.1 构造共享库 共享库构造非常简单,只需要在构造库的时 候使用-shared参数就可以了。 例如:用f1.c和f2.c构造共享库,方法是: #生成目标文件 cc -c f1.c f2.c #由目标文件生成共享库 cc -shared -o libmy.so f1.o f2.o #由源文件生成共享库 cc -shared -o libmy.so -c f1.c f2.c 1

13、1.5.2 共享库的使用 共享库要使用头文件dlfcn.h和几个相关的 函数: dlerror dlopen dlsym dlclose。 1. dlopen 功能: 用于打开指定共享库,并返回文件描述符。 原型及用法: void *dlopen(const char *, int flag); 返回值: 成功时返回文件描述符,否则返回NULL。 dlopen函数的相关说明 变量为共享库名。若文件名不以/开头,则为非绝对路 径名,将按以下顺序搜索库文件:(1)环境变量中的 LD_LIBRARY_PATH值指定的路径;(2)动态链接缓冲 文件/etc/ld.so.cache;(3)库文件默认目录

14、/lib,/usr/lib。 变量flag用来表示在什么时候解决未定义的符号,其取 值范围与意义如下: (1)RTLD_LAZY:指定在动态链接库的函数执行时解决; (2)RTLD_NOW:指定在dlopen返回前就解决所有未定义的符 号问题。一旦有未解决好未定义的符号,dlopen将返回 NULL表示错误。 注意:RTLD_LAZY和RTLD_NOW可以与 RTLD_GLOBAL配合使用,使得那些在以后才加载的 库可以获得其中的符号。 2. dlsym 功能:返回共享中指定函数的入口地址 原型及用法: void *dlsym(void *handle, char *symbol); 说明:

15、dlsym根据共享库文件描述符(handle)与符号 (symbol),返回symbol对应的(函数)入口地址, 相当于返回一个(函数)指针。 3. dlclose 功能: 关闭已经打开的指定共享库文件,此操作应 在共享库相关操作完成之后进行。 原型及用法: int dlclose (void *handle); 4. dlerror 功能: 返回动态共享库操作状态信息。当共享库操 作函数执行失败时,dlerror可以返回出错信 息,否则返回值为NULL表示成功。 原型及用法为: const char *dlerror(void); 5. 共享库使用示例 为了使用刚创建的共享库,需要对11.4

16、.1引 例中的模块文件f3.c进行修改。假定修改后 的文件被命名为f3n.c,其代码如下: #include #include #define SO_FILE ./libmy.so main() void *sfp; char *err; int tmpi=16; int (*f1)(int ),(*f2)(char *); /定义函数指针 sfp=dlopen(SO_FILE,RTLD_LAZY);/打开共享库 if(sfp=NULL) fprintf(stderr,dlerror(); exit(1); f1=dlsym(sfp,f1);/获取函数f1入口地址(指针) err=dlerro

17、r();/检查是否成功 if(err) fprintf(stderr,err); exit(2); f2=dlsym(sfp,f2); /获取函数f2入口地址 err=dlerror(); /检查是否成功 if(err) fprintf(stderr,err); exit(3); fprintf(stderr,-begine-n); f2(Test String); /调用函数f2 f1(tmpi); /调用函数f1 fprintf(stderr,+end+n); dlclose(sfp); /关闭共享库 exit(0); 编译方法 编译方法为: cc o myp f3n.c ldl 由共享库

18、libmy.so生成可执行程序myp,-ldl则指 示链接程序ld使用dl函数库。 在编译时也可以使用-rdynamic参数,告诉链接 程序在链接时所有函数均使用共享库。其方法 为: cc rdynamic o myp f3n.c ldl 6. 共享库的管理 ldd (2) ldconfig (1) ldd 功能: ldd(Library Dependency Display)用来显示一 个可执行程序或共享库所使用的共享库间的 依赖关系。 例如: ldd myp ldd /usr/bin/mesg (2)ldconfig 功能: 在默认目录(/lib和/usr/lib)或动态库配置文件/etc

19、/ld.so.conf 内所列的目录下或指定目录下搜索共享库,进而创建出动 态装入程序ld.so所需的链接和缓存文件。 缓存文件默认为/etc/ld.so.cache,其中保存有已排好序的 由/etc/ld.so.conf指定的目录内动态链接库名字列表。 为了让系统或用户动态链接库为系统所共享,需要运行 ldconfig来对共享库进行配置。 ldconfig通常在系统启动时运行,而当用户安装了一个新 的动态链接库时,就需要手工运行这个命令。 用法为: ldconfig 选项选项 ldconfig的使用示例 1) 显示搜索的目录和共享库,并更新缓存文件 /etc/ld.so.cache ldco

20、nfig -v 默认情况下,ldconfig不输出任何东西。使 用-v参数可以显示正在扫描的目录及搜索到 的共享库。 2) 安装共享后,更新目录/lib内的符号链接 ldconfig n /lib 11.6 make与Makefile 11.6.1 make的用法简介 11.6.2 Makefile文件 11.6.3 make的用法简介 11.6.4 Makefile示例 11.6.1 make的用法简介 make命令会根据Makefile的内容对项目进 行管理。make能自动确定哪一个模块被修 改了,然后再进行统一、无遗漏的编译。 最后实现项目或软件包的管理工作。 make的用法为: mak

21、e -f options targets make的常用参数 -C dir:在读:在读Makefile或做任何操作前切换目录,或做任何操作前切换目录, 一般用于对目录的递归搜索一般用于对目录的递归搜索 -d:显示调试信息:显示调试信息 -f file:指定:指定file文件作为文件作为Makefile,而非使用默,而非使用默 认的认的makefile或或Makefile -I dir:指定:指定Makefile搜索目录搜索目录 -k:默认情况下:默认情况下make在遇到错误将终止执行,在遇到错误将终止执行,- k可以让在出现错误时工作的尽量长一些,以便可以让在出现错误时工作的尽量长一些,以便

22、观察分析观察分析 -n:让:让make在不真正编译的情况下列出将执行在不真正编译的情况下列出将执行 的步骤的步骤 11.6.2 Makefile文件 Makefile文件的内容是描述项目或软件(包) 中的模块之间的相互依赖关系以及目标文件、 可执行程序产生时要执行的命令等。 Makefile文件可认为是一个工程规划文件。 传统Unix使用的是Makefile,现在也可使用 makefile (1)Makefile文件包含的5类内容 显式规则:显式告诉make如何编译或构造一个目标 隐式规则:隐式的通过变量或规则告诉make如何编 译或构造一个目标 变量定义:在Makefile中可以像shell

23、编程一样定义和 使用变量 命令:定义完成某任务所使用的shell命令 注释:#开始的部分。意义同shell编程 规则的定义 规则中的项目定义必须从最左边开始,一个 规则中的第二行以后的行必须以tab健开始。 规则的格式如下: targets :prerequisites commands 或 targets :prerequisites;commands commands (2) Makefile文件中的常用符号 $:目标名 $*:删除了后缀的目标名 $%:当目标是库文件时,目标内的成员名。 例如目标x.a(y.o)的目标名为x.a,成员名为y.o $:由空格分隔的目标中所有成员 $?:目标中

24、的变化成员 $:当前目标的第一个相关成员名 Makefile文件中的符号“%” %可以理解为统配符。可使用它定义或 重定义模式规则。 例如: %.o:%.c cc c $ 定义了一个规则: 所有目标文件*.o依赖C语言源程序*.c; 且生成方法为cc -c $ 。 Makefile文件中的符号“=”或“:=” 符号“=”或“:=”用于修改已经定义的变量 或在已定义变量的基础上定义新变量。 例如 已知:var1 = a.c b.c c.c 则var2 = $(var1:.c=.o) 定义var2 =a.o b.o c.o 而var1 += d.c 重定义var1,其值为var1 = a.c b.

25、c c.c d.c “:=”与“=”的区别 “:=”与“=”是有区别的。 当使用“=”时,变量将做递归或扩展 “:=”只作简单替换。 11.6.3 make的用法简介 Makefile文件内容可包含多个目标,可以通 过make obj的方式指定处理的目标,若不指 定则默认为第一个。 为了方便的使用Makefile文件对整个项目进 行编译,可在Makefile文件内设一个代表整 个项目的目标,一般为all。 Makefile中的常用目标 有时为了对项目进行管理还要设置有clean、 install和uninstall目标: clean:用于对项目环境进行准备,清除已 经生成的目标文件等以便重新编

26、译; install:用于对整个项目的成品进行安装; uninstall:则是用于对安装的项目进行卸载。 11.6.4 Makefile示例 1. 多模块项目编译示例 2. 多模块项目共享库编译与使用示例 1. 多模块项目编译示例 在11.4.1引例中有三个模块,它们分别是 f1.c,f2.c和f3.c,它们之间的关系如下图 项目编译过程分析 按照gcc的工作过程,对模块的编译和链接过 程可分为: (1)生成目标代码 gcc -c f1.c gcc -c f2.c gcc -c f3.c (2) 生成可执行程序 gcc -o f f1.o f2.o f3.o Makefile内容 f: f1.

27、o f2.o f3.o gcc -o f f1.o f2.o f3.o f1.o: f1.c gcc c f1.c f2.o: f2.c gcc c f2.c f3.o: f3.c gcc c f3.c Makefile的使用 有了Makefile文件,可以使用make命令对 此项目进行编译。编译方法为: make 或 make f 若要编译单个项目,比方说f1.o,可以使 用以下方法: make f1.o 增加all、clean和install目标的Makefile all : f#make all to build f f : f1.o f2.o f3.o gcc -o f f1.o f2

28、.o f3.o f1.o: f1.c gcc c f1.c f2.o: f2.c gcc c f2.c f3.o: f3.c gcc c f3.c clean: rm f f?.o #make all and install f to /usr/bin with permission 755 install: all install m 755 /usr/local/bin 2. 多模块项目共享库编译与使用示例 设11.5.1共享库创建和11.5.2共享库使用 的Makefile文件分别由so.mk和so.use来实 现。 so.mk的内容 SRC = f1.c f2.c#定义源文件 TGT

29、= $(SRC:.c=.o)#定义目标文件 all : libmy.so#定义all目标 %.o : %.c#定义目标文件生成规 则 cc -c $#目标文件生成命令 libmy.so : $(TGT)#定义共享库生成规则 cc -shared -o $ $(TGT) #共享库生成命令 clean:#定义清理目标 rm -f $(TGT)#清理目标目标措施 so.use的内容 all : mydy SRC = f3.c TGT = $(SRC:.c=.o) %.o : %.c cc -c $ mydy: $(TGT) cc -o $ $(TGT) -ldl clean: rm -f $(TGT

30、) Makefile的使用 生成目标文件可使用命令 make all f so.mk 必要时可先运行 make clean -f so.mk 使用共享库编译可使用命令 make all -f so.use 11.7 调试器gdb 11.7.1 gdb功能 监视或修改程序中变量的值 设置断点以使程序在指定的代码行上暂 停执行 单步执行或程序跟踪 11.7.2 gdb 基本命令 break:在代码里设置断点 run:执行当前被调试的程序 bt:反向跟踪,显示程序堆栈 quit:退出gdb c:继续break后的执行 watch: 监视一个变量的值而不管它何时被 改变 file装入想要调试的可执行文

31、件 set:设置变量的值 gdb 基本命令(续) kill:终止正在调试的程序 shell:在gdb内执行shell命令 list:列出产生执行文件的源代码的一部分 print:显示变量或表达式的值 next:执行一行源代码但不进入函数内部 where:显示程序当前的调用栈 step:执行一行源代码而且进入函数内部 11.7.3 程序调试方法 下面以11.4.1引例为例,介绍Linux系统内 程序调试的基本方法。 1. 编译时使用调试参数-g cc -g -o myp f1.c f2.c f3.c 2. 启动gdb gdb myp 3. 查看源文件 (gdb) list 4. 设置断点 (gd

32、b) break 6 Breakpoint 1 * , line 6 5. 开始执行 (gdb) run Breakpoint 1, main() at f3.c:6 6f2(Test String); 6. 打印变量的值 (gdb) print tmpi $1 = 16 7. 单步执行,跟踪进入函数f1(也使用next命令 执行f1,而不进入函数f1) (gdb) step f1 (arg=16) at f1.c:3 3 printf(”F1: you passed %dn”,arg); 8. 显示f1()变量arg的值 (gdb) print arg $2 arg = 16 9. 可在任何

33、位置使用where命令,显示程序的调 用栈,而得到自己位置。方法是: (gdb) where 10. 列当前文件的内容 (gdb) list 11. 程序继续执行直到程序结束 (gdb) continue 11.8 UNIX/Linux其它编程工具简介 11.8.1 常用库与GNOME/GTK开发 11.8.2 KDevelop/Qt开发 11.8.3 Java开发 11.8.4 Delphi开发 11.8.5 Perl开发 11.8.6 数据库开发 11.8.7 PHP开发 11.8.1 常用库与GNOME/GTK开发 1. XLIB 2. GLIB 3. GDK 4. GTK 5. GNO

34、ME 11.8.2 KDevelop/Qt开发 KDevelop是一个基于GPL的集成开发环境 (IDE),提供有可以产生Qt图形界面的资 源编辑程序。具有编辑、编译、链接、排 错、版本管理及计划管理等基本功能。 Red Hat Linux 9自带有KDevelop开发集成环 境。 用户可以通过“开始”“编 程”“KDevelop”打开操作界面 11.8.3 Java开发 在Linux系统中可有多种方法进行Java开 发,常用的有Eclipse集成开发平台和Java SDK开发环境。 11.8.4 Delphi开发 Kylix是Borland公司正式发布的用于Delphi开 发的集成环境,是目

35、前Linux平台上的完整 的快速应用程序开发(RAD)工具。 Kylix在数据库开发方面几乎支持目前所有 的流行数据库,比如Oracle、Infomix、DB2、 MySql和PostgreSql等。 Kylix是商业软件,用户只有签署许可证协 议,并付费后才能使用该软件。 11.8.5 Perl开发 Perl是开源的 Perl是一种易学易用语言,具有高级语言的 强大功能和灵活性。 Perl是一种脚本语言,由解释器perl执行, 在Red Hat Linux 9中它是/usr/bin/perl。 Perl脚本的执行,需要perl软件包的支持, 在Red Hat Linux 9中包名为perl-

36、5.8.0-88, 用户可在系统安装时安装,也可在系统扩 充时安装。 11.8.6 数据库开发 在Linux系统中可以使用数据库的选择较 多,其中mSQL、MySQL和PostgreSQL 是三个最流行的、开源的和基于SQL的 数据库。 11.8.7 PHP开发 PHP(Personal Home Page)是一种跨平 台的在服务器端执行的脚本语言,可以 Windows、UNIX/Linux系统上运行 。 PHP是免费软件,用户从网站http:/中得 到所需的版本。 Unix环境下的用户接口设计模式 Unix有几种竞争的接口风格,显得有点乱,但存在 即是合理:它们为不同的情形而优化。通过理解任

37、 务和接口风格之间的配合,用户将会学习到如何为 自己的工作选择正确的风格。 1 用户接口设计两个主题 在Unix接口设计的传统中,我们会反复涉及两个主 题。 与其它程序通讯方式的前瞻性设计 最小立异原则。 借助互助式的组合使用,Unix程序可以发挥 更大的威力。 接口设计中的“其它程序”部分并不是一个事后追 加的考虑或边角情况,相反这是一个核心挑战问题, 需要同人类用户的接口需求进行权衡和集成。 2 Unix程序获得输入和命令的途径 有些Unix程序是图形的,有些拥有面向屏幕的字符 接口,而有些使用从机械电传打字机时代遗留的、 简单生硬的文本过滤器设计。对于一个没经验的人 来说,常常很难看出为

38、什么给定的程序使用某一风 格,为什么Unix支持这么多的接口风格。 程序标准输入端的数据和命令。 IPC的输入,比如X server事件和网络消息。 已知位置的文件和设备(比如由程序传递的或计算的数据 文件名)。 程序能够以完全同样的方式发布结果(输出到标准 输出)。 3 最小立异原则的应用 最小立异原则:“少来标新立异”,是所有接口设计中 的通用原则,且并非仅局限于软件设计。接口设计的标 新立异,往往把注意力牵到了接口本身,却忽视了其所 属的任务。 因此,为了设计可用的接口,最好避免设计一个全新的 接口模型。“新颖”会给用户带来学习负担,所以能少 则少。相反,应该仔细考虑用户群体的经验和知识

39、,应 该尝试去发现那些用户已知程序同自己程序之间的功能 相似性。然后效仿己知接口的相关部分。 最小立异原则不应被理解为在设计中号召机械的保守主 义。新颖性提高了用户与接口最初几次的交互成本,但 是糟糕的设计永远使得接口令人痛苦而多余。 4 Unix接口设计的历史 Unix的出现远在现代倾向图形密集型的软件接口设计之 前。在1969年Unix诞生后的十年里,在电传打字机和文 本模式哑终端上的命令行接口(CLI)就是标准。 1980年后,Unix逐渐支持在字符阵列终端的屏幕绘图。 程序开始混合命令行和可视接口。 到了1980年代中期,整个计算机世界开始吸收施乐 (Xerox) Palo Alto研

40、究中心从1970年代早期就开始研究的 图形用户接口(GUI)的开拓性工作结果。 1987年左右,X window系统打败了几个早期的竞争者和 原型成果,成为Unix的标准图形接口。 自1990年代中期,X在最低端的个人Unix机器上已经普 遍存在。Unix文本模式终端的使用,快速地消亡并似乎 走向绝灭。而Unix古老的CLI设计传统仍然相当有生命 力并在许多领域同X卓有成效地竞争着。 5 接口设计评估 对一个项目作出设计决定,重要的是应该知道如何挑选 一个(或组合多个)适合程序应用和受众群体的接口风格。 可用五种标准对接口风格进行分类和评估: 简洁:是指一个事务处理需要的动作时间及复杂度有较低

41、的 上限(如击键量、鼠标手势量和需要多少秒的注意力等)。简洁 接口会以相对较少的比特或状态变化包装更多的作用效果。 表现力:是指接口可以触发相当广泛的行为。最具表现力的 接口可以启动程序设计者没有预见的行为组合,并仍然给予 用户有用和一致的结果。 易用:为了使用接口,用户需要特别记忆多少东西(命令,鼠 标手势,原语概念)。易用性同要求用户记忆的东西成反比。 透明:是指用户在使用时,几乎没有什么(数据、程序的相 关状态等)需要记忆。一个高度透明的接口,对于用户动作 的效果,能够自然地给出中间结果、有用反馈和错误通知。 脚本化能力:脚本能力,是指接口能够容易地为其它程序所 使用。可脚本化的程序通常

42、被其它程序作为组件使用。 6 CLI和可视接口之间的权衡 早期Unix的CLI风格,其效用仍得以保留,原因有2: 比GUI更具表现力,尤其是针对复杂的任务。 脚本化能力强;通常(但并不总是)CLI在简洁性上也占据优势。 当然了,CLI风格的劣势在于,几乎总是需要费劲地记 忆(易用性低),并且透明度通常也很低。多数人(尤其是 非技术型最终用户)认为这种接口相对神秘、难以学习。 随着用户变得越来越熟练,对CLI接口的抵触也越来越 少。在许多问题定义域上,用户(特别是常用的用户)往 往会达到一个交叉点,CLI的简要性和表达力变得要比 避免记忆负担更有价值。这样,计算机初学者倾向于易 用的GUI桌面,

43、而老手常常逐渐发现他们更愿意在shell 中键入命令。 7 透明、表现力和可配置 Unix程序员继承了一个强烈的偏爱,愿意使接 口富有表现力和可配置。 并且更愿意牺牲易用 性来换取这些品质。 关于为非技术型终端用户设计接口是一个要求 颇高的艺术,而Unix程序员通常不擅长于这方 面的传统。但是拥有从Unix传统讨论中已经揭 示出来的思想,可以给出一个强力而有用的表 述:当人们说一个用户接口是直观的,他们的 意思是(a)它是可显的,(b)用法是透明的,(c)遵 循最小立异原则。在这三条原则中,最小立异 原则是最弱的约束。 8 Unix接口设计模式 在Unix传统中,已经形成了良好的接口 设计模式

44、,可以完成以上讨论的权衡。 过滤器模式; Cantrip模式; 源模式; 接收器模式; 编译器模式; ed模式; Roguelike模式。 1)过滤器模式 与Unix相关的最经典的接口设计模式非过滤器莫属。 “过滤器”确实历史悠久,在管道出现的时候就有了。 过滤器程序接受标准输入的数据,转换成某种格式后, 再将结果发送到标准输出端。过滤器不是交互的;也许 会查询启动环境,并且通常由由命令行选项控制,但并 不要求用户在输入流中输入命令或给出反馈。 过滤器两个经典的例子是tr和grep。 当定义过滤器时,最好在心中牢记一些附带的原则 : 1.牢记Postol原则:宽进严出。 2.在过滤时,不需要的

45、信息也决不丢弃。 3.在过滤时,绝不增加无用数据。 2)Cantrip模式 Cantrip接口设计模式是其中最简单的。没有 输入,没有输出,只被调用一次,产生退出 状态数值。 一个cantrip程序的行为只能由启动条件来控 制。 没有任何程序会比这种方式更具备脚本能力。 经典例子是clear、rm、touch和startx 3)源模式 “源”是一种类似过滤器的程序,不需要输 入;它的输出只能在启动条件中控制。 例证程序是ls,who和ps等。 4)接收器模式 接收器是一种类似过滤器的程序,只接 纳标准输入而不发送任何东西到标准输 出。同样,它对输入端数据的作用行为 只能在启动条件中控制。 常见

46、示例有:lpr和mail等。 5)编译器模式 一个类似编译器的程序从命令行接受文件或 资源名,以某种方式转换这些资源,然后再 以改变后的名字输出。类似编译器的程序既 无标准输出也无标准输入;然而它们会将错 误信息发送到标准错误端。 实例程序有:cc,gif2png,gzip和gunzip等。 6) ed模式 ed是Unix系统中最简单的交互设计模式的行 编辑器。ed程序需要一个文件名作为参数; 然后可以修改该文件。在输入端,它接受命 令行。一些命令的结果输出到标准输出端, 作为与程序对话的一个部分,可以立即为用 户所见。 在Unix传统中,最简单的交互设计模式以 Unix的行编辑器ed程序作为代表,其他这种 模式的例子包括ftp、sh和gdb等。 ed是Unix其它编辑器,比如vi、sed等,的基 础。 7)Roguelike模式 Roguelike模式的名字来自这种模式的第一个例子:BSD 下的地牢探险游戏rogue,以后类似的程序就称为是 Roguelike的。 Roguelike程序是设计来运行在系统控制台、X终端模拟 器或视频显示终端上的游戏,使用全屏幕、支持可视界

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论