请给我解释下 计算机软件的可移植性 是什么意思 它的原理是什么?举例子可以吗?
可移植性一般分为两种:软件可移植性,硬件可移植性。
软件可移植性是指代码可以在不同平台间移植,硬件移植性是指在不同硬件间(如不同构架的CPU)移植。
我们一般说的软件的可移植性指的是软件可移植性,简单的说就是指源代码到不同的平台下(不同的操作系统,例如从Windows下移到Linux下)时,需要修改的内容越少,移植性越好。
如果是编译好的程序那就谈不上移植性了,它是不可能跨平台运行的。
要保证软件可移植性,就是少用或不用系统特有的东西,比如你用C语言编程,你可以使用C语言本身的库,但不要用WindowsAPI函数,因为WindowsAPI函数在Linux下是没有的,如果想移植到Linux平台下,使用WindowsAPI函数的部分代码就要做出修改了。
可移植性并不是指所写的程序不作修改就可以在任何计算机上运行,而是指当条件有变化时,程序无需作很多修改就可运行。
你不要把“我不会遇到这种情况”这句话说得太早。直到MS—Windows出现之前,许多MS—DOS程序员还不怎么关心可移植性问题。然后,突然之间,他们的程序不得不在一个看起来不同的操作系统上运行。当Power PC流行起来后,Mac机的程序员不得不去应付一个新的处理器。任何一个在同版本的UNIX下维护过程序的人所了解的可移植性的知识,恐怕都足以写成一本书,更别说写成一章了。
假设你用基本ALBATR—OS(Anti-lock Braking and Tire Rotation operating system)的Tucker C来编写防抱死刹车软件,这听起来好象是一个最典型的不可移植软件。即便如此,可移植性仍然很重要:你可能需要把它从Tucker C的7.55c版本升级到8.O版本,或者从ALBATR—OS的3.o版本升级到3.2a版本,以修改软件中的某些错误;你也可能会出于仿真测试或宣传的目的,而把它(或其中一部分)移植到MS-Windows或UNIX工作站上;更为可能的是,在它尚未最终完工之前,你会把它从一个程序员手中交到另一个程序员手中。
可移植性的本意是按照意料之中的方式做事情,其目的不在于简化编译程序的工作,而在于使改写(重写!)程序的工作变得容易。如果你就是接过别人的程序的“倒霉蛋”,那么原程序中的每一处出乎意料之外的地方都会花去你的时间,并且将来可能会引起微妙的错误。如果你是原程序的编写者,你应该注意不要使你的程序中出现出乎接手者意料之外的代码。你应该尽量使程序容易理解,这样就不会有人抱怨你的程序难懂了。此外,几个月以后,下一个“倒霉蛋”
很可能就会是你自己了,而这时你可能已经忘记了当初为什么用这样复杂的一种方式来写一个for循环。
使程序可移植的本质非常简单:如果做某些事情有一种既简单又标准的方法,就按这种方法做。
使程序可移植的第一步就是使用标准库函数,并且把它们和ANSI/ISO C标准中定义的头文件放在一起使用,详见第11章“标准库函数”。
第二步是尽可能使所写的程序适用于所有的编译程序,而不是仅仅适用于你现在所使用的编译程序。如果你的手册提醒你某种功能或某个函数是你的编译程序或某些编译程序所特有的。你就应该谨慎地使用它。有许多关于c语言编程的好书中都提出了一些关于如何保持良好的可移植性的建议。特别地,当你不清楚某个东西是否会起作用时,不要马上写一个测试程序来看看你的编译程序是否会接受它,因为即使这个版本的编译程序接受它,也不能说明这个程序就有很好的可移植性(C++程序员比c程序员应该更重视这个问题)。此外,小的测试程序很可能会漏掉要测试的性能或问题的某些方面。
第三步是把不可移植的代码分离出来。如果你无法确定某段程序是否可移植,你就应该尽快注释出这一点。如果有一些大的程序段(整个函数或更多)依赖于它们的运行环境或编译方式,你就应该把其中不可移植的代码分离到一些独立的“.c”文件中。如果只在一些小的程序段中存在可移植性问题,你可以使用#ifdef预处理指令。例如,在MS-DOS中文件名的形式为“\tools\readme”,而在UNIX中文件名的形式为“/tools/readme”。如果你的程序需要把这样的
文件名分解为独立的部分,你就需要查找正确的分隔符。如果有这样一段代码
#ifdef unix
#define FILE_SEP_CHAR/
#endif
#ifdef __MSDOS__
define FILE SEP CHAR\\
#endif
你就可以通过把FILE_SEP_CHAR传递给strchr()或strtok()来找出文件名中的路径部分。尽管这一步还无法找出一个MS-DOS文件的驱动器名,但它已经是一个正确的开头了。
最后,找出潜在的可移植性问题的最好方法之一就是请别人来查找!如果可以的话,最好请别人来检查一下你的程序。他或许知道一些你不知道的东西,或许能发现一些你从未想过的问题(有些名称中含"lint"的工具和有些编译程序选项可以帮助你找出一些问题,但你不要指望它们能找出大的问题)。
童邰麦安: 可移植性一般分为两种:软件可移植性,硬件可移植性. 软件可移植性是指代码可以在不同平台间移植,硬件移植性是指在不同硬件间(如不同构架的CPU)移植. 我们一般说的软件的可移植性指的是软件可移植性,简单的说就是指源代码到...
巴塘县18845715379: C语言中,可移植性是什么意思啊? - ?
童邰麦安: 可移植性并不是指所写的程序不作修改就可以在任何计算机上运行,而是指当条件有变化时,程序无需作很多修改就可运行. 你不要把“我不会遇到这种情况”这句话说得太早.直到MS—Windows出现之前,许多MS—DOS程序员还不怎么关...
巴塘县18845715379: 解释语言和编译语言有什么区别?可移植性是什么意思? - ?
童邰麦安: 编译型语言和解释型语言的区别:解释性语言在运行程序的时候才翻译,比如解释性basic语言,专门有一个解释器能够直接执行basic程序,每个语句都是执行的时候才翻译.这样解释性语言每执行一次就要翻译一次,效率比较低.编译型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高. 可移植性软件可移植性指与软件从某一环境转移到另一环境下的难易程度
巴塘县18845715379: C语言的移植性好?什么是C语言的移植性? - ?
童邰麦安: 可移植性 指 源程序 可以用到 另一台机上,编译后能正确运行. 移植性高,指 源程序 不需改动或只需稍加改动,就能编译后正确运行. 也有人理解,可移植性包括可翻译性,例如,通过翻译程序翻译,或解释程序解释,就能在另一台机上(另...
巴塘县18845715379: JAVA可移植性广泛应用情况是什么? ?
童邰麦安: Java认证:JAVA可移植性广泛应用.软件可移植性指与软件从某一环境转移到另一环境下的难易程度.为获得较高的可移植性,在设计过程中常采用通用的程序设计语言...
巴塘县18845715379: 怎么实现软件的可移植性呢? ?
童邰麦安: 请采纳我的答案. 为了实现软件的可移植性,可用以下方法:模拟:用软件方法在一台现有的计算机上实现另一台计算机的指令系统,这种用实际存在的机器语言解释实现软件移植的方法就是模拟
巴塘县18845715379: 跪求Java高手帮忙 可移植性 安全性 j2ee - ?
童邰麦安: ····可移植性的原因是,Java有一个虚拟机,他不是在机器是直接执行的.他就像同一个银行不同的ATM机,虽然有可能不同的ATM有不同的运作方式,但是无论在哪个ATM上都能取到钱.Java是安全的,这主要体现在它没有指针方面,...
巴塘县18845715379: C语言有什么特点? - ?
童邰麦安: 1 c语言具有语法简洁的特点,相信用过其他语言的人都知道 2 运算符丰富,夺得我有时后都分不清 3 数据结构类型丰富 4 结构化,就是想一小块一小块的程序,这样写起来容易 5 语法要求不严格,这样的话相对容易一些,但有时喉也不爽,有...