回答:
Cで書かれたソースコードだけが実行可能ファイルではなく移植可能であるということですか?
正しい。一部の人々はそれを一度書いて、どこでもコンパイルすると呼びます。
http://en.wikipedia.org/wiki/Write_once,_compile_anywhere。
もう1つの方法は、一度書き込み、どこでも実行することです。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」などのマルチプラットフォームアプリ(ブラウザなど)のさまざまなバイナリディストリビューションが表示されます(OK、最後の1つは単なる例であり、Appleが切り替えたのは知っています)数年前にインテルに:-)。
質問のほとんどは答えられていますが、耐久性はあなたが考慮に入れなければならないかもしれないもう一つのことではありません。
たとえば、JAVAは一度記述すれば、VMがインストールされている任意のプラットフォームで実行できます(現在、「ランタイム環境」と呼ばれています)。ただし、もう1つの利点は、1995年のJava 1.1コードを2011マシンで実行できることです。コードがi386でコンパイルされていて、AMD64アーキテクチャで実行しようとした場合、これは不可能です。
仮想マシン自体の改善も得られます。
次に、一般的に、移植性の低い言語から移植性の高い言語へと進みます。アセンブラ、Cなどの低レベルのコンパイル言語、次にC ++、次にインタープリター型言語、または仮想マシン内で実行される言語。
私は実際にはJavaの擁護者ではありません。少なくとも言語やコミュニティなどではそうではありませんが、Cと比較して移植性とパフォーマンスの低下を最小限に抑えたい場合は、この方法が適しています。
どこかで一度コンパイルすると、書き込みに関する良い答えが得られます。
Cは人気があり、Cコンパイラが将来のターゲットプラットフォームで利用できる可能性が高いため、Cを移植可能な言語として考えるのが好きです。別の要因は、プラットフォームに依存しない方法で一般的なプログラミングタスクを支援する標準ライブラリです。
したがって、言語の移植性は次の要素によって決定されます。
現実的には、ほとんどすべての複雑なCアプリケーションは、ハードウェアまたはオペレーティングシステムの依存関係のために、新しいプラットフォームに移行するためにいくつかの作業を必要とします。このプロセスは移植と呼ばれます。
「移植性」には複数の意味があります。Cに関しては、次のことを意味します。
コンパイラーは、さまざまなハードウェアおよびオペレーティングシステムプラットフォーム用のC用に実装されています。これは、70年代初頭には大きな問題でした。
各コンパイラの実装が言語のわずかに異なるバリアントを認識するのとは対照的に、PascalやBASICなどの言語の複数のバリアントがあったため、Cが最初に設計されたときのビッグディール普遍的に認識されていない);
この標準のため、異なるプラットフォームでコンパイルした場合、適合コードは同じ動作を生成します。
ソースコードは、携帯型であるが、新しいバイナリは、各ターゲットのために生成されなければなりません。
ただし、Cソースが「自明」に移植できることはめったにありません。ほとんどのアプリケーションでは、特定のプラットフォームに固有の拡張機能を使用して、言語標準で定義されているものを超える必要があるため、実際にはソースコードは100%移植可能ではありません。
ただし、Cは実装にかなりの部分を残していることに注意してください。さまざまなデータ型の正確なサイズ、オーバーフロー時の動作などは、すべて実装次第です。標準は、実装が準拠しなければならない最小要件を提供しますが、実装はそれらの制限を超えて自由です。
ISAが何であれ、CはISA固有ではありません。PC拡張カード用の現在廃止されたスロットを参照しているのではないと思います。
非常に多くのプラットフォームに標準に準拠したCコンパイラがあり、ソースコードで完全に標準で定義された言語機能を使用している限り、任意のプラットフォームの任意のCコンパイラでコンパイルできます。
ただし、C標準では、実装の定義済みまたは未定義の動作として、機能の多くの動作が残されるという欠点があります。これは、C言語を低レベルのプログラミングでより一般的に使用できるようにするために行われ、正確に定義された動作が一部のプラットフォームでハードウェアがサポートするものと一致しないケースを回避します。ただし、移植可能なプログラムを作成するのは少し難しくなります。
また、一部の言語とは異なり、CにはJavaまたはC#が提供する種類の巨大なライブラリが付属していません。非常に移植性の高いライブラリを入手して、ほぼすべてのことを実行できますが、それらを構築して連携させるには、いくつかの作業を行う必要があります。
もちろんCには標準ライブラリがありますが、その範囲はJava、C#、Pythonなどと比較して比較的制限されています。