Answers:
仅仅是用C编写的源代码是可移植的,而不是可执行文件?
正确。有人称它写一次,到处编译。
http://en.wikipedia.org/wiki/Write_once,_compile_anywhere。
另一种选择是一次写入,到处运行。Java是一个很好的例子。
http://en.wikipedia.org/wiki/Write_once,_run_anywhere
即使可以实现部分跨平台可移植性,也永远不要指望代码无需修改即可在任何地方运行。
这不仅是特定于ISA的。例如,您问:
x86的应用程序与Apple的应用程序分开吗?
是的,即使苹果使用x86硬件,也可以。C二进制文件特定于体系结构和操作系统。
仅仅是用C编写的源代码是可移植的,而不是可执行文件?
究竟。您需要在每个平台上重新编译C程序。C编译器生成的机器代码在具有相同处理器/内存体系结构的机器和OS之间的可移植性非常有限。这就是为什么您会看到多平台应用程序(例如浏览器)的不同二进制分发版本的原因,例如“ Linux 64位Intel”或“ Mac OS X 32位PowerPC”(好的,最后一个只是一个例子,我知道Apple已将几年前到英特尔:-)。
大多数问题已得到解答,但我想补充一点,那就是耐用性是您可能要考虑的另一件事。
例如,JAVA可以编写一次,并且可以在VM所在的任何平台上运行(今天称为“运行时环境”)。但另一个优点是,您可以在2011年的计算机上运行1995年以来的Java 1.1代码。如果您的代码是在i386上编译的,而您尝试在AMD64体系结构上运行它,那是不可能的。
您还将获得虚拟机本身的改进。
然后,我要说的是,通常,从可移植性最低的语言到可移植性更高的语言:汇编器,低级编译语言(例如C),C ++,解释型语言或在虚拟机中运行的语言。
我并不是Java的捍卫者,至少不是语言或社区方面的捍卫者,但是如果您正在寻找可移植性以及与C相比性能损失最小的方法,那么这就是我要走的路。
“可移植性”具有多种含义。对于C而言,其含义如下:
编译器已经为各种硬件和操作系统平台的C实现了编译器,这在20世纪70年代初是一个大问题。
语言本身有一个公认的标准,而不是每个编译器实现都认可该语言的变体(同样,第一次设计C时,这很重要,因为Pascal和BASIC等语言有多种变体)没有得到普遍认可的东西);
由于该标准,在不同平台上编译时,一致的代码将产生相同的行为。
的源代码是便携式的,但是一个新的二进制具有用于每个目标产生。
但是请注意,C源极难“轻而易举”地移植。大多数应用程序要求您使用特定平台特有的扩展名,超越语言标准定义的范围,因此实际上源代码不是100%可移植的。
但是请注意,C的确在很大程度上取决于实现。各种数据类型的确切大小,溢出行为等,都取决于实现方式;该标准提供了实现必须符合的最低要求,但是实现可以自由地超出那些限制。
无论ISA是什么,C都不是ISA特有的。我认为您不是指PC扩展卡现在已过时的插槽。
有用于许多平台的符合标准的C编译器,并且只要您在源代码中使用完全由标准定义的语言功能,就应该能够在针对任何平台的任何C编译器上对其进行编译。
但是,一个陷阱是C标准将许多功能行为保留为实现定义或未定义的行为。这样做是为了使C语言更普遍地用于低级编程,避免了某些精确定义的行为与某些平台上的硬件支持不匹配的情况。但是,这确实使编写可移植程序变得更加困难。
而且,与某些语言不同,C没有提供Java或C#提供的那种巨大的库。您可以得到非常轻便的库来执行几乎所有事情,但是您必须做一些工作来构建它们并使它们一起工作。
C确实有一个标准库,但是与Java,C#,Python等相比,它的范围相对有限。